Virtual Thread
2023년 9월에 릴리즈 예정인 Java 21부터 제공되는 기능으로써 기존의 스레드 이외에 추가되는 경량 쓰레드입니다.
기존의 스레드 VS 가상 스레드
- 기존 스레드
- OS (Operating System)이 관리하고 스케쥴링 한다. 즉, 기존 Java에서 스레드를 사용하는 것은 OS의 스레드를 사용하는 방식이다.
- OS 커널 스레드를 새로 생성하는 것은 비용이 크다. 그래서 스레드 풀 (Thread Pool)을 사용했었다.
- OS에서 context switch가 될 경우 시간이 오래 걸리기 때문에 non-blocking I/O 방식 혹은 비동기 방식으로 사용해야 조금 더 효율적으로 스레드를 사용할 수 있다.
- 가상 스레드
- JVM에 의해 관리되고 스케쥴링 된다.
- 가상 머신에 의해 관리되기 때문에 OS에 시스템 콜 (System Call)을 보내지 않아도 되고 OS의 context switch에서 자유롭다.
구조 차이
기존 스레드
기존의 스레드 구조는 OS의 스레드와 1:1로 구성되고 Thread Pool에 접근하여 사용하는 방식으로 사용한다.
가상 스레드
가상 스레드는 Thread Pool을 사용하지 않고 Virtual Thread를 그대로 사용한다. 그리고 기존 스레드의 Thread Pool에 있던 스레드들을 Carrier Thread라고 지칭해서 사용한다. Virtual Thread를 JVM에서 자체적으로 스케쥴링해서 기존의 스레드로 연결시켜주고 이 스케쥴링을 Mount / Unmount라고 한다.
기존 스레드의 한계
- OS 스레드를 랩핑하여 사용하는 것이기 때문에 스레드 갯수가 제한적이고 생성과 유지의 비용이 비쌈
- 이를 해결하기 위해 Thread Pool을 도입하여 스레드를 미리 생성해두고 작업 큐에 들어오는 작업들을 Thread Per Request (하나의 요청에 하나의 Thread)로 처리
- Thread Per Request 방식은 스레드의 갯수를 무한정 늘릴 수 없기 때문에 결국 처리량의 제한이 생긴다.
- 스레드가 I/O 작업을 할 때는 blocking 되고 이것은 시간이 많이 든다.
- 이를 해결하기 위해 non-blocking 방식의 Reactive Programming을 고안
- Reactive Programming을 새로 배우는데도 시간이 들고 디버깅도 힘들며 기존의 레거시 코드들을 아예 새로 작성해야하는 비용이 컸다.
가상 스레드의 장점
기존의 코드 스타일을 유지하면서 Reactive Programming의 장점을 가져올 수 있다.
반응형
'기초 지식 > Java' 카테고리의 다른 글
[Java 13 ~] Text Blocks (0) | 2022.02.04 |
---|---|
[Java] Sealed Class (0) | 2021.10.20 |
[Java] HashTable, ConcurrentHashMap에 대해서 (0) | 2021.09.28 |
[Java] this 키워드에 관해서 (0) | 2021.09.14 |
[Java] HashMap에서 잠시 헷갈렸던 부분! (0) | 2021.09.09 |