Develop/Java

Project Loom’s Virtual Thread(가상 스레드)

eroul-ri 2023. 7. 13. 10:36

운영체제 기반의 전통적인 JAVA Thread 단점

  • 하나의 JAVA Thread는 하나의 운영체제 스레드, 1:1 매핑
  • Thread Pool에 설정한 만큼의 Thread가 Pool에 담겨 하나의 Thread는 하나의 요청을 처리하는 방식
  • Thread 생성 및 전환시 발생하는 컨텍스트 스위칭 비용이 크고 성능적 이슈가 존재
  • CPU 코어당 여러 스레드를 제공하더라도 대부분 서비스의 응답을 기다리는 시간이 길기 때문에 큰 의미가 없었음

 

Reactive Programming

위 같은 문제들의 극복을 위해 Async - Non Blocking 방식의 Reactor, RxJava와 같은 프레임워크가 많이 도입되어왔다.
 
이런 프레임워크에서 제공하는 Reactive Programming은 러닝커브가 존재하고 기존의 동기 프로그래밍 방식에 비해 복잡하고 디버깅이 어렵기는 하지만 결과가 주어지는데 시간이 걸리더라도 그 시간동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있다.
 
 
Virtual Thread는 전통적인 Java Thread에 새롭게 추가되는 경량 스레드를 말한다.
OS Thread 를 그대로 사용하는 것이 아니라 Virtual Thread 를 사용해 JVM이 조율해오던 작업들을 스케줄링 할 수 있다고 하며
하나의 Java Process가 수백만개의 스레드를 동시에 실행할 수 있도록 설계되었다고 한다.
 

 

 

Project Loom's Virtual Thread

Project Loom의 목표는 JAVA에서 처리량이 많고 가벼운 동시성 모델을 지원한다.
 
기존의 동기 프로그래밍 방식은 설계가 간단하고 직관적이며, 쉽게 읽고 유지보수가 가능하지만 결과가 주어질 때까지 아무것도 못하고 대기해야하는 단점이 존재했었는데, Project Loom은 가상의 경량 스레드(Virtual Thread)를 도입하여 적용하여 이를 해결한다.
 
Virtual Thread를 적용하게되면 기존의 코드 베이스에서 크게 달라진 점이 없어보일 수 있지만, 더이상 운영체제의 스레드와 1:1로 매핑되지 않는다. 내부적으로는 큰 변화이지만, 기존의 코드베이스에서 쉽게 적용할 수 있도록 설계되었다.
 
 

자바 가상스레드 아키텍쳐

 

 

Virtual Thread가 임시로 매핑되는 Carrier Thread가 존재하며, Virtual Thread가 Block되게 되면, Virtual Thread는 Carrier Thread에서 제거되고, Carrier Thread는 다른 Virtual Thread를 실행하는 방식을 사용함으로써 많은 요청들을 병렬로 처리할 수 있다.
 
그렇다고해서 기존의 Thread 방식을 사용하지 못하는 것이 아니라 기존의 Thread를 유지하며, Virtual Thread와 모두 사용할 수 있게 된다고 하는데
 
이는 2023년 9월 19일 릴리즈 예정인 JDK21 LTS  정식으로 지원한다고 합니다.
 
 
출처: https://cr.openjdk.org/~rpressler/loom/Loom-Proposal.html
https://www.happycoders.eu/java/virtual-threads/
https://www.baeldung.com/openjdk-project-loom