변수의 기록
(OS) 스레드의 종류 (하드웨어, OS, 유저 , 그린 ,커널) 본문
운영체제와 스레드 - 하드웨어부터 유저 스레드까지
1. 하드웨어 스레드 (Hardware Thread)
문제의 출발점
코어는 연산 능력이 빠르지만, 메모리에서 데이터를 가져오는 속도는 상대적으로 느림.
메모리 I/O 대기 시간 동안 CPU가 놀고 있다면 자원 낭비!
해결책
하드웨어 스레드(예: 인텔 하이퍼 스레딩)
- 하나의 물리 코어에 둘 이상의 하드웨어 스레드를 넣어 동시에 여러 스레드를 실행할 수 있게 함
- 즉, 하나의 코어가 여러 작업을 병렬처럼 수행 ( os는 이 cpu 를 듀얼코어로 인식, 듀얼 코어에 맞춰서 os 레벨의 스레드들을 스케줄링 한다.)
예시
💡 듀얼 코어(Intel Dual-Core)에 하이퍼스레딩이 적용되면?
→ 하드웨어 스레드는 총 4개
→ OS는 이를 4개의 CPU처럼 인식하고 스케줄링

2. OS 스레드 (Kernel-Level Thread)
정의
운영체제 커널이 직접 생성하고 관리하는 스레드 (cpu에서 실제로 실행되는 단위 , cpu 스케줄링의 단위 )
→ 네이티브 스레드, OS 스레드, 커널 스레드, 커널-레벨 스레드로도 불림
특징
- 실제 CPU에 할당되어 실행되는 단위
- OS의 CPU 스케줄러가 직접 스케줄링 ( OS 스케줄러가 TID 단위로 스레드를 관리하고 CPU (하드웨어 스레드) 에 어느 시점에 실행할지 결정 )
- 컨텍스트 스위칭 시 커널이 개입 → 비용이 발생함
PCB (프로세스 제어 블록): 하나의 프로세스 전체 정보
TCB (스레드 제어 블록): 커널 스레드의 문맥 정보
PCB/TCB는 커널이 직접 관리하고,
OS 스레드가 필요 시 참조하거나 갱신하지만, 직접적으로 "TCB를 운영"하는 주체는 커널
질문
💡 OS 스레드가 8개, 듀얼코어 하드웨어(하이퍼스레딩 포함)라면?
→ 4개의 하드웨어 스레드에 OS 스레드를 라운드로빈 방식이나 부하 기반 스케줄링으로 적절히 배분

3. 유저 스레드 (User-level Thread)
정의
- 애플리케이션 레벨에서 관리되는 논리적 스레드 ( 스레드 개념을 프로그래밍 레벨에서 추상화 한것. )
- OS가 직접 알지 못함
- 대표적인 예: Java의 Thread 객체 (내부적으로 JNI로 OS 스레드와 연결됨)
특징
유저 스레드는 직접 CPU에 올라갈 수 없음
→ 반드시 OS 스레드에 매핑되어야 함 (유저 스레드가 cpu에서 실행되려면 os 스레드와 반드시 연결돼야 한다.)
4. 유저 스레드와 OS 스레드 매핑 모델
1. One-to-One (1:1)
- 유저 스레드 1개 ↔ OS 스레드 1개
- 각 스레드가 독립적으로 OS에 의해 관리됨 ( One-to-One이면 OS 스레드가 하나 생성됨 (→ 커널에 등록됨) )
- ✅ 멀티코어 활용 O, ✅ 하나 블락되어도 다른 스레드 실행 O
- ❗ 레이스 컨디션 주의 필요!!
- 자바, POSIX pthread 기본 모델

2. Many-to-One (N:1)
- 여러 유저 스레드 ↔ 하나의 OS 스레드
- 유저 레벨에서 스케줄링 → 커널 개입 없음
- ✅ 컨텍스트 스위칭 빠름
- ❌ 멀티코어 활용 불가
- ❌ 하나의 유저 스레드가 블락되면 전체 블락됨 (한 유저 쓰레드가 블락 io 시 -> os 쓰레드도 블락 io 되기에 모든 유저 쓰레드 사용 불가.)
- ✅ 레이스 컨디션 낮음
- 초기 자바 VM(Green Thread) 사용

3. Many-to-Many (N:M)
- 여러 유저 스레드 ↔ 여러 OS 스레드
- ✅ 유연한 매핑, ✅ 블락에도 대응, ✅ 멀티코어 활용
- ❗ 구현이 복잡함
- 💡 Go 언어가 사용하는 Goroutine이 대표적


5. Green Thread
📌 자바 초창기 JVM에서 사용한 스레드 모델
- OS와 독립적으로 유저 레벨에서만 스케줄링
- 내부적으로는 many-to-one 모델
- CPU가 하나뿐이던 시대에 적합했으나, 멀티코어 환경에서 한계가 있어 폐기됨

커널 스레드의 또 다른 의미
📌 문맥에 따라 다르게 사용됨
- 일부 문서에서는 "커널이 생성한 OS 스레드"를 의미
- 다른 문맥에서는 "커널 기능 자체를 수행하는 스레드"로 사용됨
→ 예: 커널 내에서 파일 I/O, 인터럽트 처리 등을 수행하는 전용 스레드
유저 스레드 vs 코루틴
📌 유저 스레드는 CPU 스케줄링 대상이 아니고, 직접 스위칭이 필요
📌 코루틴은 유저 레벨에서 스레드보다 더 가벼운 개념의 협력적 작업 단위
- 스케줄링은 전적으로 프로그래머가 제어
- 대부분 싱글 스레드 기반, 논블로킹 I/O 처리에 유리
- 자바스크립트 async/await, Kotlin Coroutine, Python asyncio 등이 이에 해당
마무리 정리
분류 | 특징 | 컨텍스트 스위칭 | 멀티코어 활용 | 스케줄링 |
하드웨어 스레드 | CPU 내부의 물리적 스레드 | 매우 빠름 | O | 하드웨어 |
OS 스레드 | 커널이 관리 | 느림 (커널 개입) | O | OS 커널 |
유저 스레드 | 유저가 관리 | 빠름 (커널 미개입) | 모델에 따라 다름 | 유저 공간 |
한줄 정리
[유저 스레드] : 나 일할래~!
↓
[OS 스레드] : 알았어, 일 시켜줄게. 내가 너 대신 CPU에 말 걸게.
↓
[커널] : 오케이. 네 요청 받은 거 이 PCB/TCB에 넣고 정리해둘게.
↓
[하드웨어 스레드] : 명령어 받았음. 실행 고고. 다음 타임슬라이스까지 작업 ㄱㄱ.
'CS지식 > 운영체제 (Operating System)' 카테고리의 다른 글
(OS) Thread Per Request vs Thread Pool 모델 정리 (쓰레드 비교) (0) | 2025.04.15 |
---|---|
(os) 커널이란 무엇인가? (예시 포함 아주 쉽게 설명) (0) | 2025.04.15 |
(OS) 유저 모드와 커널 모드, 그리고 인터럽트와 시스템 콜 (예제 있음) (1) | 2025.04.13 |
(OS) CPU 스케줄러와 디스패처, 그리고 스케줄링 알고리즘 총정리 (0) | 2025.04.13 |
(OS) 자바 스레드의 상태 – OS 프로세스 상태 비교 (0) | 2025.04.13 |