🤖 Computer Science

Thread

정의

notion image
가벼운 프로세스 CPU의 기본 수행 단위

목적

  • 하나의 프로세스가 동시에 여러 작업을 수행하기 위함
    • 프로세스의 컨텍스트 스위칭은 무거운 작업이기 때문
    • 프로세스끼리 데이터 공유가 어려움
    • 멀티 코어 등장

장점

  • 응답성
  • 자원 공유 → 자원 절감
  • 경제성
    • 프로세스를 만들거나 Context Switch보다 비용, 오버헤드가 낮음
  • 다중 쓰레드로 구성된 태스크 구조에서, 하나의 서버 쓰레드가 Blocked(Waiting) 상태인 동안에도 동일한 태스크 내의 다른 쓰레드가 실행(Running)되어 빠른 처리 가능
  • 동일한 일을 수행하는 다중 쓰레드가 협력하여 높은 처리율(Throughput)과 성능 향상을 얻음
  • 쓰레드를 사용하면, 병렬성을 높일 수 있다.
    • 다중 프로세서 환경에서 쓰레드가 병렬로 실행 가능

구성

  • Program Counter
  • Register Set
  • Stack Space

동료 Thread와 공유하는 부분(Task)

  • Code Section
  • Data Section
  • OS Resources

특징

  • 같은 일을 하는 프로세스를 여러개 띄울 때, 주소공간을 하나로 공유하고, 여러개의 PC(Program Counter)로 서로 다른 부분의 코드를 실행
  • CPU에서 실행되는 단위(Unit Of Execution)
  • 프로세스는 한개 이상의 스레드를 가질 수 있다.
  • 같은 프로세스의 스레드끼리 컨텍스트 스위칭은 가볍다.
  • 스레드는 자신이 속한 프로세스 내에서 Code, Data, Heap 영역을 공유
  • 하지만 각자 자신의 Stack 영역을 보유 (최소한 자신의 레지스터 상태를 보유)

메모리 구조 비교

notion image
싱글 스레드 VS 멀티 스레드
  • 스택 포인터, 프로그램 카운터 각자 가지고 있음

멀티 쓰레딩

하나의 프로세스가 동시에 여러 작업을 실행

멀티 태스킹 개념의 확장

스레드가 등장하면서 멀티 태스킹의 개념이 확장됨
여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU 시간을 나눠 갖는 것

멀티 프로세싱

두개 이상의 프로세서나 코어를 활용하는 시스템

쓰레드의 종류

하드웨어 쓰레드

코어의 고민

메모리에서 데이터를 기다리는 시간이 오래 걸린다…
→ 메모리를 기다리는 시간에 다른 스레드를 실행하는건 어떨까?

인텔의 hyper threading

  • 물리 코어마다 하드웨어 스레드 두개
  • OS 관점에서는 가상의 논리 코어
  • 여러개 코어로 인식하고 그에 맞춰 OS 레벨의 스레드를 스케쥴링해줌

OS 스레드

OS Kernel 레벨에서 생성되고 관리되는 스레드
  • CPU에서 실제로 실행되는 단위, CPU 스케쥴링의 단위
  • 컨텍스트 스위칭은 Kernel이 개입 → 비용 발생(User mode → Kernel mode → User mode)
  • 사용자 코드와 커널 코드 모두 OS 스레드에서 실행됨
  • == 네이티브 스레드 == 커널 스레드 == 커널 레벨 스레드 == OS 레벨 스레드

유저 스레드

스레드 개념을 프로그래밍 레벨에서 추상화한 것
  • == 유저 레벨 스레드
  • 유저 스레드가 CPU에서 실행되려면 OS 스레드와 반드시 연결되어야 한다.

어떻게 연결할 것인가?

notion image
  • One to One model
    • Java
    • 스레드 관리를 OS에 위임 → Kernel이 스케쥴링 수행
    • 한 스레드가 block I/O 호출해도, 다른 스레드가 잘 동작
    • 멀티 코어 잘 활용함
    • but, race condition 발생 가능
  • Many to One model
    • 여러 유저 스레드가 하나의 OS 스레드에 맵핑
    • 유저 스레드간 컨텍스트 스위칭이 더 빠름
    • OS 스레드 레벨에서는 race condition 거의 발생 안함
      • 전반적으로 race condition 발생 가능성 적음
    • but, 멀티 코어 활용 못함
    • 한 유저 스레드가 block I/O 호출하면, 전체 유저 스레드가 block됨
  • Many to Many model
    • 위 두가지 모델의 장점을 합친 것
    • 대신 구현이 복잡

그린 스레드

  • Java 초기 버전은 Many to One 스레딩 모델을 사용함
  • 이 유저 스레드를 그린 스레드라 부름
  • 현재는 OS와 독립적으로 유저 레벨에서 스케쥴링되는 스레드
  • ~= 유저 스레드

커널 스레드가 OS 스레드와 다른 의미일 때

OS 커널의 역할을 수행하는 스레드

장점

단점

단점 극복 방법

예시

비교군과의 차이

  • 프로세스는 각자 프로세스간의 통신에 IPC가 필요하다.
    • 쓰레드는 쓰레드 간의 통신에 IPC가 필요하지 않다.
  • 각 프로세스는 Code, Data, Heap, Stack 영역을 각자 보유한다.
    • 쓰레드는 Code, Data, Heap 영역은 공유하고 Stack영역만 각자 보유한다.
  • 프로세스는 생성과 context switching에 많은 비용이 들어간다.
    • 쓰레드는 생성과 context switching에 적은 비용이 들어간다.