User Threads and Kernel Threads
유저 스레드- user-level 스레드 라이브러리에서 관리. 주요 라이브러리는: POXIS Pthreads, Windows threads, Java threads
커널 스레드- 커널의 지원. Windows, Solaris, Linux, Max OS X와 같은 운영체제들
유저 스레드와 커널 스레드 사이의 멀티스레드 모델: Many-to-One, One-to-One, Many-to-Many
Many-to-One Model
many user 스레드가 single kernel 스레드와 연결
하나의 스레드 blocking은 모두 block된다.
One-to-One Model
user 스레드를 생성하면 kernel 스레드가 생성된다.
many-to-one에 비해 concurrency가 높다.
ex) Windows, Linux, Solaris 9~
Many-to-Many Model
여러 user 스레드들이 그보다 더 적은 수의 kernel 스레드와 매핑된다.
OS가 충분한 수의 kernel 스레드를 생성하도록 한다.
그리고 원하는 수 만큼의 user 스레드들을 생성하여
kernel 스레드가 LWP(Light Weight Process)에서 병렬로 수행될 수 있다.
*LWP(Light Weight Process): 유저와 커널 스레드 사이의 다중 처리기 (가상 프로세서로 유저스레드 위의 프로세스를 스케줄링한다). 각 LWP는 커널 스레드에 붙어있다.
Two-level Model
Many-to-Many 모델과 비슷하지만, 하나의 user 스레드가 하나의 kernel 스레드에 대응하는 예외를 가진다.
그래서 M:M과 1:1의 믹스 버전.
Implicit Threading
개발자가 아니라 컴파일러와 런타임 라이브러리들이 스레드 생성과 관리를 맡는다.
세 가지 대표 방법: Thread Pools, OpenMP, Grand Central Dispatch
Thread Pools
작업을 기다릴 수 있는 여러 스레드들의 풀을 만든다.
장점: 매번 새 스레드 생성보다 속도가 빠르다.
OpenMP
#pragma omp parallel 이 키워드다.
키워드가 나온 블록은 스레드를 이용해 병렬 처리한다.
#pragma omp parallel
{
printf("I am a parallel region.");
}
Grand Central Dispatch
Mac OS X와 iOS 운영체제를 위한 Apple사의 기술.
"^{}" 블록으로 implicit threading을 구현한다.
^{printf("I am a block");}
두 가지 작업 큐(dispatch queue) 구현:
-Serial: FIFO순서로 블록제거, 프로세스 당 큐, main queue라 불림.
-Concurrent: FIFO 순서로 블록제거되지만, 몇몇은 시간 걸쳐 제거된다.
'운영체제 OS' 카테고리의 다른 글
[운영체제/OS] 멀티스레드에서의 fork()와 exec(), Signal Handling (0) | 2020.12.09 |
---|---|
[운영체제/OS] User 스레드와 Kernel 스레드, Implicit Threading (0) | 2020.12.08 |
[운영체제/OS] Threads & Concurrency (0) | 2020.12.05 |
[운영체제/OS] Threads & Synchronization 스레드&동기화_Mutex Lock, Semaphore (0) | 2020.12.05 |
[운영체제/OS] Frames Allocation Algorithm, Kernel Memory Allocation (0) | 2020.12.05 |