『OSC Ch 4. Multithreaded Programming』
- 스레드에 대해 다루는 챕터.
- 구체적인 멀티스레드 구현 방법이나 코드가 나온다.
Threads
- 스레드는 프로세스의 작업 흐름을 말한다.
- 하나의 프로세스가 한 번에 하나의 작업만 수행하는 것은 싱글스레드.
- 하나의 프로세스가 동시에 여러 작업을 수행하는 것은 멀티스레드.
- 프로세서와 메모리가 발전하며 가능해진 기술이다.
- 멀티프로그래밍 시스템이니까 프로세스를 여러개 돌려도 되는데 굳이 스레드를 나누는 데는 이유가 있다:
- IPC를 위해 메시지 패싱이나 공유 메모리 또는 파이프를 사용하는 것은 효율도 떨어지고 개발자가 구현, 관리하기도 번거롭다.
- 프로세스 사이 컨텍스트 스위치가 계속 일어나면 성능 저하가 발생한다.
Multithreaded Server Architecture
- 서버와 클라이언트 사이에도 멀티스레드를 구현한다.
- 클라이언트가 서버에게 요청을 보내면 서버는 새로운 스레드를 하나 생성해 요청을 수행한다.
- 프로세스를 생성하는 것보다 스레드를 생성하는 것이 더 빠르기 때문이다.
Multicore Programming
- 멀티코어 또는 멀티프로세서 시스템을 구현할 때는 동시성(Concurrency)와 병렬성(Parallelism)을 알아야 한다.
- 동시성은 싱글 프로세서 시스템에서 사용되는 방식:
- 프로세서가 여러 개의 스레드를 번갈아가며 수행함으로써 동시에 실행되는 것처럼 보이게 하는 방식.
- 병렬성은 멀티코어 시스템에서 사용되는 방식:
- 여러 개의 코어가 각 스레드를 동시에 수행하는 방식.
User Threads and Kernel Threads
- 유저 스레드는 사용자 수준의 스레드 라이브러리가 관리하는 스레드다:
- 스레드 라이브러리에는 대표적으로 POSIX Pthreads, Win32 threads, Java threads가 있다.
- 커널 스레드는 커널이 지원하는 스레드다:
- 커널 스레드를 사용하면 안정적이지만 유저 모드에서 커널 모드로 계속 바꿔줘야 하기 때문에 성능이 저하된다.
- 반대로 유저 스레드를 사용하면 안정성은 떨어지지만 성능이 저하되지는 않는다.
Multithreading Models
- 유저 스레드와 커널 스레드의 관계를 설계하는 여러가지 방법이 있다.
Many-to-One Model
- 하나의 커널 스레드에 여러 개의 유저 스레드를 연결하는 모델.
- 한 번에 하나의 유저 스레드만 커널에 접근할 수 있기 때문에 멀티코어 시스템에서 병렬적인 수행을 할 수가 없다.
- 요즘에는 잘 사용되지 않는 방식이다.
One-to-One Model
- 하나의 유저 스레드에 하나의 커널 스레드가 대응하는 모델.
- 동시성을 높여주고, 멀티프로세서 시스템에서는 동시에 여러 스레드를 수행할 수 있도록 해준다.
- 유저 스레드를 늘리면 커널 스레드도 똑같이 늘어난다:
- 커널 스레드를 생성하는 것은 오버헤드가 큰 작업이기 때문에 성능 저하가 발생할 수 있다.
Many-to-Many Model
- 여러 유저 스레드에 더 적거나 같은 수의 커널 스레드가 대응하는 모델.
- 운영체제는 충분한 수의 커널 스레드를 만들 수 있다:
- 커널 스레드의 구체적인 개수는 프로그램이나 작동 기기에 따라 다르다.
- 멀티프로세서 시스템에서는 싱글프로세서 시스템보다 더 많은 커널 스레드가 만들어진다.
Two-level Model
- 특정 유저 스레드를 위한 커널 스레드를 따로 제공하는 모델.
- 점유율이 높아야하는 유저 스레드를 더 빠르게 처리해줄 수 있다.
Thread Pools
- 스레드를 요청할 때마다 매번 스레드를 생성, 수행, 삭제하면 성능이 저하된다.
- 그래서 미리 스레드 풀에 여러 개의 스레드를 만들어두고 요청이 오면 스레드 풀에서 스레드를 할당해주는 방법을 사용한다.
이 문서를 인용한 문서
- 『Operating System Concepts(OSC)』
-
Chapter 4. Multithreaded Programming
-