스레드 관리
- 스레드의 개념
- 스레드의 구현
- 사용자 수준 스레드 : `n:1모델`
- 커널 수준 스레드 : `1:1 모델`
- 혼합형 스레드 : `n:m 모델`
1. 스레드(Thread)란?
자원은 공유하지만 제어요소들은 각각 가지고 있는 것.
자원을 공유하므로 좀 더 작업을 효율적으로 할 수 있음
여러개 CPU 코어 사용 가능
- 프로세스가 하는 일은 2가지가 있음.
- 자원 할당
- 자원 제어
-> 여기서 자원 제어 하는 것을 스레드라고 함!
하나의 프로세스에는 여러개의 스레드가 존재할 수 있다.
왜냐하면 제어는 여러개 있을 수 있으니까
- 하나의 프로세스에는 여러 개의 스레드가 존재할 수 있다.
- 하나의 프로세스 내에서 각각의 스레드는 리소스를 공유한다
- 리소스에 포함 되는 것 : 코드, 전역 데이터, 힙(메모리 공간: malloc 등을 했을 때 사용되는 공간)
- 각각의 스레드는 스레드 실행 환경 정보 (SP, SR, PC, 상태 우선순위와 같은 정보), 지역 데이터, 스택을 가지고 있다.
- 스레드 실행 환경 정보
- SP(Stack Pointer) : 스택 포인터
- SR(Sequence Register) : 순서열 레지스터
- PC(Program Counter) : 프로그램 카운터
- 지역 데이터
- 예를 들면, for문을 사용할 때
for (i=0; i<N; i++)
여기서 i가 지역 데이터임 (지역 데이터는 제어를 위해 사용됨)
- 예를 들면, for문을 사용할 때
- 스택
- 지역 데이터가 쌓이는 곳
- 스레드 실행 환경 정보
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. 스레드 사용의 예
- 만약 단일 스레드라면?
- 화면이 출력되고 있음
- 적이 나타남
- 마우스를 클릭함
- 화면 출력이 멈춤
- 마우스를 멈추면 마우스 이벤트 후의 화면 출력
- 마이크를 사용
- 화면 출력 멈춤 ...
-> 이를 멀티 스레드로 바꾼 경우 (각각의 작업에 스레드를 만들어주면)
- 자원은 공유하면서 작업을 동시에 처리해서 원활한 게임이 가능하다.
- -> 사용자 응답성 높아짐 !!
5. 스레드의 구현
- 사용자 수준 스레드 (User threads)
- 커널 수준 스레드 (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 상태가 되어도, 다른 스레드는 계속 작업 수행 가능
- 프로세스 내 스레드들이 병행 수행 가능 !! (커널 스레드와 1:1 매핑 가능)
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 |