현대 서버 개발에서 가장 중요한 고민 중 하나는
"어떻게 하면 더 많은 작업을 동시에 처리할 수 있을까?" 입니다.
최근 등장한 기술들이 바로 이 문제를 해결하려고 합니다.
이 글에서는 이 두 가지 개념을 정리합니다.
Java 21에서 등장한 Virtual Thread는 기존 스레드 모델의 한계를 해결하기 위해 등장했습니다.
기존 Java 스레드는 OS 커널 스레드와 1:1로 매핑됩니다.
예를 들어 웹 서버에서 요청 → DB 조회 → 응답
DB 응답을 기다리는 동안
즉 비싼 자원을 낭비하게 됩니다.
보통 서버에서 수천개 스레드
이상 만들면 메모리 문제가 발생합니다.
Virtual Thread는 JVM이 직접 관리하는 경량 스레드입니다.
OS 스레드와 1:1로 매핑되지 않습니다.
Virtual Thread는 Blocking 상황에서 OS 스레드를 점유하지 않습니다.
예시: Virtual Thread A → DB 요청 → 대기
이때 JVM이 OS Thread에서 Virtual Thread A를 떼어냄 (Unmount)
그리고
다른 Virtual Thread를 실행
즉 OS 스레드는 항상 일하도록 유지됩니다.
Platform Thread
└── OS Thread와 1:1 연결
Virtual Thread
└── JVM이 여러 Virtual Thread를
소수의 OS Thread에 스케줄링
| 구분 | Platform Thread | Virtual Thread |
|---|---|---|
| 관리 주체 | OS (Kernel) | JVM |
| OS 매핑 | 1:1 | M:N |
| 생성 비용 | 높음 | 매우 낮음 |
| 메모리 사용 | 큼 | 매우 작음 |
| 스레드 수 | 수천 개 | 수십만 ~ 수백만 |
| 적합한 작업 | CPU 연산 | I/O 작업 |
Python에는 오래된 구조적 제약이 하나 있습니다.
바로 GIL (Global Interpreter Lock) 입니다.
CPython에서는 한 번에 하나의 스레드만 Python 코드를 실행할 수 있습니다.
즉, 멀티 스레드 프로그램이어도
실제로는 한 스레드만 실행됩니다.
8코어 CPU가 있어도
Python 코드 실행 → 1코어만 사용
그래서 CPU 연산이 많은 작업에서는
Python 커뮤니티에서는 이 문제를 해결하기 위해
GIL을 제거하는 프로젝트
를 진행했습니다.
멀티코어 CPU를 100% 활용
특히 다음 분야에서 성능 향상이 기대됩니다.
이 기술들은 모두 같은 목표를 가지고 있습니다.
하드웨어 자원을 낭비하지 않고 더 많은 작업을 동시에 처리하기
Platform Thread → OS가 관리하는 무거운 스레드
Virtual Thread → JVM이 관리하는 경량 스레드
No-GIL → Python의 병렬 실행 제한 제거