본문 바로가기

CS/운영체제

스레드 (Thread)의 종류

서론

스레드에 대해 강의를 통해 공부하다가 다양한 종류의 스레드가 있어 기억하기 위해 정리를 해보고자 한다.

 

하드웨어 스레드(Thread)

CPU 하드웨어 차원에서 제공하는 실행 단위이며, 흔히 SMT(Simultaneous Multithreading), Intel의 Hyper-Threading 같은 기술을 통해 하나의 물리코어가 여러개의 실행 파이프라인(스레드)을 동시에 지원할수 있게 된다.

 

예) 4코어 CPU가 각 코어당 2개의 하드웨어 스레드를 지원하면, OS 입장에서는 8개의 실행 단위(논리 코어)로 보임.

 

하드웨어 스레드는 물리적으로 “가상의 코어처럼 보인다”라고 표현할 수 있지만, 성능은 물리 코어 2개와는 다르다.

 

OS 스레드 (Software Thread)

커널(kernel)

OS 스레드를 이해하려면 먼저 커널(kernel) 개념을 알아야 한다.  

커널은 운영체제의 핵심으로, CPU·메모리·입출력 장치 등 하드웨어 자원을 관리하고,  

응용 프로그램이 하드웨어를 직접 다루지 않고도 동작할 수 있도록 중간에서 조율하는 역할을 한다.

 

OS 스레드란 ?

OS 스레드란 응용 프로그램에서 만든 스레드가 커널에 의해 직접 관리되는 실행 단위이다.  

예를 들어, 자바의 `Thread` 클래스나 C의 `pthread`를 호출하면 커널이 스레드를 생성하고 스케줄링한다.  

이 과정에서 컨텍스트 스위칭 시 커널이 개입하기 때문에 시간적 비용과 CPU 리소스가 소모된다.

 

즉, 사용자 코드가 실행될 때도 커널이 스케줄링과 자원 분배를 담당한다.

 

OS 스레드의 경우 아래와 같이 불리기도한다.

  • 네이티브 스레드 (Native Thread)  
  • 커널-레벨 스레드 (Kernel-Level Thread)  
  • OS-레벨 스레드 (OS-Level Thread)
  • 커널 스레드 (Kernel Thread)  

사용자 스레드 (User Thread)

사용자 스레드(User Thread)란 OS 커널이 직접 관리하지 않고,  사용자 공간의 라이브러리에서 관리되는 스레드이다.  

즉, 개발자가 사용하는 스레드 라이브러리(Java Green Thread, 일부 Coroutine 등)에서 제공하는 실행 단위라고 볼 수 있다.  

  • 장점: 문맥 전환(Context Switching)을 사용자 공간에서 처리하기 때문에 비용이 적다.  
  • 단점: 하나의 사용자 스레드가 Block 되면, 같은 프로세스 내의 다른 사용자 스레드도 함께 멈출 수 있다.

자바의 경우 Thread.start() → start0()를 들어가보면

public void start() {
    synchronized (this) {
        if (holder.threadStatus != 0)
            throw new IllegalThreadStateException();
        start0();
    }
}
private native void start0();

 

start0()JNI로 연결된 네이티브 메서드이며, JVM 내부의 JVM_StartThread(...)로 이어진다.

 

그다음 플랫폼 종속 레이어에서 실제 OS 스레드 API(예: 리눅스 pthread_create, 윈도우 CreateThread)를 호출해 커널이 관리하는 OS 레벨 스레드를 만든다.

이 과정에서 컨텍스트 스위칭은 커널이 개입하므로 시간·CPU 리소스 비용이 든다.

 

 

그린 스레드(Green thread)

그린 스레드(Green Thread)란 자바 초창기 버전(JDK 1.1 등)에서 사용된 용어이다.  

이는 Many-to-One 모델을 사용했으며, 여러 사용자 스레드가 하나의 OS 스레드 위에서 동작하도록 구현되었다.  

  • 장점: OS에 종속되지 않고 JVM 자체에서 스케줄링 가능 
  • 단점: 하나가 block 되면 전체가 멈추며, 멀티코어 활용 불가능 → 이후 자바 1.3부터 네이티브 스레드로 전환

 

경량 프로세스 (Lightweight Process, LWP)

경량 프로세스(LWP)는 사용자 스레드와 커널 스레드 사이에서 연결 고리 역할을 하는 실행 단위이다.

여러 사용자 스레드를 소수의 커널 스레드에 매핑할 때 중간 단계로 사용된다.

 

가상 스레드 (Virtual Thread, Project Loom – Java 21+)

가상 스레드란 Java 21에서 도입된 새로운 스레드 모델이다.

JVM이 직접 스케줄링하는 초경량 사용자 수준 스레드이며, 기존의 OS 스레드 기반 모델의 한계를 극복했다.

  • 장점: 수백만 개 스레드 생성 가능, 블로킹 I/O도 효율적으로 처리 → 고성능 동시성 프로그래밍 가능
  • 단점: 아직 신기술이라 디버깅·모니터링 생태계는 발전 중
Thread.ofVirtual().start(() -> {
    System.out.println("가상스레드입니다.");
});

 

마무리

 

정리해 보면, 스레드는 하드웨어 스레드, OS 스레드, 사용자 스레드, 그린 스레드,LWP, 가상 스레드 등으로 나눌수 있다.

각각 장단점이 있으므로, 상황에 맞게 이해하고 사용하는 것이 중요하다.

 

참고자료

 

 

JEP 444: Virtual Threads

JEP 444: Virtual Threads AuthorRon Pressler & Alan BatemanOwnerAlan BatemanTypeFeatureScopeSEStatusClosed / DeliveredRelease21Componentcore-libsDiscussionloom dash dev at openjdk dot orgRelates toJEP 436: Virtual Threads (Second Preview)Reviewed byAlex

openjdk.org