Java Virtual Thread에 대한 이해

세미나 준비중에 쉽게 오해할수 있을만한 부분인것 같아 따로 적어봄


Virtual Thread가 가진 가장 큰 장점은 아무래도 생성이나 스위칭이 가볍고 기존 시스템 쓰레드보다 훨씬 더 많이 생성이 가능하다는 점일것이다 (사실 적고나니 이게 다이긴 하네)

하지만 이 내용을 보고 단순히 "쓰레드를 훨씬 빠르고 많이 만들수 있으니 내 로직이 훨씬 빨라지겠는걸?" 이라고 생각한다면 Virtual Thread를 제대로 이해한것이 아니다


이를 이해하기 위해선 먼저 자바의 동시성(concurrency)과 병렬성(parallelism)에 대해서 알아야 한다

간단히 말해 동시성이란 여러 쓰레드가 동시에 돌아가는것 같아 보이는 것을 의미한다

반면, 병렬성은 정말 실제 물리적으로 동시에 실행되는 것을 의미하며 이는 CPU의 갯수와 추상화에 달려있고 그 갯수가 생각보다 많지는 않다

그럼에도 우리는 하나의 프로그램에서 수십 혹은 수백개의 쓰레드를 생성하여 동작시키고 있다

이런 의미에서 Virtual Thread가 단순히 더 가볍고 더 많이 생성된다고 해서 프로그램의 성능에 도움을 주는 것은 아니다


Virtual Thread가 실질적으로 도움을 줄수 있는건 파일 입출력이나 network I/O와 같은 I/O-bound 작업에서 대기 시간이 발생했을때 실질적인 도움을 줄수 있다

예를 들어 시스템 제약으로 10개의 시스템 쓰레드만 사용이 가능한 환경에서 1초가 걸리는 외부 호출을 수행해야 하는 로직이 있다면 성능은 대략 1초당 10건에 조금 못미칠 것이다

이런 조건에서 Virtual Thread 를 사용하면 외부 호출의 응답을 기다리는 동안 추가적인 쓰레드가 계속적으로 생성이 되고 동작하면서 성능이 크게 향상될수 있다

반대로 이러한 I/O-bound 로직이 아닌 CPU-bound 로직에 대해서는 Virtual Thread를 사용한다고 하더라도 성능적인 개선이 크게 이루어지지는 않을것이다


(그나저나 요즘은 Virtual Thread에 대한 사람들의 관심이 좀 줄어들었나.. 관련 피드가 별로 안보이네)


다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 8월 22일 오전 10:20

댓글 0