1. Thread
- Sequence of instruction of program : 실행의 흐름
- 프로세스로부터 execution state를 분리한 것
상태 | 원소 | 비고 |
Static state | code, global variable, heap, opened files... | Thread간 공유 |
Execution state | PC, SP, stack | Thread간 공유X |
- 사용하는 이유
1) multi core의 충분한 활용 : 하나의 프로세스는 하나의 프로세서로 mapping되기 때문
* 프로세서와 CPU는 비슷한 의미, core는 이들에 속해있는 원소라고 보면됨
2) 여러 process를 IPC하는 것은 overhead 발생 및 잦은 context-switch로 비용, 시간 관점에서 비효율적
3) 그 외 Concurrency 확보, Resource 공유, Computation과 I/O 처리의 분리로 Throughput 향상, 쉬운 concurrent event handling 등..
cf) Context-Switch
멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업을 Context Switch(Context Switching)라고 한다.
- Context는 CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들이다.
- Context는 프로세스의 PCB에 저장된다.
- Context Switching 때 해당 CPU는 아무런 일을 하지 못한다. 따라서 Context Switching이 잦아지면 오버헤드가 발생해 성능이 떨어진다.
- Context Switch를 하는 주체는 OS 스케줄러이다.
(출처: https://jeong-pro.tistory.com/93 [기본기를 쌓는 정아마추어 코딩블로그])
2. Concurrency & Parallelism
속성 | 설명 | 예시 |
Concurrency(병행성) | 여러 개의 Task를 시간에 따라 교대로 실행 | Core : T1 -> T2 -> T1 -> T2 |
Parallelism(병렬성) | 여러 개의 Task를 시간적으로 동시에 실행 | Core1 : T1 -> T2 -> T3 -> T4 Core2 : T3 -> T4 -> T1 -> T2 |
cf) 하나의 Core는 한번에 하나의 Thread만 실행할 수 있다. 따라서 병렬성은 Core가 2개 이상일 때만 확보할 수 있다.
- Type of Parallelism
1) Data Parallelism : 같은 Data를 여러 개의 subset으로 나누어 여러 개의 Core를 통해 같은 Operation 수행
2) Task Parallelism : 하나의 Data를 여러 개의 Core로 다른 Operation 수행
3. Andahl's Law
Speed Up <= 1/(S+ (1-S)/N)
4. Multi Thread Model
종류 | 설명 |
Kernel Thread | OS가 직접 관리, Scheduling의 단위, 모든 OS가 제공 |
User Thread | User-level Thread libraray가 관리, Kernel Thread 위에 존재 가능 |
1) One to One
- 각각의 User-level Thread가 각각의 Kernel Thread에 mapping
- Parallelism 확보
- 많아지면 Overhead 발생 가능
2) Many to One
- 여러 개의 User-level Thread가 하나의 Kernel Thread에 mapping
- User-level thread 사이에서 작고 빠른 context-switch
- 하나의 Thread Blocking이 모든 Thread를 Block할 수 있다
- 한번에 하나의 Thread만 실행 가능하므로 Parallel하게 실행될 수 없다.
3) Many to Many
- flexible하게 mapping
- 진정한 Parallelism 실현
4) Two level
여러 개의 모델을 동시에 사용
5. Implicit Threading
1) Thread Pool
- Pool에 실행을 기다리는 Thread를 생성해놓고 event mapping- compiler와 run-time libraray가 생성하고 관리한다.
- 필요할 때마다 create & kill하는 것보다 성능이 좋다.
- Pool은 임의 시각에 존재할 Thread 개수에 제한을 둔다.
2) Fork & Join
- main parent thread가 child thread를 생성(fork)한다- 여러 depth에 걸쳐 fork-join 관계가 형성될 수 있다.
3) OpenMP- compiler directive 사용4) GCD(grand Central Dispatch)- in Max OS X
6. Issue in Threading
1) fork() & exec()
- Thread에서 fork() 시,
속한 프로세스 내 모든 Thread들까지 duplicate 혹은 fork()를 호출한 Thread만 duplicate
2) Signal Handling
- Mutil Thread는 Signal Handler를 공유한다
- 따라서 프로세스에 Signal이 왔을 때 Thread로 어떻게 처리할지를 설계해야한다.
3) Thread Cancellation
- Thread가 Task를 완료하기 전 종료시키는 것
종류 | 설명 |
Async Cancellation | - Target Thread를 바로 종료시킨다 |
Deffered Cancellation | - Cancellation point에 도달했을 때 종료시킨다 - Target Thread는 Cancellation 명령이 왔는지 주기적으로 check |
4) TLS(Thread-local storage)
- Thread scope의 gloval variable
- 주로 errorno에 사용
5) Scheduler Activations
LWP, Up Call
7. Thread in Linux
- Linux는 Thread라는 개념 대신 Task라고 칭한다.
- 공유하는 address space가 있는 경우 같은 프로세스에 있다고 한다
'CS > OS' 카테고리의 다른 글
[OS] 7. Process Scheduling(2) (0) | 2020.11.18 |
---|---|
[OS] CPU, Processor, Core, Process, Thread 그리고 관계 정리 (0) | 2020.11.04 |
[OS] 4. 프로세스(2) (0) | 2020.11.02 |
[OS] 3. 프로세스(1) (0) | 2020.10.30 |
[OS] 2. 시스템 구조 (0) | 2020.10.28 |