해당 포스트는 쉬운코드님의 유튜브 영상을 정리한 내용입니다.
Hardware thread
- 인텔의 hyper-threading
- 하드웨어 쓰레드는 OS관점에서는 가상의(logical) 코어
- 만약 싱글 코어 cpu에 하드웨어 쓰레드가 2개라면 os는 이 cpu를 듀얼 코어로 인식하고 듀얼 코어에 맞춰서 os레벨의 쓰레드들을 스케줄링 한다.
OS thread
- os 커널 레벨에서 생성되고 관리되는 쓰레드
- cpu에서 실제로 실행되는 단위, cpu 스케줄링의 단위
- os 쓰레드의 컨텍스트 스위칭은 커널이 개입 → 비용 발생
- 사용자 코드와 커널 코드 모두 os 쓰레드에서 실행된다.
- os 쓰레드는 다음과 같이 불리기도 한다.
- native 쓰레드
- 커널 쓰레드
- 커널 레벨 쓰레드
- os 레벨 쓰레드
User thread
User thread와 OS thread의 관계 모델

One-to-One 모델 (Java)
- 유저 쓰레드와 os 쓰레드를 1:1로 연결시킨다.
- 쓰레드 관리를 os에 위임한다.
- 스케줄링도 커널이 수행
- 멀티코어를 잘 활용할 수 있는 모델
- 한 쓰레드가 블락되어도 다른 쓰레드들은 문제없이 동작한다.
- race condition 발생 가능성 있음
Many-to-One 모델
- 여러 개의 유저 쓰레드를 하나의 os 쓰레드에 연결시킨다.
- 컨텍스트 스위칭이 유저레벨에서만 일어나기 때문에 커널의 개입이 없다. → 더 빠른 스위칭
- 유저 쓰레드간의 스위칭이 one-to-one 모델에 비해 더 빠르다.
- race condition이 일어나는 경우가 유저 레벨에 한정되므로 일어날 가능성이 적어진다.
- os 쓰레드가 하나이기 때문에 멀티코어를 활용할 수 없다.
- 한 쓰레드가 블락되면 모든 쓰레드들도 블락된다. (커널 쓰레드가 블락되므로)
- 이 문제를 해결하기 위해 non block io 사용
Many-to-Many 모델
- One-to-One과 Many-to-Many 각각의 장점을 합친 방식
- 구현이 복잡한 어려움이 있다.

OS와는 독립적으로 유저 레벨에서 스케줄링되는 스레드를 그린 스레드라고 부른다.
일반적으로 다른 수식어 없이 단순히 ‘스레드’라고 한다면 보통은 os 스레드를 말하거나 os 스레드와 1:1로 매핑되는 유저 스레드로 이해하면 된다.
os와 별개로 유저 레벨에서 자체적으로 관리되고 스케줄링 되는 스레드는, 유저 스레드 혹은 그린 스레드로 불린다.