4.3 다중 스레드 모델 (Multithreading Models)
Amdahl's Law: CPU 코어는 무조건 많을수록 좋은가?
speedup <= 1/(S+(1-S)/N)
S: the portion that must be performed serially on a system
N: the number of processing cores
- Thread는 사용자 수준에서는 user Thread와 kernel 수준에서 사용되는 kernel thread로 제공될 수 있다.
- User Thread는 Kernel 위에서 지원되며, Kernel의 지원 없이 관리된다.
- Kernel Thread는 운영체제에 의해 직접 지원되고 관리된다.
(1) 다대일 모델 (Many-to-One Model)
- 많은 user-level Threads들을 하나의 kernel Thread로 mapping 한다.
(장점)
- Thread management는 user spcae의 thread library에 의해 행해지고, 효율적이다.
(단점)
- 하지만, 한 thread가 blocking system call을 하면 전체 process가 block 된다.
- 또한, 한 번에 한 thread만이 kernel에 접근할 수 있기 때문에 multiple thread가 multi-core system에서 병렬적으로 실행될 수 없다.
(2) 일대일 모델 (One-to-One Model)
- 각 user thread를 kernel thread로 mapping 한다.
(장점)
- 이 모델은 하나의 Thread가 blocking system call을 하더라도, 다른 thread가 실행될 수 있기 때문에 다대일 (many-to-one model) 모델보다 더 많은 병렬성을 제공한다.
- 이 모델은 multiprocessor에서 multiple thread가 병렬로 수행될 수 있다.
(단점)
- 이 모델의 단점은, user-level thread를 생성할 때 그에 따른 kernel thread를 생성해야 한다는 점이다.
- kernel thread를 생성하는 overhead가 application의 성능을 저하시킬 수 있으므로, 이 모델의 대부분의 구현은 system에 의해 지원되는 thread의 수를 제한한다.
(3) 다대다 모델 (Many-to-Many Model)
- 여러 개의 User-level thread를 그보다 작은 수 혹은, 같은 수의 kernel thread로 multiplex한다.
- kernel thread의 수는 application이나 특정 기계에 따라 결정된다.
(4) 두 수준 모델 (Two-level Model)
- Many-to-Many Model과 One-to-One Model을 결합하 모델이라고 할 수 있다.
- many-to-many 모델과 비슷한데, 특정 유저 스레드를 위한 커널 스레드를 따로 제공하는 모델을 말한다. 점유율이높아야 하는 유저 스레드를 더 빠르게 처리해줄 수 있다.
4.4 스레드 라이브러리 (Thread Library)
-
스레드 라이브러리는 프로그래머에게 thread를 생성하고 관리하기 위한 API를 제공한다.
-
Thread Library를 구현하는 데에는 크게 2가지 방법이 있다.
(1) Kernel의 지원 없이 완전히 사용자 공간에서만 라이브러리를 제공하는 방법
(2) OS에 의해 지원되는 kernel 수준에서의 library를 구현하는 방법,
-
세 종류의 Thread library가 주로 사용된다.
(1) POSIX Pthreads (2) Windwos (3) Java
4.5 암묵적 스레딩 (Implicit Threading)
- multi-core processing이 발전함에 따라, 수백 또는 수천 개의 thread를 가진 application이 등장.
- Threading의 생성과 관리 책임을 Application developer 로부터 compiler와 run-time libraries에게 넘겨주는
암묵적 스레딩(implicit threading)
을 사용하여 multi-thread application을 효율적으로 설계할 수 있다.
- 암묵적 스레딩을 사용하여 multicore processor를 활용할 수 있는 multi-thread programming을 설계하는 3가지 접근법은 다음과 같다.
(1) Thread pool (2) OpenMP (3) Grand Central Dispatch
Thread Pool
-
웹서버는 요청을 받을 때마다 그 요청을 들어주기 위해 새로운 Thread를 생성한다.
-
이 방법에는 크게 2가지 문제가 있을 수 있다.
(1) 서비스를 할 때마다 thread를 생성하는 데 일정 시간이 소요된다.
(2) 모든 요청마다 thread를 생성하므로, 동시에 실행할 수 있는 최대 thread의 수를 정해놓아야 한다.
-
Thread를 무한정 만들면 언젠가는 CPU 시간, 메모리 공간과 같은 System Resource가 고갈될 수 있다. 이런 문제를 해결할 수 있는 방법 중 하나가 thread pool
이다.
<기본 아이디어>
- 프로세스를 시작할 때 아예 일정한 수의 thread를 미리 pool로 만들어 놓는 것.
- pool이 만들어진 thread들은 일이 없을 때는 일(work)을 계속 기다리게 된다.
- 이후 Request가 들어오게 되면, pool에서 한 thread에게 해당 request를 할당한다.
- 만약 pool에 남아 있는 thread가 없다면, server는 free thread가 하나 생길 때까지 기다려야 한다.
<장점>
- 새 thread를 만들어 주는 것보다 생성된 thread를 사용하여 서비스 해 주는 것이 더 빠르다.
- thread pool은 임의의 시간에 존재할 수 있는 thread 개수에 제한을 둔다.
- task를 생성하는 방법을 분리하여, task를 일정 시간 후에 실행되도록 하거나, 주기적으로 실행시킬 수 있다.
4.6 스레드와 관련된 문제들 (Threading Issues)
4.7 운영체제 사례 (Operating-System Examples)