Thread의 종류(하드웨어 Thread, 커널 레벨 Thread, 유저 레벨 Thread)

Chan Young Jeong·2023년 1월 24일
1

운영체제

목록 보기
5/11
post-thumbnail
post-custom-banner

(이 포스트는 기본적으로 아래 영상을 보고, 정리하는 글입니다.
https://www.youtube.com/watch?v=vorIqiLM7jc&t=491s)


요즘 스레드에 대해서 공부하고 있는데 의문이 생겼다.
"내 컴퓨터의 CPU의 코어의 개수는 한정 되어 있는데 어떻게 컴퓨터는 수많은 프로그램을 실행시킬 수 있을까..?" 그리고 이를 찾아보면서 다양한 종류의 스레드가 있다는 것을 알았고 이를 정리해보고자 한다.

하드웨어 Thread

  • CPU CORE 내에 Thread를 의미한다. 일반적으로 1 CORE - 1 Thread이지만 CPU 아키텍쳐의 발달과 효율적으로 자원을 사용하기 위해 SMT(Simultaneous Multi Threading, AMD) 또는 HT(Hyper Threading,인텔) 기술을 이용하여 가상의 스레드라는 개념이 추가되어 1 CORE 2 Thread로 구성.
    (물론 그 이상으로 발전 할 수 있습니다.)
  • OS 관점에서 보면 가상의 코어임

  • 인텔 i9 CPU , 10개 코어에 20개 스레드로 구성되어 있음. 물리적으로는 10개 코어이지만 OS가 인식할 때는 20개의 논리적인 코어로 인식.

이를 비유하면, 어떤 사람이 꽃집을 운영한다고 하면 코어는 전화 주문을 받는 상담원이고, 상담원은 주문서를 정리하여 스레드인 플로리스트에게 넘기고, 플로리스트가 일을 하여 꽃을 제작하는 것!

퀴즈

인텔 듀얼 코어 CPU에 Hyper Threading이 적용됐다면 하드웨어 스레드는 총 몇 개인가요?
4개, OS는 듀얼 코어가 아니라 쿼드 코어로 인식!


커널 수준 Thread

(네이티브 Thread, OS Thread, OS레벨 Thread라도도 함.)

  • 커널 레벨에서 생성되는 스레드이다.
  • 운영체제 시스템 내에서 생성되어 동작하는 스레드로, 커널이 직접 관리한다.
  • CPU에서 실제로 실행되는 단위(CPU 스케줄링의 단위)

스케줄러가 스레드1, 스레드2, 스레드3을 직접 관리한다!

  • 각 스레드의 우선 순위가 동일하다고 가정하면 1/3 만큼 시간을 할당 받아 실행 될 것 임.
  • 스레드1이 IO 상태가 되어도 나머지 스레드2, 스레드3은 상관없이 스케줄링 되어 실행 된다.

퀴즈

하이퍼 쓰레딩이 적용된 인텔 듀얼 코어 위에서 동작한다면 8개의 커널 스레드들을 어떻게 코어에 균등하게 할당할 수 있을까?

사용자 수준 Thread

  • 스레드 개념을 프로그래밍 레벨에서 추상화 한 것!
  • 사용자 단에서 생성 및 관리되는 스레드이다.
    (그래서 커널이 따로 관리하지 않고, 커널이 이 스레드에 대해서 알지도 못한다.)
  • 유저 스레드가 cpu에서 실행되려면 커널 스레드와 반드시 연결돼야 한다.

  • 스케줄러가 직접 스레드를 관리 하지 않음! 스케줄러는 사용자 수준 스레드를 알 수 없고, 단순히 사용자 영역에서 작성한 코드로 인해 스레드가 실행 되는 것임.
  • 프로세스 A, 프로세스 B의 우선 순위가 동일하다고 가정하면 1/2만큼 시간을 할당 받아 실행 될 것 임. 따라서, 스레드1 과 스레드2 또한 우선 순위가 동일 하면 1/4 , 1/4 만큼 시간을 할당 받고 스레드3은 1/2 만큼 시간을 할당 받아 실행 된다.
  • 스레드1이 IO 상태가 되면 스레드2에 시간을 할당하는 것이 아님. 스케줄러는 스레드의 존재를 모르고 있기 때문에 단순히 프로세스A가 IO상태가 되었구나라고 생각하여 프로세스B(스레드3)를 실행시켜야 겠다고 생각함. => 이를 해결하기 위해 Non Blocking IO가 나옴.

커널 수준 Thread VS 사용자 수준 Thread 정리

커널 수준 Thread
장점: 커널에서 직접 제공하기 때문에 안정성과 다양한 기능성 제공
단점: 유저 모드에서 커널 모드로의 전환이 빈번하기 때문에 느림

사용지 수준 Thread
장점: 유저 모드에서 커널 모드로의 전환이 필요없기 때문에 빠름
단점: 프로세스 단위 블록킹 발생


유저 스레드가 cpu에서 실행되려면 커널 스레드와 반드시 연결돼야 한다.

이게 무슨 소린가? 기본적 CPU에서 실행되는 단위는 커널 스레드이기 때문! 따라서 유저 스레드는 반드시 커널 스레드와 연결이 되어야 하고, 그 후에 커널 스레드가 CPU에서 실행이 된다.

어떻게 연결이 되는가?

  1. One-to-One 모델
  • 유저 스레드(1) - 커널 스레드(1)
  • 스레드 관리를 OS에 위임
  • 스케줄링 또한 커널이 수행
  • 멀티코어를 잘 활용함
  • 한 스레드가 블락이 되어도 다른 스레드 잘 동작함
  • race condition 발생 가능
  • 자바 1.2 이후부터 사용 중인 방식

  1. Many-to-One 모델
  • 유저 스레드 (다) - 커널 스레드(1)
  • 커널 개입 없이 유저 스레드끼리의 스위칭이 발생하기 때문에 one-to-one 모델보다 빠르다.
  • race condition 발생 가능성 적음
  • 결국 실제로 동작하는 건 커널 스레드 하나 이기 때문에 멀티 코어를 활용 못함
  • 한 스레드가 블락이 되면 모든 스레드 블락 됨
  • Block 방지를 위해 non Block I/O 방식을 진행한다

  1. Many-to-Many 모델:
  • 1,2 모델을 보완
  • 구현 복잡

결론[4]

하드웨어 스레드 === CPU 레벨 용어

커널 스레드 === 커널 레벨 용어

User 스레드 === 프로그래밍 언어 혹은 프로그래밍 언어의 virtual machine 용어 (JVM 등)

출처

이미지 출처-플로리스트 비유
이미지 출처-커널 수준 스레드, 사용자 수준 스레드
쉬운코드-유튜브
한빛미디어-유튜브
Hello Inyong-티스토리
자바로 배우는 프로그래밍
[4] 일단은 내 이야기-티스토리

post-custom-banner

0개의 댓글