본문 바로가기

Tech 블로그

Java의 미래, Virutal Thread

728x90

kotlin의 coroutin을 대체할 수 있는 Virtual Thread

출처: https://techblog.woowahan.com/15398/

 

 

탄생 배경

  • 스레드는 프로세스에 비해 크기가 작아 생성비용이 적고, 컨텍스트 스위칭비용이 저렴
  • 하지만 요청량이 많아지면 더 많은 스레드 필요
  • 생성비용이 적지만 스레드가 많이 필요해 비용이 많이 듦

 

Virtual Thread의 동작원리

 

기존 JAVA THREAD

  • Application 코드가 OS Thread를 사용하는 게 최종목적인데, 비용측면때문에, platform thread를 거쳐서 사용

 

Virtual Thread

가상의 thread 풀이 없고, JVM 자체적으로 virtual thread를 OS Thread 와 연결하는 스케줄링을 진행둘을 연결해주는 기존의 platform thread는 carrier thread라고 한다.

  • Carrier thread가 virtual thread의 작업을 처리 중에 blocking이 발생시, 다른 virtual thread 작업 처리
  • 기존 스레드는 Blocking 발생시, 그냥 기다림

 

Virutal Thread의 특징

  • 코드 구현상으로는 virtual thread 여부를 확인하는 구간이 생겨, production 코드에서는 기존과 동일하게 코드를 작성해도 됨.
if(Thread.currentThread().isVirtual()){ 
	// virtual_thread ... 
 } else { 
 	// traditional thread 
 }
  • Virtual Thread는 컨텍스트 스위칭 비용이 저렴
  Thread  Virtual Thread
Stack 사이즈 ~2MB ~10KB
생성시간 ~1ms ~1µs
컨텍스트 스위칭 ~100µs ~10µs

 

Virtual Thread는 JVM에 의해 생성되기 때문에

  • 커널영역의 호출이 적음 (시스템 콜)
  • 메모리 크기가 일반 스레드의 1%에 불과
  • 컨텍스트 스위칭 비용이 적음

모델 간 비교

Virtual Thread V.S. Thread

  • I/O Bound 작업에서 50%이상 성능 향상
  • Context Switching이 없는 CPU Bound에서 성능낭비 발생
    • platform thread 사용 비용
    • virtual thread 생성 비용
    • 스케줄링 비용

Virtual Thread V.S. Kotlin Coroutine

  • I/O Bound 작업에서 37%이상 성능 향상

Virtual Thread V.S. Reactive Programming

  • I/O Bound 작업에서 111%이상 성능 향상
728x90