- 유저레벨, 커널레벨 스레드
- 애플리케이션 - 유저레벨 스레드
- 커널에서 커널레벨 스레드 → 프로세서에 할당
- 커널은 유저레벨 스레드 인식 못하므로, 커널레벨 스레드 피요
Green Thread
- User Thread: Kernel Thread 가 N:1로 매핑됨
- 커널 스레드가 하나뿐이라, 멀티코어 (프로세서가 여러개) 여도 하나의 프로세서만 일함
- 컨텍스트 스위칭은 적지만, 하나의 프로세서만 일함
- 한 User Thread만 블락되어도, 전체가 Block 돼버림
- Java 1.3부터 사라짐
Native Thread (Platform Thread)
- User Thread: Kernel 1:1 매핑
- Java 1.3부터 현재에도 Default로 사용됨
- 컨텍스트 스위칭이 커널레벨 단에서 발생하여 비용이 많이 발생함
- 많은 스택메모리 필요
- 한 스레드 당 스택메모리 1MB (-XSS JVM 옵션으로 조절 가능)
- 스레드 메모리 사용량 제한을 위해 ThreadPool을 사용한다면?
Event-Loop
- Netty
- EventLoop : Kernel 1:1 매핑
- 가용 스레드 수의 2배 (reactor-netty에서는 1배)
- 훨씬 적은 수의 Thread 사용
- 적은 메모리로도 높은 동시성 달성
- 컨텍스트 스위칭 비용 감소 (JVM 단에서 발생하므로)
- 러닝커브가 높다
- Spring Data R2DBC, R2DBC-Mysql, OpenFeign Reactive 까지 모두 개발해야 함
- Blocking 로직 포함하면 성능저하 유발 ← 커널스레드 블락 걸림
Virtual Thread
- JDK 19 Preview, JDK 21 Release