변수의 기록

(OS) 스레드의 종류 (하드웨어, OS, 유저 , 그린 ,커널) 본문

CS지식/운영체제 (Operating System)

(OS) 스레드의 종류 (하드웨어, OS, 유저 , 그린 ,커널)

불광동 물주먹 2025. 4. 14. 23:32

운영체제와 스레드 - 하드웨어부터 유저 스레드까지


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에 넣고 정리해둘게.
   ↓
[하드웨어 스레드] : 명령어 받았음. 실행 고고. 다음 타임슬라이스까지 작업 ㄱㄱ.