본문 바로가기
컴퓨터공학/운영체제

[운영체제?] 스레드의 종류(하드웨어스레드, 커널레벨스레드, 유저레벨스레드)

by 독서왕뼝아리 2023. 9. 10.

하드웨어 스레드

일단은 우리가 알고 있는 스레드 개념은 잊자

 

코어의 고민 : 메모리에서 데이터를 기다리는 시간이 오래 걸려… 메모리를 기다리는 동안 다른 스레드를 실행하는 건 어떨까?

메모리에 접근하는 과정 중간중간 다른 연산을 처리하자 (코어 사용률 극대화)

인텔의 hyper-threading : 물리적인 코어마다 하드웨어 스레드가 두 개

 

  • OS 관점에서 가상의 코어

ex) 싱글 코어 CPU에 하드웨어 스레드가 두 개 라면 OS는 CPU를 듀얼 코어로 인식

 

 

소프트웨어 스레드

커널 레벨 스레드

CPU에서 실제로 실행되는 단위, CPU 스케쥴링의 단위

OS 쓰레드의 컨텍스트 스위칭은 커널이 개입하기 때문에 비용이 발생

또는

OS 커널의 역할을 수행하는, 커널 코드를 실제 실행하는 쓰레드

 

 

유저 레벨 스레드

쓰레드 개념을 프로그래밍 레벨에서 추상화한 것

따라서 유저 쓰레드가 CPU에서 실행되려면 커널 쓰레드와 반드시 연결돼야 한다!!

 

유저 쓰레드와 OS 쓰레드를 어떻게 연결시킬 것인가?

one-to-one model

OS쓰레드와 일대일 맵핑

👍🏻스케쥴링 커널이 수행, 멀티코어 활용, 한 쓰레드 블락돼도 다른 쓰레드 잘 동작

👎🏻race condition 가능성 있음

 

many-to-one model

여러 유저스레드-하나 OS스레드 맵핑
👍🏻유저 스레드 간 스위칭이 빠름, OS 레벨에서 race condition 발생 가능성 (거의) 없음. 물론 유저 레벨은 가능
👎🏻멀티코어 활용 못함, 하나 스레드 블락 → 연결된 OS 스레드 블락 → 전체 쓰레드 블락

 

many-to-many model

👍🏻적절한 맵핑 ㅇㅅㅇ..

👎🏻각각의 장점 차용 구현 복잡함

 

또는

OS와 독립적으로 실행되는 유저 쓰레드도 존재

같은 용어를 사용하니까 맥락을 잘 파악하는 게 중요

 

+ Green Thread

자바 초창기 버전에서 many-to-one 스레딩 모델을 사용했었음. 이때 유저스레드들을 그린 쓰레드라고 함

→ 계속 의미가 확장돼서 OS와는 독립적으로 유저 레벨에서 스케쥴링 되는 쓰레드를 의미함 (이유는 모름)

마찬가지로 기술 문서에 쓰여있다? 맥락으로 확인하길

 


Thread Pool

Thread를 허용된 개수 안에서 사용하도록 제한하는 시스템

사용하지 않으면 발생하는 문제

  1. 작업 요청이 들어올 때마다 스레드를 생성 비용 문제 (자바에선 커널과 1:1 매핑)
  2. 스레드 많이 생성하면 오버헤드, 작업 지연

 

  • 스레드 풀에 작업 요청이 들어오면 큐에 적재, 스레드들이 작업들을 수행
  • 스레드를 재사용 가능하다는 게 특징
  • 사용할 스레드를 제한하기 때문에 오버헤드 문제가 덜 함!!

 

와! 스레드 풀은 무한정으로 task를 받아도 되나요?

아니오

메모리 터지기 싫으면 작업 큐의 사이즈를 제한해 두어야 함

 

그럼 여기서 질문! 스레드 풀의 스레드는 몇 개가 적당할까요?

코어 개수와 Task의 성향에 따라 다릅니다.

 

Task가 주로 CPU를 사용한다면 스레드가 많아도 CPU가 처리할 수 없겠죠? 메모리 낭비를 하게 됩니다.

반대로 IO 대기시간이 긴 Task들인데 스레드가 적으면 CPU가 실행할 스레드가 없게 됩니다.

 

Cpu Bound Task라면 코어 개수 정도 또는 코어보다 한두 개 많은 정도

IO Bound Task라면 코어 개수보다 N배 정도 (경험적으로 찾아야 함)

 

 

 

참고

갓갓쉬운코드님

https://www.youtube.com/watch?v=vorIqiLM7jc&ab_channel=쉬운코드

https://www.youtube.com/watch?v=B4Of4UgLfWc&ab_channel=쉬운코드