dev.Log

Virtual Thread vs Thread 본문

BACKEND.*/JAVA

Virtual Thread vs Thread

초코푸딩 2024. 4. 10. 13:11

 

1. 구현 및 용도

  • 기존 Thread (Platform Thread): OS가 관리하는 스레드로, Java의 Thread 클래스로 대표됩니다. 이러한 스레드는 운영 체제의 스케줄러에 의해 관리되며, 고정된 수의 코어 또는 CPU 리소스에 대한 작업을 수행합니다. 병렬 작업을 위해 사용되며, CPU 바운드 작업에 적합합니다.
  • Virtual Thread: Java 19에서 도입된 경량 스레드로, 많은 수의 동시 작업을 운영 체제 스레드보다 효율적으로 관리할 수 있게 해줍니다. 주로 I/O 바운드 작업, 대규모 동시성을 필요로 하는 작업에 사용됩니다.

2. 리소스 사용

  • 기존 Thread: 각 스레드는 운영 체제 스레드에 매핑되며, 상당한 양의 메모리(스택 공간 등)와 컨텍스트 스위칭 비용을 필요로 합니다. 이로 인해 생성할 수 있는 스레드의 수가 제한됩니다.
  • Virtual Thread: 매우 작은 메모리를 사용하여 수십만 개 이상의 스레드를 생성하고 관리할 수 있습니다. 컨텍스트 스위칭 비용이 낮고, 스레드당 오버헤드가 적어 많은 수의 동시성 작업을 효율적으로 처리할 수 있습니다.

3. 성능 및 확장성

  • 기존 Thread: 높은 CPU 사용률과 병렬 작업에 최적화되어 있지만, 스레드 생성 및 관리의 오버헤드로 인해 I/O 바운드 작업에서는 확장성이 제한될 수 있습니다.
  • Virtual Thread: I/O 작업 중에 블로킹 되는 동안에도 수천에서 수십만 개의 작업을 처리할 수 있는 높은 확장성을 제공합니다. I/O 바운드 시스템에서 성능을 대폭 향상시킬 수 있습니다.

4. 사용 시나리오

  • 기존 Thread: 고성능 계산, 게임 엔진, 그래픽 처리와 같은 CPU 집약적 작업에 적합합니다.
  • Virtual Thread: 웹 서버, 데이터베이스 접근, 파일 처리 등 대기 시간이 긴 I/O 작업을 동시에 많이 처리해야 하는 애플리케이션에 적합합니다.

5. 프로그래밍 모델

  • 기존 Thread: 전통적인 병렬 프로그래밍 모델을 따르며, 스레드 풀과 같은 기술을 사용하여 리소스 사용을 최적화할 수 있습니다.
  • Virtual Thread: 더 간단하고 선언적인 동시성 프로그래밍 모델을 가능하게 하며, 개발자가 동시성 관련 복잡성을 더 쉽게 관리할 수 있도록 합니다.

 


그럼 여기서 질문! 어떻게 구현되어있길래 수십만개의 스레드를 생성할 수 있는걸까..???

 

1. M:N 스레딩 모델

Virtual Thread는 M:N 스레딩 모델을 사용합니다. 이는 M개의 Virtual Thread가 N개의 OS 스레드(Platform Thread)에 매핑될 수 있음을 의미합니다. 실제로 실행 가능한 CPU 코어의 수(N)는 제한적이지만, Virtual Thread(M)의 수는 이론상 무제한에 가깝습니다. 이 모델은 Virtual Thread를 필요에 따라 생성하고 관리하는 데 큰 유연성을 제공합니다.

2. 스레드 풀 활용

Virtual Thread는 내부적으로 스레드 풀을 사용하여 실제 OS 스레드를 효율적으로 관리합니다. 이 스레드 풀은 일정 수의 OS 스레드를 유지하며, Virtual Thread의 실행은 이러한 스레드 풀에 할당되어 실행됩니다. Virtual Thread가 I/O 작업 또는 다른 블로킹 작업으로 인해 대기 상태에 들어가면, 해당 OS 스레드는 다른 Virtual Thread의 작업을 처리할 수 있게 되어 리소스 활용도를 극대화합니다.

3. 블로킹 I/O와의 효율적인 상호작용

Virtual Thread의 중요한 설계 목표 중 하나는 블로킹 I/O 작업을 효율적으로 처리하는 것입니다. 전통적인 OS 스레드를 사용하는 경우, 블로킹 I/O 작업은 스레드가 유휴 상태에 머무르게 하여 리소스를 낭비할 수 있습니다. 반면, Virtual Thread는 이러한 작업을 수행하는 동안 다른 작업으로 스위치할 수 있어, 시스템의 전체적인 처리량을 향상시킵니다.

4. 컨텍스트 스위칭 오버헤드 최소화

Virtual Thread는 컨텍스트 스위칭의 오버헤드를 크게 줄입니다. OS 스레드 간의 컨텍스트 스위칭은 비용이 많이 드는 작업이지만, Virtual Thread는 사용자 공간에서 관리되므로 이러한 오버헤드를 획기적으로 줄일 수 있습니다. 이를 통해 훨씬 많은 수의 동시 작업을 효과적으로 처리할 수 있습니다.

이러한 방식으로, Virtual Thread는 기존의 OS 스레드 모델의 제한을 극복하고, 애플리케이션에서 필요로 하는 대규모 동시성을 구현할 수 있게 해줍니다. 이는 특히 I/O 바운드 작업이 많은 애플리케이션에서 성능 향상을 가져올 수 있습니다.

 

'BACKEND.* > JAVA' 카테고리의 다른 글

전략 패턴  (0) 2024.05.31
템플릿 메서드 패턴  (0) 2024.05.31
동시성제어 - ThreadLocal  (0) 2024.05.29
Stream  (0) 2022.10.08
Spring vs SpringBoot  (0) 2022.10.08
Comments