카테고리 없음

[TIL] Thread 종류

s00ng 2025. 3. 3. 08:10

컴퓨터 시스템 구성도

  • User Mode
    • Process 가 동작하는 영역
  • OS Kernel
    • OS가 H/W 자원을 제어하기위해 사용되는 공간
  • H/W
    • PC에 연결된 하드웨어들의 집합 (SSD, CPU, LAN card 등)

 

Hardware Thread

Core 의 사용률을 극대화시키기 위해 개발된 물리적인 Thread이다.
  • CPU 관점에서 Core에서 수행하는 연산 작업 시간보다 메모리에 데이터를 반영하는 시간이 길다는 문제가 있었음
  • 메모리를 기다리는동안 다른 작업을 수행할 수 있도록 하자
  • Intel → Hyper-Threading
    • 물리적인 코어마다 하드웨어 스레드를 2개씩 두는 모델
  • OS 관점에서 Hardware Thread가상의 코어이다.
  • 만약, Single Core CPU에서 H/W Thread가 2개라면 OS는 이 CPU를 듀얼 코어로 인식하고 듀얼 코어에 맞춰서 OS 레벨의 스레드들을 스케줄링한다.

 

OS Thread

OS Thread는 OS Kernel Level에서 생성되고 관리되는 스레드이다.
  • CPU에서 실제로 실행되는 단위, CPU 스케줄링의 단위
  • OS Thread의 컨텍스트 스위칭은 커널이 개입하여 수행한다. → 비용 발생
  • 사용자 코드와 Kernel 코드 모두 OS 스레드에서 실행된다.
  • OS Thread 의 다른 이름
    1. Native Thread
    2. Kernel Thread
    3. Kernel-Level Thread
    4. OS-Level Thread

 

 

User Thread

User-Level Thread라고도 불리며 Thread 개념을 프로그램 레벨에서 추상화 한 것이다.
// User Thread
Thread thread = new Thread();
thread.start();
  • thread.start() 를 실행하면 다음과 같은 동작이 수행된다.
    1. start0 메서드 호출
    2. JNI 를 통해 OS system call 호출
    3. 운영체제가 Linux라면 clone이라는 system call 호출
    4. Linux에서는 OS Level Thread 생성
    5. 결국 User Thread - OS Thread가 연결됨
  • User Thread가 CPU에서 실행되려면 OS Thread와 반드시 연결되어야한다.
  • 다른 맥락에서는 User Mode에서 스케줄링되는 Thread로 표현되기도 한다.

 

 

User Thread와 OS Thread 연결 방식

1. One-to-One model

OS Thread와 User Thread를 1대1 매핑시킨 방식

  • Java가 채택한 방식
  • Thread 관리를 OS에 위임한다
    • 스케줄링 또한 Kernel이 수행한다.
    • Multi-Core를 잘 활용한다는 특징이 있다.
    • 하나의 Thread가 Block이 되더라도 다른 스레드는 별도의 OS Thread에서 잘 동작한다.
  • Race Condition 발생 가능성이 존재한다.

 

 

2. Many-To-One model

여러개의 User Thread를 하나의 OS Thread에 매핑한 방식

  • 장점
    • context-switching이 User mode에서 일어나기때문에 빠르다.
    • User Thread가 여러개이더라도 실제 CPU는 하나의 OS Thread를 실행시키는 것으로 인식한다.
    • 또한, OS Thread를 하나만 사용하기 때문에 Race Condition 발생 가능성이 낮다.
  • 단점
    • 하지만 Multi-Core를 잘 활용하지 못한다는 특징이 있다.
    • Block I/O 호출시 다른 모든 User Thread도 Block 된다.
      • 따라서, Non-Blocking I/O를 사용하게된다.

 

 

3. Many-To-Many

여러 User Thread와 여러개의 OS Thread가 매핑되어 실행되는 형태

  • 앞선 모델의 장점들을 모두 합친 방식
  • 구현이 복잡하다는 단점이 있다.

 

Green Thread

  • Java 초창기 버전은 Many-To-One 스레딩 모델을 사용
  • 이 때 User Thread들을 Green Thread 라고 호칭
  • 최근에는 의미가 확장되어 OS와는 독립적으로 User-Level에서 스케줄링되는 스레드를 의미하기도 한다.