본문 바로가기
CS/OS

[OS] 5. Thread

by 두둠칫 2020. 11. 3.

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