[ CS / Language ] Green Thread의 시대는 오는가

Lutica_·2024년 12월 30일

Green thread에 대해서

  • 운영체제를 해보았다면, 스레드라는 작업단위에 대해 들어보았을 것이고, multi-thread를 통해서 parallel computing에 대해 어느정도 들어는 보았을 것이다.

  • 그런데, 이것을 Managed Language에 대입해서 적용할 때, 여러 가지 고려사항이 생긴다. 이 중에서도 운영체제 차원의 스레드와는 조금 다른 개념인 "Green Thread"에 대해 이해하는 것이 중요하다.

  • 이 포스트에서는 대략적인 기조를 바탕으로 Green Thread가 무엇인지, 그것이 전통적인 OS-level Thread와 어떻게 다른지, 그리고 장단점 및 실제 사용 사례를 간단히 알아볼 것이다.

Green Thread란 무엇인가?

  • Green Thread는 운영체제에서 직접 관리되는 스레드(OS-level Thread)와는 달리, 언어 런타임이나 가상 머신(Virtual Machine)에서 관리되는 경량 스레드이다.
  • Green이라는 이름은 Java의 전신인 Green Project에서 유래했다. 물론 결과적으로 자원 효율적(Green)이기도 하다
  • 운영체제의 도움 없이 런타임에서 직접 스레드의 스케줄링과 관리를 수행하기 때문에, Green Thread는 운영체제의 제약 없이 실행 환경에 맞게 최적화될 수 있다.
  • 이를 통해 더 빠르고 가벼운 문맥 전환(Context Switching)이 가능해지고, 높은 수준의 병렬 처리를 지원한다.

코루틴과의 비교

  • 코루틴(Coroutine)은 함수 실행을 일시 중단하고 다시 시작할 수 있는 개념으로, Green Thread와 유사하게 동시성 프로그래밍에 활용된다. 실행 상태를 보존할 수 있기 때문에 복잡한 비동기 흐름을 단순화하며, 직관적인 코드 작성을 가능하게 한다.
  • 시간에서 한 스레드 내부를 양보yield하는 것이 코루틴의 핵심 역할이다.

Event loop와의 차이

  • Event loop는 동시성 관리를 위한 또 다른 기법으로, 단일 스레드에서 작업 큐의 이벤트를 순차적으로 처리한다.
  • Event Loop는 함수들의 EventTrigging으로 하나의 Loop를 만들어서 그것들이 반복된다고 해석하면 된다.
  • JavaScript의 Runtime이 가장 대표적인 예시인데, 한 함수를 만약 spin lock형식으로 구현하였다면 안움직이는 문제가 발생 할 것이다. (이는 한 이벤트가 너무 긴 시간을 점거하기 때문이다 !)

장점과 단점

장점

  • 가벼운 리소스 사용: Green Thread는 가상 메모리와 스택 크기가 작아 자원 효율적이다.
  • 빠른 생성 및 소멸: OS Thread보다 생성과 소멸 속도가 훨씬 빠르다.
  • 효율적인 I/O 처리: 비동기 작업과 결합하면 I/O Bound 작업에서 매우 높은 성능을 발휘한다.

단점

  • 제한된 병렬 처리 (M:1 모델의 경우): 초기의 Green Thread(Python, Ruby 등)는 한 번에 하나의 CPU 코어만 사용할 수 있어 병렬 처리에 한계가 있었다.

    최근의 Go나 Java Virtual Thread 같은 M:N 모델은 이 단점을 극복하고 멀티 코어를 활용한다.

  • 운영체제 최적화 부족: 운영체제의 스레드 최적화 혜택을 받지 못한다.

OS Thread와의 차이점

관리 주체

  • OS Thread는 운영체제가 직접 관리하며, CPU 코어와 1:1 매핑되거나 스케줄링된다.
  • 이에 반해 Green Thread는 언어 런타임이나 VM에서 관리되며, 운영체제가 관여하지 않는다.

문맥 전환 비용

  • OS Thread는 문맥 전환 시 운영체제 커널 레벨에서 개입하기 때문에 상대적으로 무겁다.
  • Green Thread는 런타임 수준에서 처리되므로 문맥 전환 비용이 낮다.

병렬 처리

  • OS Thread는 다중 코어를 활용한 병렬 처리가 가능하다.
  • Green Thread는 한 번에 하나의 코어만 사용할 수 있어 병렬 처리에는 한계가 있지만, I/O Bound 작업에서는 큰 이점을 제공한다.

최근 언어들의 동향

최근 Modern 언어들이 다시금 Green Thread model을 도입하고 있다.

JVM 진영

JDK 21부터, Virtual Thread라는 기능으로 업그레이드 되었다.
기존 Green ThreadNative Thread 1개와 유저가 지정한 태스크 N개였다면,
Virtual ThreadNative Thread M개와 유저가 지정한 태스크 N개의 차이가 있다.
초기의 Green Thread(M:1)는 병렬 처리가 불가능했으나, 최근의 Virtual Thread나 Goroutine(M:N)은 런타임 스케줄러가 여러 OS 스레드를 활용하여 진정한 병렬 처리를 지원한다.

.NET 진영

도입을 검토중이다. 다만 회의적인 결과 1 로 인하여 조금 느릴것이다.
1 : async-await보다 느린 green thread async-await보다 느린 green thread를 볼 수 있다.

  • 다만, 현존하는 Task class와 헷갈릴 수 있다.
  • 이 둘의 차이는 async/await 기반이냐 아니면 thread 기반이냐의 차이로서, task는 대기 가능이라는 속성을 가지지만 green thread는 그렇지 않단 특성을 가지는 것이 특징이다. (Function Color 문제를 해결할 수 있다.)
    Thread class와 비교하는 것이 올바른 것으로 생각된다만, 솔직히 의미가...?

Modern C++

c++ 20부터 추가된 Coroutine를 통해서 유사하게 사용가능하다
다만, C#혹은 JSasync-await와는 차이가 있음을 알아두어야 한다.

결론

  • Green Thread는 가볍고 효율적이며, 동시성 프로그래밍에서 특히 유용하다.
  • 그러나 실제적인 연산이 동원되는 CPU Bound 작업에서는 성능 한계가 있으므로, 활용 시 장단점을 고려해야 한다.
  • 현대 언어와 프레임워크는 Green Thread 또는 유사한 개념을 지원하며, 이를 잘 활용하면 애플리케이션 개발에서 큰 이점을 얻을 수 있다.
profile
해보고 싶고, 하고 싶은 걸 하는 사람

0개의 댓글