운영체제 OS

[운영체제/OS] User 스레드와 Kernel 스레드, Implicit Threading

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 순서로 블록제거되지만, 몇몇은 시간 걸쳐 제거된다.