CS/OS

4. 스레드 관리

🥭맹2 2021. 5. 9. 23:23

스레드 관리

  1. 스레드의 개념
  2. 스레드의 구현
    1. 사용자 수준 스레드 : `n:1모델`
    2. 커널 수준 스레드 : `1:1 모델`
    3. 혼합형 스레드 : `n:m 모델`

1. 스레드(Thread)란?

자원은 공유하지만 제어요소들은 각각 가지고 있는 것.

자원을 공유하므로 좀 더 작업을 효율적으로 할 수 있음

여러개 CPU 코어 사용 가능

  • 프로세스가 하는 일은 2가지가 있음.
    1. 자원 할당
    2. 자원 제어

-> 여기서 자원 제어 하는 것을 스레드라고 함!

하나의 프로세스에는 여러개의 스레드가 존재할 수 있다.

왜냐하면 제어는 여러개 있을 수 있으니까

  • 하나의 프로세스에는 여러 개의 스레드가 존재할 수 있다.
  • 하나의 프로세스 내에서 각각의 스레드는 리소스를 공유한다
    • 리소스에 포함 되는 것 : 코드, 전역 데이터, 힙(메모리 공간: malloc 등을 했을 때 사용되는 공간)
  • 각각의 스레드는 스레드 실행 환경 정보 (SP, SR, PC, 상태 우선순위와 같은 정보), 지역 데이터, 스택을 가지고 있다.
    • 스레드 실행 환경 정보
      • SP(Stack Pointer) : 스택 포인터
      • SR(Sequence Register) : 순서열 레지스터
      • PC(Program Counter) : 프로그램 카운터
    • 지역 데이터
      • 예를 들면, for문을 사용할 때 for (i=0; i<N; i++) 여기서 i가 지역 데이터임 (지역 데이터는 제어를 위해 사용됨)
    • 스택
      • 지역 데이터가 쌓이는 곳

스레드란 ~!

2. 스레드의 개념

스레드를 메모리 관점에서 그린 그림

  • 지운 부분은 Program counter인데 pointer라고 오타난 부분
  • program counter
    • 제어를 위한 요소, 프로그램 흐름 제어
  • 이 사진은 메모리 관점에서의 스레드이다.
    • 힙, 데이터, 코드(텍스트) 는 resource 부분
    • 그 위에 각 스레드의 작업영역이 있고, 해당 스레드마다 스택 포인터가 있음. 여기서 지역데이터를 만들어 사용함
  • Light Weight Process (LWP)라고 부름
    • 왜냐하면 프로세스인데 가벼운 프로세스니까
    • 원래 프로세스는 자원 할당과 자원 제어를 하는데, 자원을 공유하므로 원래 프로세스보다 가볍다고 하는 것임
  • 프로세서(e.g, CPU) 활용의 기본 단위
    • 스레드가 여러 개면 동시에 여러개의 CPU를 사용할 수 있음
  • 구성 요소
    • Thread ID : 말그대로 ID(신원 확인 해주는 존재)
    • Register set(PC 등) : 각각 제어를 위해 알고있어야하는 register set
    • Stack(i.e. local data) : 자기만의 작업 영역
  • 제어요소(개인적으로 가지고 있음)외 코드, 데이터 및 자원들은 프로세스의 다른 스레드들과 공유
  • 전통적 프로세스 == 단일 스레드 프로세스 (프로세스 한 개에 제어가 한 개)

1) single-thread process

제어 요소가 하나

싱글 스레드

2) multi-thread process

제어 요소가 여러 개

멀티스레드

3. 스레드의 장점

1) 사용자 응답성 (Responsiveness)

  • 일부 스레드의 처리가 지연되어도, 다른 스레드는 작업을 계속 처리 가능

2) 자원 공유 (Resource sharing)

  • 자원을 공유해서 효율성 증가 (커널의 개입을 피할 수 있음)
    • 예) 동일 address space에서 스레드 여러 개
  • context switching의 경우 커널이 개입하게 되는데 이 것은 굉장한 overhead이다. 하지만 스레드는 자원을 공유함으로써 효율성이 증가한다.

3) 경제성 (Economy)

  • 프로세스의 생성, context switch에 비해 효율적임
    • 프로세스 생성, context switching의 경우 커널의 개입이 존재하지만 스레드는 커널의 개입이 존재하지 않기 때문이다.

4) 멀티 프로세서(multi-processor) 활용

  • 병렬처리를 통해 성능 향상
    • 여러 개의 CPU를 사용함으로써 처리가 빨라진다.

4. 스레드 사용의 예

배그를 할 경우

  • 만약 단일 스레드라면?
    1. 화면이 출력되고 있음
    2. 적이 나타남
    3. 마우스를 클릭함
    4. 화면 출력이 멈춤
    5. 마우스를 멈추면 마우스 이벤트 후의 화면 출력
    6. 마이크를 사용
    7. 화면 출력 멈춤 ...
    동시 작업이 불가능해서 이런 식으로 다른 작업이 잠시 멈춘 듯한 느낌을 준다.

-> 이를 멀티 스레드로 바꾼 경우 (각각의 작업에 스레드를 만들어주면)

  • 자원은 공유하면서 작업을 동시에 처리해서 원활한 게임이 가능하다.
  • -> 사용자 응답성 높아짐 !!

5. 스레드의 구현

  1. 사용자 수준 스레드 (User threads)
  2. 커널 수준 스레드 (Kernel threads)

1) 사용자 수준 스레드 (User threads)

  • 사용자 영역의 스레드 라이브러리로 구현 됨
    • 스레드의 생성, 스케줄링 등
    • POSIX threads, Win32 threads, Java thread API 등
  • 커널은 스레드의 존재를 모름
    • 커널의 관리(개입)를 받지 않음
      • 생성 및 관리의 부하가 적음, 유연한 관리 가능
        • 커널은 개입하지 않고 라이브러리 영역에서 관리해서 오버헤드가 적고 유연하게 관리 가능
      • 이식성(portability)이 높음
        • 라이브러리만 있는 플랫폼이면 우리가 만든 스레드 사용 가능
        • (ex. 자바 버추얼 머신)
  • 커널은 프로세스 단위로 자원 할당
    • 하나의 스레드가 block 상태가 되면, 모든 스레드가 대기
    • (single-threaded kernel의 경우)

 

사용자 수준 스레드

  • 커널 수준 스레드 == 제어하기 위한 스레드
  • 스레드 제어 블록(TCB) : 스레드를 제어하기 위한 정보들

2) 커널 수준 스레드 (Kernel Threads)

  • OS(kernel)이 직접 관리
  • 커널 영역에서 스레드의 생성, 관리 수행
    • 사용자 수준의 스레드에 비해 Context switching 등 부하(Overhead)가 큼
  • 커널이 각 스레드를 개별적으로 관리
    • 프로세스 내 스레드들이 병행 수행 가능 !! (커널 스레드와 1:1 매핑 가능)
      • 하나의 스레드가 block 상태가 되어도, 다른 스레드는 계속 작업 수행 가능

커널 수준 스레드

3) 혼합형 스레드

  • 사용자 수준 스레드 : 다대일(n:1) 모델
  • 커널 수준 스레드 : 일대일(1:1) 모델
  • 혼합형 스레드 : 다대다(n:m) 모델
  • n개 사용자 수준 스레드와 m개의 커널 스레드 (n >= m)
    • 사용자는 원하는 수만큼 스레드 사용
    • 커널 스레드는 자신에게 할당된 하나의 사용자 스레드가 block 상태가 되어도, 다른 스레드 수행 가능
      • 병행 처리 가능
  • 효율적이면서도 유연함
  • 실제 OS에서 사용하는 스레드

혼합형 스레드

  • 다대다 매핑
  • 스레드 라이브러리 : 사용자 수준 스레드 관리용
  • 커널 영역에서 커널 수준 스레드는 동적으로 관리해서 하나의 스레드가 block이 되더라도 다른 스레드가 정상적으로 사용 가능하도록 만들어줌

'CS > OS' 카테고리의 다른 글

5. 프로세스 스케줄링 (2)  (0) 2021.05.10
5. 프로세스 스케줄링 (1)  (0) 2021.05.10
3. 프로세스 관리(2)  (0) 2021.05.09
3. 프로세스 관리(1)  (0) 2021.03.14
2. 운영체제 개요(3) - 운영체제의 구조, 기능  (0) 2021.03.14