Post

OS, 스레드 관리

OS, 스레드 관리

스레드 관리

스레드(Thread)의 개념

프로세스는 일반적으로 자원을 할당받아 작업을 수행하는 개체다.
이 프로세스 내에서 실제 작업을 수행하는 제어 흐름 단위를 스레드(Thread) 라고 한다.

하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

스레드란?

alt text

스레드는 프로세스 내에서 독립적인 실행 흐름으로, 다음과 같은 고유 정보를 가진다:

  • 스레드 ID(Thread ID)
  • 레지스터 집합(Register Set) (Program Counter(PC), Stack Pointer(SP) 등)
  • 스택(Stack) (지역 변수 등 지역 데이터를 저장)

반면 코드, 전역 데이터, 힙과 같은 자원(Resource)은 같은 프로세스 내의 모든 스레드가 공유한다.

  • 스레드는 ‘경량 프로세스(Lightweight Process, LWP)’라고도 부른다.
    • 프로세스가 자원과 제어정보를 모두 가지고 있는 반면, 스레드는 제어 정보만 독자적으로 관리하고 자원을 공유하기 때문에 상대적으로 가볍다.
  • 프로세서(CPU)를 활용하는 기본 단위이다.
  • 기존의 전통적 프로세스는 하나의 단일 스레드로 구성된다.

스레드의 장점

  • 빠른 응답성(Responsiveness)
    일부 스레드의 작업이 지연되더라도 다른 스레드가 독립적으로 실행될 수 있기 때문에 사용자의 응답성이 향상된다.

  • 자원 공유와 경제성(Resource Sharing & Economy)
    여러 스레드가 프로세스의 자원을 공유하므로, 프로세스 간의 자원 경쟁과 그로 인한 문맥 교환(Context Switching)의 비용을 크게 줄일 수 있다.

    예를 들어, 서로 다른 프로세스가 동일 자원을 사용하려면 빈번한 Context Switching이 필요하지만, 스레드는 자원을 공유하기 때문에 Context Switching이 줄어들어 경제적이고 효율적이다.

  • 멀티 프로세서 활용(Multiprocessor Utilization)
    멀티코어 CPU 환경에서 스레드는 병렬적으로 작업을 처리하여 성능을 극대화할 수 있다.

스레드 사용 예시

만약 프로세스가 단일 스레드로 구성된 경우를 생각해 보자. 게임을 하는 중 화면에 출력 작업이 수행되는 도중, 사용자가 마우스를 움직이거나 키보드를 입력하면 화면 출력 작업은 일시적으로 중단된다.

왜냐하면 화면 출력과 마우스, 키보드 입력과 같은 I/O 작업은 모두 독립적인 작업인데, 프로세스가 하나의 스레드로만 동작하면 I/O가 발생할 때마다 해당 작업이 완료될 때까지 다른 작업은 대기해야 하기 때문이다.

하지만 프로세스를 여러 개의 스레드로 구성하면, 각각의 스레드가 화면 출력, 마우스 입력 처리, 키보드 입력 처리 등으로 분리되어 독립적으로 동작할 수 있으므로 서로 방해하지 않고 동시에 작업이 진행된다.
이는 사용자 응답성을 크게 향상시킨다.

스레드의 구현

스레드 구현 방식은 크게 두 가지로 나눌 수 있다.

  • 사용자 수준 스레드(User-Level Threads)
  • 커널 수준 스레드(Kernel-Level Threads)

사용자 수준 스레드 (User-Level Threads)

사용자 영역에서 제공되는 스레드 라이브러리에 의해 구현된다.

  • 스레드 생성, 스케줄링 등 모든 관리 작업이 사용자 영역에서 이뤄짐
  • 예시:
    • POSIX Threads (Pthreads)
    • Win32 Threads
    • Java Thread API 등

alt text

  • 사용자 스레드와 커널 스레드는 일대다(1:N)로 매핑됨
  • 커널은 사용자 스레드의 존재를 알지 못함

장점

  • 커널 개입이 없기 때문에 생성 및 관리의 부하가 적음
  • 운영체제에 종속적이지 않아 이식성이 뛰어남
  • 유연한 관리 가능

단점

  • 커널은 프로세스 단위로 스레드를 관리하므로, 하나의 사용자 스레드가 블록되면 해당 프로세스 내 모든 사용자 스레드가 실행 불가능 상태가 됨 (싱글 스레드 커널의 경우)

커널 수준 스레드 (Kernel-Level Threads)

커널 수준 스레드는 운영체제의 커널이 직접 관리하는 방식이다.

alt text

장점

  • 커널이 각 스레드를 개별적으로 인식하고 관리함
  • 프로세스 내의 한 스레드가 블록되더라도 다른 스레드는 독립적으로 계속 실행 가능

단점

  • 커널이 직접 스레드를 관리하므로 스레드의 생성 및 관리를 위한 오버헤드가 사용자 수준 스레드에 비해 큼
  • 문맥 교환 비용이 사용자 수준 스레드보다는 높지만, 프로세스 간 전환보다는 상대적으로 적음

혼합형 스레드 (Hybrid Threads, N:M Threads)

사용자 수준 스레드와 커널 수준 스레드를 혼합한 방식이다.

alt text

  • N개의 사용자 수준 스레드를 M개의 커널 수준 스레드에 매핑
  • 사용자는 원하는 수만큼 스레드를 자유롭게 생성 가능
  • 커널 수준 스레드는 사용자 수준 스레드가 블록되었을 때 다른 사용자 수준 스레드를 선택하여 실행할 수 있어 효율성과 유연성을 동시에 갖춤
This post is licensed under CC BY 4.0 by the author.