Virtual Threads 알아보기(1)

이월(0216tw)·2024년 5월 14일

Virtual Threads 개념

virtual Threads 는 스레드를 작성하고 유지하는 데 필요한 노력을 줄이고 동시에 고가용성의 동시 작업을 처리할 수 있는 경량 스레드이다.

스레드는 스케줄이 가능한 가장 작은 유닛 단위이며 동시에 독립적으로 실행을 하는데 java.long.Thread에 구현되어 있고 platform 스레드 와 virtual 스레드로 나뉜다.


Platform Thread(이하 플랫폼스레드) 의 원리


인터페이스 등을 활용해 이식성을 높임

원래 OS마다 스레드를 처리하는 방식이 조금 다르다.
하지만 플랫폼스레드는 이 방식들을 인터페이스 등으로 감싸 일관된 인터페이스를 제공 하여 이식성을 높였다.

OS 스레드의 자원에 영향을 받는다

플랫폼스레드는 OS의 스레딩 기능을 기반으로 JVM상에서 활용된다. 그러다보니 OS의 스레드 스택 및 자원에 영향을 받게 되므로 플랫폼스레드 개수는 OS thread 개수보다 많을 수는 없다.


Virtual Thread(이하 가상스레드)의 원리

가상스레드도 플랫폼스레드처럼 OS의 스레딩 기술을 기반으로 JVM 상에서 관리되는 스레드이다. 하지만 플랫폼스레드와 달리 특정 OS에 종속적이지 않다.


가상메모리와 비슷한 원리인 가상스레드

가상스레드의 구현방식은 가상메모리의 구현방식과 비슷하다.
가상메모리가 제한된 RAM 크기에 거대한 가상의 주소를 매핑해 대용량 프로그램을 실행할 수 있듯이, 많은 스레드를 사용하기 위해 자바런타임은 대량의 가상 스레드를 OS 스레드에 매핑해서 사용한다.

예를 들어 특정 가상스레드가 I/O 작업으로 인해 blocking 된 경우,
해당 가상스레드는 일시 중지되며, OS thread와 매핑되어 있는 또다른 가상스레드의 작업을 수행할 수 있는 것이다.

즉, 가상스레드 활용으로 blocking 작업에 대한 대기 시간이 감소할 수 있다.

(플랫폼 스레드는 OS 스레드와 1:1매핑관계이다. 그래서 OS 스레드 개수만큼 제한된다. 가상스레드는 다:1 관계이다. 그래서 OS 스레드 개수보다 많은 가상 스레드를 가질 수 있다.)

전형적인 얕은 콜 스택을 가졌다.

call stack이란, 메서드 호출을 할 때 호출 정보를 저장해놓은 스택을 의미한다. 가상스레드는 swallow call stack(얕은콜스택)을 가지고 있는데 이는 단일 HTTP 요청이나 단일 JDBC 쿼리 등의 작업을 충분히 수행할 수 있다는 의미이다.

(만약 메서드 깊이가 깊은 작업을 해야한다면 가상스레드보다는 깊은 call stack을 가진 플랫폼 스레드가 더 적합할 수 도 있다)


가상 스레드를 사용하는 이유?

대기 시간이 긴 작업이 많다면 사용하자!

대기 시간이 긴 작업을 수행하는 동안 다른 작업을 매핑해 수행할 수 있으므로
기존 스레드보다 많은 스레드 활용을 할 수 있다. 예를 들어 데이터를 가져오는 IO작업이 많을 때, 가상 스레드를 활용하면 다른 가상 스레드 작업을 할 수 있으므로 대기 시간을 줄일 수 있다는 것이다.

주의! 가상스레드가 기존 스레드보다 속도가 빠른 것이 아니다. 대기시간을 줄여서 스레드를 더 많이 활용하여 높은 처리량을 낼 수 있는 것일뿐이다.

profile
#SQLD강사 #AI개발 #AI강사 #개발자 개발도 하고 강의도 하지만 고민을 제일 많이 합니다

0개의 댓글