# 스레드

# 스레드와 멀티스레딩

  • 스레드

    • 프로세스의 실행 가능한 가장 작은 단위입니다.
    • 프로세스와 달리 코드, 데이터, 힙을 스레드끼리 서로 공유합니다.
    • 프로세스는 여러 스레드를 가질 수 있습니다.
  • 멀티스레딩

    • 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법입니다.
    • 장점
      • Responsiveness : 프로그램의 어느 부분을 담당하는 스레드가 block되거나 시간이 걸리는 작업을 하더라도, 다른 스레드들은 실행되고 있기 때문에 유저의 입장에서는 그 프로그램이 Interactive하다고 볼 수 있습니다.
      • Resource Sharing : 스레드들 간에는 서로 자원들을 공유하기 때문에 효율성이 높습니다.
      • Economy : 스레드들은 하나의 프로세스 메모리 영역에서 실행하기 때문에 새로운 프로세스를 생성하는 것보다 스레드를 생성하는 것이 비용이 적게 들어갑니다.
      • Scalability : 여러개의 스레드가 각각 다른 프로세스에서 동시에 실행이 가능합니다.
      • 동시성에 큰 장점이 있습니다.
    • 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점이 있습니다.
    • ex) 웹 브라우저의 렌더러 프로세스(메인 스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드가 존재)

동시성이란?

서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것

# 스레드의 분류

스레드를 지원하는 주체에 따라 유저 스레드와 커널 스레드로 나눌 수 있습니다.

# 유저 스레드

  • 커널 영역에서 지원되며, 일반적으로 유저 레벨의 library를 통해 구현됩니다.
  • library에서 스레드를 생성, scheduling과 관련된 관리를 해줍니다.
  • 장점
    • 동일한 메모리 영역에서 스레드가 생성, 관리 되므로 이에 대한 속도가 빠릅니다.
  • 단점
    • 여러 개의 유저 스레드 중 하나의 스레드가 시스템 콜 요청으로 block이 된다면, 나머지 모든 스레드 역시 block됩니다.
      • 커널은 여러 유저 스레드들을 하나의 프로세스로 간주하기 때문입니다.

# 커널 스레드

  • 운영체제에서 스레드를 지원합니다.
  • 커널 영역에서 스레드의 생성, scheduling 등을 관리해줍니다.
  • 장점
    • 스레드가 시스템 콜을 호출하여 block이 되면, 커널은 다른 스레드를 실행함으로써 전체적인 Thread Blocking이 없습니다.
    • 멀티 프로세스 환경에서 커널이 여러 개의 스레드를 다른 프로세스에 할당할 수 있습니다.
  • 단점
    • 유저 스레드보다 생성 및 관리가 느립니다.

# 유저 스레드와 커널 스레드의 매핑(Mapping)

  1. Many-to-One
    • 스레드 관리는 유저 레벨에서 이루어집니다.
    • 여러 개의 유저 스레드들이 하나의 커널 스레드로 매핑됩니다.
    • 커널 스레드를 지원하지 못하는 시스템에서 사용됩니다.
    • 한계점
      • 한번에 하나의 스레드만 커널에 접근 가능합니다.
        • 하나의 스레드가 커널에 접근(시스템 콜)하면, 나머지 스레드들은 대기해야 합니다
        • 진정한 동시성은 지원하지 못합니다.
        • 동시에 여러 개의 스레드가 시스템 콜을 사용할 수 없습니다.
      • 커널의 입장에서 여러 개의 스레드는 하나의 프로세스이기 때문에 멀티프로세스더라도 여러 개의 프로세스에서 동시에 수행이 불가능합니다. (진정한 병렬이 아님)
  2. One-to-One
    • 각각의 유저 스레드를 커널 스레드로 매핑합니다.
    • 유저 스레드가 생성되면 그에 따른 커널 스레드가 생성됩니다.
    • Many-to-One 방법에서 문제가 되었던 시스템 콜 호출 시 다른 스레드들이 block되는 문제를 해결합니다.
    • 여러 개의 스레드를 멀티프로세스에서 동시에 수행 할 수 있습니다.
    • 한계점
      • 커널 스레드도 한정된 자원이기 때문에 무한정으로 생성할 수 없습니다.
      • 스레드를 생성, 사용하려고 할 때, 그 개수에 대한 고려가 필요합니다.
  3. Many-to-Many
    • 여러 개의 유저 스레드를 여러 개의 커널 스레드로 매핑합니다.
    • Many-to-One과 One-to-One 모델의 문제점을 해결합니다.
    • 커널 스레드는 생성된 유저 스레드와 같거나, 적은 수 만큼만 생성이 되어 적절히 Scheduling 됩니다.
      • Many-to-Many처럼 스레드가 시스템콜을 사용할 경우, 다른 스레드들이 block되는 현상에 대해 걱정할 필요가 없습니다.
      • One-to-One 처럼 사용할 스레드의 수에 대해 고민할 필요가 없습니다.
    • 커널은 적절히 유저 스레드와 커널 스레드 사이의 매핑을 조절하여 위와 같은 장점을 보장할 수 있습니다.

# 참고자료

  • 주홍철.면접을 위한 CS 전공지식 노트.서울:길벗,2022.
  • 숭실대학교 김영근 교수님의 운영체제 강의자료(2021)