카테고리 없음
[TIL] Thread 종류
s00ng
2025. 3. 3. 08:10
컴퓨터 시스템 구성도
- User Mode
- Process 가 동작하는 영역
- OS Kernel
- OS가 H/W 자원을 제어하기위해 사용되는 공간
- H/W
- PC에 연결된 하드웨어들의 집합 (SSD, CPU, LAN card 등)
Hardware Thread
Core 의 사용률을 극대화시키기 위해 개발된 물리적인 Thread이다.
- CPU 관점에서 Core에서 수행하는 연산 작업 시간보다 메모리에 데이터를 반영하는 시간이 길다는 문제가 있었음
- 메모리를 기다리는동안 다른 작업을 수행할 수 있도록 하자
- Intel → Hyper-Threading
- 물리적인 코어마다 하드웨어 스레드를 2개씩 두는 모델
- OS 관점에서 Hardware Thread는 가상의 코어이다.
- 만약, Single Core CPU에서 H/W Thread가 2개라면 OS는 이 CPU를 듀얼 코어로 인식하고 듀얼 코어에 맞춰서 OS 레벨의 스레드들을 스케줄링한다.
OS Thread
OS Thread는 OS Kernel Level에서 생성되고 관리되는 스레드이다.
- CPU에서 실제로 실행되는 단위, CPU 스케줄링의 단위
- OS Thread의 컨텍스트 스위칭은 커널이 개입하여 수행한다. → 비용 발생
- 사용자 코드와 Kernel 코드 모두 OS 스레드에서 실행된다.
- OS Thread 의 다른 이름
- Native Thread
- Kernel Thread
- Kernel-Level Thread
- OS-Level Thread
User Thread
User-Level Thread라고도 불리며 Thread 개념을 프로그램 레벨에서 추상화 한 것이다.
// User Thread
Thread thread = new Thread();
thread.start();
- thread.start() 를 실행하면 다음과 같은 동작이 수행된다.
- start0 메서드 호출
- JNI 를 통해 OS system call 호출
- 운영체제가 Linux라면 clone이라는 system call 호출
- Linux에서는 OS Level Thread 생성
- 결국 User Thread - OS Thread가 연결됨
- User Thread가 CPU에서 실행되려면 OS Thread와 반드시 연결되어야한다.
- 다른 맥락에서는 User Mode에서 스케줄링되는 Thread로 표현되기도 한다.
User Thread와 OS Thread 연결 방식
1. One-to-One model
OS Thread와 User Thread를 1대1 매핑시킨 방식
- Java가 채택한 방식
- Thread 관리를 OS에 위임한다
- 스케줄링 또한 Kernel이 수행한다.
- Multi-Core를 잘 활용한다는 특징이 있다.
- 하나의 Thread가 Block이 되더라도 다른 스레드는 별도의 OS Thread에서 잘 동작한다.
- Race Condition 발생 가능성이 존재한다.
2. Many-To-One model
여러개의 User Thread를 하나의 OS Thread에 매핑한 방식
- 장점
- context-switching이 User mode에서 일어나기때문에 빠르다.
- User Thread가 여러개이더라도 실제 CPU는 하나의 OS Thread를 실행시키는 것으로 인식한다.
- 또한, OS Thread를 하나만 사용하기 때문에 Race Condition 발생 가능성이 낮다.
- 단점
- 하지만 Multi-Core를 잘 활용하지 못한다는 특징이 있다.
- Block I/O 호출시 다른 모든 User Thread도 Block 된다.
- 따라서, Non-Blocking I/O를 사용하게된다.
3. Many-To-Many
여러 User Thread와 여러개의 OS Thread가 매핑되어 실행되는 형태
- 앞선 모델의 장점들을 모두 합친 방식
- 구현이 복잡하다는 단점이 있다.
Green Thread
- Java 초창기 버전은 Many-To-One 스레딩 모델을 사용
- 이 때 User Thread들을 Green Thread 라고 호칭
- 최근에는 의미가 확장되어 OS와는 독립적으로 User-Level에서 스케줄링되는 스레드를 의미하기도 한다.