Java

[Java] Java project Loom and Virtual Threads

Razelo 2022. 11. 16. 12:01

최근 커뮤니티에서 많이 언급되는 주제가 있다. 바로 Java project Loom 의 Virtual Threads 이다. 

 

최근 뜨거운 감자인데 어느 정도는 알아둬야겠다고 생각해서 간단하게 내용을 살펴보고자 한다. 


 

우선 프로젝트 룸이란 무엇일까? 

The primary goal of Project Loom is to support a high-throughput, Lightweight concurrency model in java. 

즉 자바의 동시성 모델에서 가벼우면서도 고성능을 지원할 수 있게 하는 프로젝트라고 볼 수 있다. 

 

OpenJDK에 의해서 시작되었다고 한다. 

 

Project Loom에 대해서 언급하기 이전에 먼저 자바의 동시성 모델에 대해 간략하게 알고 가는 것이 좋다. 

 

Thread는 다바의 동시성 모델의 핵심이다. 

 

그런데 자바의 경우 Thread를 구현하기 위해 OS 커널을 사용하는데 이것이 오늘날의 동시성 요구사항에 있어서 부족한 점이 있으며 문제점이 존재한다고 한다.

 

1. 어플리케이션의 경우 수백만의 트랜잭션을 겪는데 그에 비해 OS 커널에서 지원되는 스레드의 개수는 그에 비해 너무 적다는 점이다. 그래서 모든 유저를 위한 트랜잭션 및 세션은 종종 불가능하다고 한다. 

2. 모든 동시성 어플리케이션은 동기화가 필요한데 OS 스레드 상에서 값비싼 컨텍스트 스위칭 비용이 발생한다고 한다. 

 

물론 이러한 문제에 대한 해결 방법으로 Asynchronous concurrent API 인 CompletableFuture 혹은 RxJava를 쓰는 방법이 있다고 한다. 이러한 해결책은 커널 스레드를 블락하지 않아서 애플리케이션에 훌륭한 동시성을 제공한다고 한다. 하지만 다른 방법도 있는데 위의 해결책이 사실 디버깅도 힘들고 레거시와 붙기도 어렵기에 커널 스레드와 독립적인 좀 더 가벼운 동시성을 구현할 필요가 있다고 한다. 

 

어떤 스레드던 그것이 가볍던 무겁던 간에 두 개의 구조로 되어있다고 한다. 

1. Task - Blocking 작업을 위해 스스로 유뵤할 수 있는 일련의 작업

2. Scheduler - CPU 에 작업을 할당 및 재할당할 수 있는 구조 

 

그런데 이 일련의 작업을 중지하려면 모든 call-stack을 저장해야 한다. 또한 재개할때도 다시 불러와야하는데 이게 꽤 큰 오버헤드가 될 수 있다고 한다. 

 

Project Loom을 진행하는 이유?

공식 문서를 보면 다음과 같은 내용이 나온다. 

하나의 서버에서 수백만 개의 소켓을 다룰 수 있지만 OS 스레드를 직접적으로 사용하는 자바에서는 동시에 수천 개 이상의 요청을 효율적으로 다루기 어렵다. 이를 극복하기 위해 최근 수년 간 많은 비동기 라이브러리들이 탄생했는데 이것이 작성하고 이해하고 디버깅하기 편해서가 아니라 단지 자바의 스레드가 성능면에서 효율적이기 못하기 때문이다. 

 

Loom의 목표는 수백만 개를 생성할 수 있는 파이버라고 불리는 경량 스레드를 제공하여 어플리케이션 개발자들이 비용이 거의 제로에 가까운 동기 블로킹 코드를 마음껏 사용하고 라이브러리 개발자들이 더 이상 동기 / 비동기 API 를 둘 다 제공할 필요가 없게 하는 데 있다.

 

 우리가 비동기 프로그래밍을 하는 이유는 주로 성능때문이라고 한다. 

그런데 비동기 프로그래밍에도 단점이 존재한다.

1. 제어 흐름을 잃는다.

2. 컨텍스트를 잃는다.

3. 전염성이 있다. 

 

첫번째의 이유는 비동기 프로그래밍에서는 간단한 제어 흐름조차 복잡하게 짜야한다고 한다. 또한 읽기도 어렵고 이 스타일을 만들어내기 위해서 많은 비용이 발생한다고 한다. 

두번재는 컨텍스트를 잃는다인데 이건 어떤 요청을 처리하기 위해 거쳐 온 컨텍스트가 Stack trace에 유지되지 않는 것을 의미한다고 한다. 그래서 비동기 프로그래밍에서는 스레드를 넘나들며 요청이 처리되서 이에 대한 컨텍스트가 Stack trace에 쌓이지 않는다고 한다. 

세번째는 전염성인데 이게 가장 큰 문제라고 한다. 쉽게 말해 동기 함수와 비동기 함수 사이에 거대한 벽이 있어서 상호 연동이 쉽지 않은 문제라고 한다. 


아래 블로그에서 많은 도움을 받았습니다. 

 

감사합니다. 

 

https://www.baeldung.com/openjdk-project-loom

https://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html

 

Loom Proposal.md

Project Loom: Fibers and Continuations for the Java Virtual Machine Overview Project Loom's mission is to make it easier to write, debug, profile and maintain concurrent applications meeting today's requirements. Threads, provided by Java from its first da

cr.openjdk.java.net

http://gunsdevlog.blogspot.com/2020/09/java-project-loom-reactive-streams.html

 

Java의 동시성 개선을 위한 Project Loom은 reactive streams를 대체할 것인가?

Java Project Loom 동시성 개선

gunsdevlog.blogspot.com