해당 글은
경희대학교 조진성, 허선영 교수님의 강의 자료 및 내용을 정리한 글입니다
개인적으로 공부하며 작성된 글이라 잘못된 부분이 있을 수 있습니다!
오류가 있다면 알려주세요
Thread
↓ Process 는? ↓
Heavy-weight
address space, OS resources, Hardware execution state 등을 포함하기 때문에 새로운 process를 생성하는 것은 costly한 작업이다!
또한 여러 Process가 데이터를 공유하는 경우 massage passing, shared memory를 사용하는데 이는 구현 및 관리가 여럽고, process 사이의 context-switching이 계속해서 발생하면 성능 저하가 일어나는 문제점을 가진다.
Thread는 LWP(Light Weight Process)로 Execution state를 Process 개념에서 분리한 것이다
CPU를 사용하는 Basic Unit이며, 하나의 프로세스가 여러 core를 가지는 경우 여러개의 thread를 동시에 돌릴 수 있다
아래는 thread 생성의 예시 코드이다.
2번의 thread_create() 호출 → Main + create 2 = 총 3개의 thread가 실행된다.
이와 같은 Multi-threaded program은 성능 최적화에 중요한 역할을 수행한다!
▶ Thread의 구성
Process의 경우 각각마다의 address space, OS resources, Hardware execution state를 필요로 했다.
Thread는 공유하는 요소와 각자만의 요소를 모두 가진다
- 공유하는 요소
- Code section
- Data section: Global variable
- 그 외의 OS 자원을 공유함
- 각자 가지는 요소
- Thread ID
- Program Counter(PC): 각 thread는 독립적인 작업을 수행! 따라서 각자의 흐름으로 함수를 호출하고 실행함
- Register Set: 각자의 register를 가지므로, thread간의 context-switching이 이루어지게 됩니다
- Stack Section: 각자의 stack 공간을 가짐
▶ Thread의 장점
- Responsivencess: 한 프로세스에 의해 전체 프로세스가 Block되는 문제가 없음
- Resource Sharing: IPC보다 Global variable을 통해 데이터를 공유할 수 있어 편리함
- Economy: Process 생성보다 Thread 생성이 훨씬 저렴함
- Scalabilty: Multicore System을 효율적으로 활용할 수 있음
대부분의 kerenl이 multithread로 구현되어 있습니다.
▶ Use Case
Case01: 멀티스레드 서버 구조
클라이언트가 서버에 접속하는 경우, 서버는 이를 Handling하기 위한 thread를 생성한다.
multithreading을 통해서 여러 클라이언트가 접속을 시도하는 경우, concurrent하게 동시에 실행되도록 서버를 구현할 수 있는 것이다
Case02: Loop Parallelization on Multi-core Systems
위는 A와 B를 곱해서 C를 만들어내는 matrix multiplication이다.
이를 multithreading을 통해 부분을 나누어, 각 thread가 동시에 Parallel하게 처리하게끔 할 수 있다.
결과적으로는 $t$ 시간이 걸리는 작업을 $t/2$만에 처리할 수 있게됨
Parallelism 🆚 Concurrency
Parallelism이란, core가 2개라서 동시에 돌아가는 thread의 갯수가 2개 이상인 것을 의미함
- Data parallelism: 하는 작업은 동일하나, 수행하는 데이터를 분리하는 것
- Task parallelism: 하는 작업이 다른 것
Concurrency란, 하나의 core를 나누면서 여러 task가 수행되는 것을 의미한다.
따라서 한 시점에는 하나의 thread만이 작동함!
Multicore Processing
Single-threaded CPU의 성능 향상이 더 이상 이루어지 않게되면서 multicore가 등장하게 된다
Multi-core의 경우, 프로그래머에게 더 많은 부담을 안긴다
- Load를 어떻게 각 thread에 분배할 것인가?
- 데이터는 어떻게 나눌 것인가?
- 데이터의 의존성 관련한 문제는 어떻게?
- Testing과 debugging은?
따라서 프로그래머를 위한 여러 Threading Libraries가 존재함~
예) POSIX Pthreads, Windows threads, Java threads
▶ Amdahl's Law
Application에 core를 추가하여 성능을 향상시킨다고 할 때, 최적화가 가능한 부분은 한정되어 있다.
이에 따른 performance gain을 공식화하면 아래와 같다
예를 들어 75%는 parallel하고, 25% serial할 경우, 2개의 core를 사용하면 1.6배의 성능 향상이 이루어진다
⇒ $\frac{1}{0.25+\frac{0.75}{2}}$
Core를 무한히 증가시킬 경우에 성능 향상은 $1/S$에 수렴한다.
따라서 병렬 가능한 부분을 찾는 것이 중요함!
User & Kernel Threads
Schedular는 Kernel thread를 실행할 지를 결정하며,
User thread가 해당 thread에 mapping되어 실행된다!
어떻게 Mapping 될까?
이때 User thread는 User program에서 생성한 thread라고 이해했고,
Kernel thread는 해당 User thread가 mapping되는 논리적인 core의 수라고 생각했음
(아닐 수 있지만...)
▶ Many-to-One
여러 개의 user thread를 kernel thread로 mapping 한다
예) Solaris Green, GNU Portable
단점👎
- 하나의 thread의 문제가 전체 Thread의 block를 만들어낼 수 있음
- Core를 이용할 수 없는 문제가 발생할 수도 있기 때문에 거의 사용하지 않음
▶ One-to-One
User space에서 thread를 생성하면, kerenl 상에서도 thread를 생성한다.
예) Window, Linux
단점👎
- 생성된 Threads를 관리하는 것이 시스템에 부담이며, 어렵다
- 따라서 리눅스는 생성할 수 있는 Thread 개수에 제한을 두곤 함
▶ Many-to-Many
User level의 thread $M$개를 kernel의 $N$개 thread에 mapping하는 방법이다.
비교적 자유도가 높다는 장점이 있다.
예) Windows with the ThreadFiber package
단점👎
- 생성된 thread를 어디에 배치할 것인가 등, 구현이 쉽지 않다
Thread Libraries
위에서 언급되어 있듯, thread를 만들고 관리하는 것은 프로그래머의 몫이고 이를 위한 여러 library가 존재한다.
▶ Pthreads
thread를 생성하고 동기화하는 POSIX의 기준으로, 실제 구현이 되어 있는 것이 아니다!
이런 식으로 thread를 생성하고 관리해줍시다~ 정한 것임
UNIX 체제의 OS에서 활용된다
아래 구현 예시이다
첫 번째 parameter는 thread ID이다.
thread가 수행할 작업을 함수 형태로 구현하고, start_routine 함수 포인터로 넘겨준다
↓ 더 구체적인 코드 예시 ↓
Process의 생성 fork()와 비교한 형태이다. 비슷한 것을 확인할 수 있음!
Thread Termination 이란, thread가 완료되기 전에 종료하는 것을 의미한다
- Asynchronous cancellation : 대상 thread는 즉시 종료함
- Deferred cancellation: 종료해도 안전한 포인트(cancellation point)에만 종료할 수 있도록 함
위 유형은 미리 설정한다
cancellation을 호출하면 취소가 요청되는데, 설정 상태에 따라서 실질적으로 취소는 달라짐
Thread Cancellation의 경우도 Thread ID를 통해 처리할 수 있다
'STUDY > 운영체제' 카테고리의 다른 글
[OS] Chap06. Synchronization Tools (0) | 2023.10.16 |
---|---|
[OS] Chap05. CPU Scheduling (0) | 2023.10.10 |
[OS] Chap03. Processes (0) | 2023.10.05 |
[OS] Chap02. Operating System Structures (0) | 2023.10.05 |
[OS] Chap01. Introduction (0) | 2023.10.05 |