해당 포스트는 쉬운코드님의 유튜브 영상을 정리한 내용입니다.


Hardware thread

  • 인텔의 hyper-threading
    • 물리적인 코어마다 하드웨어 쓰레드가 2개
  • 하드웨어 쓰레드는 OS관점에서는 가상의(logical) 코어
  • 만약 싱글 코어 cpu에 하드웨어 쓰레드가 2개라면 os는 이 cpu를 듀얼 코어로 인식하고 듀얼 코어에 맞춰서 os레벨의 쓰레드들을 스케줄링 한다.

OS thread

  • os 커널 레벨에서 생성되고 관리되는 쓰레드
  • cpu에서 실제로 실행되는 단위, cpu 스케줄링의 단위
  • os 쓰레드의 컨텍스트 스위칭은 커널이 개입 → 비용 발생
  • 사용자 코드와 커널 코드 모두 os 쓰레드에서 실행된다.
  • os 쓰레드는 다음과 같이 불리기도 한다.
    • native 쓰레드
    • 커널 쓰레드
    • 커널 레벨 쓰레드
    • os 레벨 쓰레드

User thread

  • 유저 레벨 쓰레드라고 불리기도 한다.
  • 쓰레드 개념을 프로그래밍 레벨에서 추상화 한 것
    Thread thread = new Thead();
    thread.start();
  • 유저 쓰레드가 cpu에서 실행되려면 os 쓰레드와 반드시 연결돼야 한다.

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와 별개로 유저 레벨에서 자체적으로 관리되고 스케줄링 되는 스레드는, 유저 스레드 혹은 그린 스레드로 불린다.

0개의 댓글