MultiThread Model
- 프로세스의 생성 및 컨텍스트 스위칭 부하가 크므로 Thread 사용
Thread
- CPU 스케줄링의 기본 단위이자 프로세스 내의 제어의 흐름이라고 할 수 있다.
- PC / Registers / Stack 으로 이루어져 있다.
- 각 Thread는 레지스터 상태와 Stack을 가진다.
- 프로세스 내부에서 여러 스레드가 생성될 수 있고, Code / 주소공간 / 운영체제 자원을 공유한다.
- Thread 실행 환경을 Task라고 하며, 프로세스는 기본적으로 하나의 스레드를 가진다.
- Thread의 생성 및 Switching은 프로세스에 비해 매우 부하가 적다
멀티 프로세서 혹은 멀티코어 환경
- 스레드는 다른 프로세서 혹은 멀티코어 환경에서 병렬로 실행될 수 있다.
싱글 프로세서 환경
- 한 번에 하나만 수행하고, 병렬로 실행되는 것처럼 보이도록 함
- 그렇다고 성능이 무조건 느린 것은 아니다. I/O Bound 스레드가 Block 상태가 되면, 커널이 현재 프로세스 내의 다른 스레드로 전환을 하기 때문에, 계산 속도가 향상된다.
User Level vs Kernel Level Thread
- User Level Thread
- Thread 관리가 유저레벨에서 수행됨 -> 커널은 스레드가 몇개인지도 모름
- 커널 모드 전환을 하지 않기 때문에 빠름.
- 멀티프로세서 혹은 멀티코어 환경 사용 불가
- Kernel Level Thread
- Thread가 커널레벨에서 관리됨 -> Context Switching 수행
Signal
- UNIX 시스템에서 특정 이벤트가 발생했음을 프로세스에 알리는 데 사용
- Synchronous signals
- signal을 유발하는 작업을 수행한 동일한 프로세스로 전달됨(불법 메모리 엑세스, 0으로 나누기 등)
- Asynchronous signals
- 외부 이벤트에 의해 발생(프로세스 종료(Ctrl + C같은), 등)
Thread 취소 : 스레드 실행이 정상 완료되기 전에 종료해 버리는 방법
- 비동기 취소 : 해당 스레드를 즉시 종료
- 지연 취소 : 취소해야 하는지, 그 상태를 주기적으로 체크하는 방식
Thread Pool
- 여러개의 대기 스레드를 만들어 둔다
- 장점
- 스레드를 매번 새로 만드는 것보다 이미 만들어 둔 스레드를 사용하는 것이 빠르다
- 스레드풀의 미리 만들 스레드 수를 지정할 수 있다.
- Thread Local Storage(TLS)
- 각각의 스레드는 고유한 스택을 가진다. 그래서 스택과 매개변수같은 경우 스레드 별로 고유한 메모리를 가진다. 하지만, 전역변수와 정적 변수같은 경우 프로세스 내의 모든 스레드가 공유하게 된다.
- 일반 전역 변수의 경우, 모든 스레드가 공유하므로 접근 시 race condition이 발생할 수 있다.
- TLS는 정적/전역 변수를 스레드 각각 독립적으로 메모리 공간을 만들어 주고 싶을 때 사용한다.
- 물론, 자료구조를 스레드 수만큼 생성하고 각각의 구역을 나누어 관리하는 식으로 구현해도 되겠지만, TLS를 쓰면 각각의 스레드에 귀속되므로 더 깔끔한 구조가 된다.
'OS' 카테고리의 다른 글
Context Switching에서의 Thread와 Process의 관계 + PCB, TCB (2) | 2020.05.30 |
---|---|
컴퓨터 자원의 구조와 동작, RAM과 Disk에 대해 (0) | 2020.05.26 |
[OS] 정리7 : 가상 메모리 (0) | 2018.09.27 |
[OS] 정리6 : 메모리 관리 (0) | 2018.09.26 |
[OS] System call, Interrupt, Trap, 등 (1) | 2018.09.24 |
[OS] 정리5 (0) | 2018.09.24 |
[OS] 정리4 (0) | 2018.09.24 |
[OS] 정리2 (0) | 2018.09.23 |
[OS] 정리1 (0) | 2018.09.21 |
pintos information (0) | 2014.02.13 |