CS/OS

[OS] 쓰레드란? (2) - thread multiplexing, thread library, thread pool

jhkimmm 2022. 1. 4. 09:16

이전 포스팅에 이어지는 글입니다.

https://jhkimmm.tistory.com/14

 

[OS] 쓰레드란? - 쓰레드와 Parallelism/Concurrency

쓰레드란? 프로세스는 실행 중인 프로그램(text segment)이며 작업의 단위이고, 쓰레드는 프로세스 내부에 있는 일련의 Execution이며 하나의 프로세스는 하나 이상의 쓰레드를 가질 수 있습니다. 그

jhkimmm.tistory.com

유저레벨 쓰레드라고 해도 결국 실행하려면 시스템 콜을 사용해서 커널의 도움을 받아 프로세서에 할당 되어야 할텐데, 이전 포스팅에서 다룬 내용 처럼 유저 쓰레드와 커널 쓰레드가 분리되어 있다면 커널은 유저 쓰레드를 어떻게 다뤄야할까요? 여기에는 여러가지 모델이 있습니다.

Multiplexing User Thread

N-to-One Model

하나의 프로세스에 하나의 커널 쓰레드가 할당되는 모델입니다. 이 경우에 유저 쓰레드의 생성을 커널은 알 방법이 없습니다.

N-to-One 모델의 장점은 유저 쓰레드를 생성할 때 커널에 따로 알려주지 않으므로 시스템 콜을 호출하지 않아 Context switch에 따른 overhead가 없다는 점 입니다. 또한 커널에 대한 의존성도 없습니다.

단점은 커널은 한번에 하나의 쓰레드만 스케줄할 수 있으므로 유저 쓰레드는 Parallel한 실행이 불가능합니다. 게다가 프로세스가 Block되면 해당 프로세스 내부의 모든 쓰레드가 Block됩니다.

 

 

One-to-One Model

커널 쓰레드와 유저 쓰레드가 일대일로 매치되기 때문에 유저 쓰레드의 생성을 커널이 알 수 있습니다. 현재는 이 모델을 주로 사용합니다.

장점은 더 높은 Concurrency이고 이로인해 multicore CPU를 더 잘 사용할 수 있습니다.

단점은 쓰레드의 생성이 커널의 일이라서 각 쓰레드는 커널의 리소스를 사용한다는 점 입니다. 그렇기 때문에 쓰레드의 개수에 제한이 있습니다.

 

 

Many-to-Many Model

Physical한 Concurrency를 위해서는 커널 쓰레드를 사용하고 Application Concurrency를 위해서는 유저 쓰레드를 사용하는 모델 입니다.

이 모델은 유연하고 앞선 두 모델의 장점을 결합한 모델이라고 할 수 있으나 매우 복잡하다는 점이 단점입니다.

 

 

 

 

 

Thread Library

쓰레드 라이브러리란 쓰레드를 생성하고 관리하기 위한 API이고, 3가지의 주요 라이브러리가 존재합니다.

라이브러리 설명
POSIX pthread - POSIX standard를 따르는 라이브러리 입니다.
- 유저레벨과 커널레벨에 구현되어있지만, 주로 커널에 구현되어있다.
※현재는 유저레벨에 이상 존재하지 않는다고 합니다.
Windows thread API - Windows용 커널 레벨 쓰레드 라이브러리 입니다.
Java thread API - high-level 라이브러리 입니다.
- pthread와 Windows library를 둘 다 사용하며 자바 프로그램이 구동하는 환경에 따라서 선택합니다.

※POSIX standard : Implementation이 아니라 Specification입니다. 즉 어떻게 구현할지 정한 것이 아니고 어떤 기능을 하는 함수가 구현되어야 하는지 정해놓은 표준입니다. POSIX는 portable operating system interface의 약자로 이 인터페이스 규약을 따르는 API는 서로 다른 UNIX 호환 OS에서도 동작합니다.

Thread Pool

쓰레드 풀은 쓰레드를 이용하여 Request를 처리하는 모델입니다. 정해진 숫자만큼의 쓰레드를 생성해두고 request 들어오면 쓰레드 풀에서 쓰레드를 골라와서 처리하고 작업이 끝나면 쓰레드는 쓰레드 풀 돌아갑니다.

쓰레드 풀을 사용하면 쓰레드를 생성하고 종료하는데 드는 Overhead를 줄일 수 있고 생성되는 쓰레드의 개수를 제한할 수 있다는 장점이 있습니다.

단, 낭비되는 리소스가 있고, 쓰레드를 할당하는데 시간이 걸리므로 실행시간이 길어지며, 쓰레드 풀에 얼마나 많은 쓰레드를 가지고 있어야할 지 결정하기 어렵다는 단점이 있습니다.