티스토리 뷰
운영 체제
쓰레드란?
쓰레드 (Thread)
쓰레드는 CPU 활용의 기본 단위입니다. 하나의 프로세스가 여러 쓰레드를 가지는 경우 멀티 쓰레디드 프로세스라고 합니다.쓰레드는 고유의 쓰레드 ID, CPU register, stack, Program Counter를 지닙니다. 반면 코드, 데이터, 파일은 프로세스의 것을 공유하여 사용합니다.
[프로세스와 쓰레드의 메모리 공유 구조]
다중 쓰레드 프로그래밍의 장점
1. 높은 반응성
- 시간이 오래 걸리는 작업을 비동기 쓰레드로 처리하여 사용자와의 반응성을 유지할 수 있습니다.
2. 리소스 공유
- 프로세스 간 리소스 공유를 위해서는 IPC(메시지 전달, 공유 메모리 등)를 사용해야 하지만, 쓰레드는 코드와 데이터를 기본적으로 공유합니다.
3. 효율적인 리소스 활용
- 프로세스보다 쓰레드를 생성하고 컨텍스트 스위칭하는 작업이 리소스 소모가 훨씬 적습니다.
4. 확장성
- 멀티 코어 환경의 이점을 제대로 활용하여 성능을 높일 수 있습니다.
동시성(Concurrency)과 병렬성(Parallelism)
[동시성과 병렬성의 차이]
동시성: 여러 프로세스의 실행을 지원하는 것 (싱글 코어에서 여러 작업이 번갈아 실행됨)
병렬성: 동시에 여러 프로세스를 실행하는 것 (멀티 코어에서 실제로 동시 실행됨). 작업 병렬성과 데이터 병렬성으로 구분됩니다.
다중 쓰레드 모델
유저 레벨 쓰레드(유저만 아는 쓰레드)와 커널 쓰레드(커널이 관리하는 쓰레드)의 관계에 따라 3가지 모델로 나뉩니다.
- Many-to-One: 여러 유저 쓰레드가 하나의 커널 쓰레드와 연결됩니다. 한 유저 쓰레드가 Blocking System Call을 호출하면 전체가 멈추며, 멀티 코어의 이점을 살리기 어렵습니다.
- One-to-One: 하나의 유저 쓰레드가 하나의 커널 쓰레드와 매핑됩니다. 병렬성은 좋으나 커널 쓰레드 생성에 따른 오버헤드가 발생할 수 있습니다. (현재 널리 쓰이는 모델)
- Many-to-Many: 유저 쓰레드 수 이하의 커널 쓰레드가 유연하게 배치되는 모델로 앞선 단점들을 보완하지만 구현이 복잡합니다.
[다중 쓰레드 매핑 모델]
최근에는 하드웨어 성능 향상으로 인해 커널 쓰레드 개수 제한의 필요성이 줄어들면서 One-to-One 모델이 주로 사용됩니다.
Implicit 멀티 쓰레딩
- Thread Pool: 웹 서버 등에서 쓰레드를 미리 생성해두고 요청이 들어올 때마다 할당하여 관리 효율을 높입니다.
- Fork-Join (Java): 라이브러리 차원에서 쓰레드를 생성(Fork)하고 결과를 취합(Join)하는 구조를 제공합니다.
- OpenMP: 컴파일러 지시어를 통해 특정 코드 영역을 병렬로 실행할 수 있게 돕는 공유 메모리 환경 라이브러리입니다.