WIPIVERSE

그린 스레드

그린 스레드(Green Thread)는 운영 체제(OS)의 커널 스레드(Kernel Thread)에 의존하지 않고, 사용자 공간(User Space)의 런타임 라이브러리나 가상 머신(VM)에 의해 관리되고 스케줄링되는 스레드 구현 방식을 가리킨다.

주요 특징

  • 사용자 수준 스케줄링: 스레드 생성, 소멸, 문맥 교환(Context Switching), 동기화 등의 모든 관리 작업이 커널 개입 없이 사용자 공간에서 이루어진다.
  • 경량성: 커널 스레드에 비해 생성 및 관리 오버헤드가 낮아 수만 개 이상의 스레드를 동시에 운영하는 것이 비교적 용이하다.
  • 이식성: 운영 체제의 스레드 지원 여부나 구현 차이와 관계없이 가상 머신이나 런타임만 포팅되면 동일하게 동작한다.

동작 원리 런타임 시스템은 하나의 프로세스 내에서 다수의 그린 스레드를 다중화(Multiplexing)하여 소수의 커널 스레드(또는 단일 커널 스레드) 위에서 실행한다. 입출력(I/O) 작업이나 시스템 콜이 발생하면, 논블로킹(Non-blocking) I/O나 비동기 I/O를 사용하여 해당 그린 스레드를 일시 중단하고 다른 실행 가능한 그린 스레드로 제어권을 넘기는 방식으로 블로킹을 회피한다.

장단점

  • 장점: 컨텍스트 스위칭 비용이 낮고, 메모리 사용량이 적으며, 개발자가 스레드를 수만 개 단위로 자유롭게 생성할 수 있다.
  • 단점: 단일 커널 스레드 위에서 동작하는 경우(N:1 모델), 멀티코어 프로세서의 병렬 처리 능력을 활용할 수 없다. 또한, 하나의 그린 스레드가 블로킹 시스템 콜을 호출하면 프로세스 전체가 중단될 수 있어 런타임 차원의 비동기 I/O 지원이 필수적이다.

주요 적용 사례

  • 자바(Java): JDK 1.1까지 솔라리스(Solaris) 환경에서 기본 스레드 모델로 사용되었으나, JDK 1.2부터 네이티브 스레드(Native Thread)로 전환되었다.
  • 고(Go) 언어: 고루틴(Goroutine)은 그린 스레드와 유사한 개념이나, 런타임이 M:N 스케줄러를 통해 다수의 커널 스레드 위에 분산 실행하므로 병렬 처리가 가능하다.
  • 얼랭(Erlang) / 엘릭서(Elixir): 프로세스(Process)라는 이름으로 초경량 그린 스레드를 구현하여 높은 동시성을 보장한다.
  • 파이썬(Python): greenlet, gevent, eventlet 등의 라이브러리를 통해 그린 스레드(그린렛) 패턴을 지원한다.
  • 루비(Ruby): MRI(Matz's Ruby Interpreter) 1.8 버전까지 그린 스레드를 사용했으며, 1.9부터 네이티브 스레드를 채택했으나 GIL(Global Interpreter Lock)로 인해 동시 실행은 제한적이다.
둘러보기

더 찾아볼 만한 주제

    전체 문서 보기