05. 스레드

YeJi Kim·2023년 1월 20일
0

운영체제

목록 보기
5/7

스레드

  • 스레드: 프로세스를 구성하는 실행 단위. 프로세스를 구성하는 실행의 흐름 단위. 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.

    스레드는 프로세스 내에서 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다.

  • 경량 프로세스(LWP)와 중량 프로세스(HWP)

    • 스레드 중에서 프로세스의 속성 중 일부가 들어 있는 것을 경량 프로세스(LWP, Light Weight Process)라고 한다.
    • 반대로 스레드 하나에 프로세스 하나인 전통적인 경우를 중량 프로세스(HWP, Heavy, Weight Proecss)라고 한다.
  • 프로세스와 스레드의 차이

    • 프로세스
      • 하나의 스레드와 같은 실행 흐름을 가짐
      • 프로세스 간의 메모리는 독립적이므로, 서로의 영역에 접근하기 어려움
      • 프로세스 간의 스위치 비용이 큼.
    • 스레드
      • 하나의 프로세스 안에 여러 개의 스레드가 존재
      • 프로세스의 코드 영역과 데이터 영역은 스레드 간에 공유된다.
      • 이에 따라, 스레드 간의 스위치 비용이 적음
  • 스레드의 구성 요소

    • Thread ID - 스레드 식별자
    • Program Counter - 현재 실행 중인 명령어의 주소
    • 레지스터 값 - CPU의 레지스터 값들
    • 스택 - 함수 호출 시 전달되는 인자, 작업 후 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간. 스레드가 독립적인 실행 흐름을 가질 수 있도록 독립적인 스택 메모리 공간을 갖는다.
  • 스레드의 메모리 구조

    하나의 프로세스 내에서 스레드는 heap, Code, Data 영역 등을 공유한다. 각각의 프로세스가 독립적인 스택, 힙, 코드, 데이터 영역을 가진 반면에, 한 프로세스에 속한 스레드는 스택 영역을 제외한 메모리 영역을 공유한다.

    이로써, 스레드는 코드 영역에 접근하여 프로세스가 가지고 있는 함수를 호출할 수 있다. 또한 공유 메모리를 통해 IPC 없이도 스레드 간의 통신이 가능하다.

  • 동시성과 병렬성
    • 동시성: 동시에 실행되는 것 같이 보이는 것. 싱글 코어에서 멀티 스레드를 동작시키는 방식. 싱글 코어에서 여러 개의 작업이 동시에 실행되는 것처럼 보이기 위해 번갈아 가면서 작업 수행. 내부적으로 문맥 교환 발생.
    • 병렬성: 실제로 동시에 여러 작업이 처리되는 것. 멀티 코어에서 멀티 스레드를 동작시키는 방식. 각각의 프로세스를 통해 병렬적으로 각각의 스레드가 실행됨.

싱글 스레드와 멀티 스레드

  • 싱슬 스레드
    • 프로세스 자체가 하나의 실행 흐름만 갖고 있는 고전적인 프로세스. 문맥 교환 시, 프로세스 영역 전체를 백업하고 복원해야 한다.
  • 멀티 스레드
    • 하나의 프로세스 안에 여러 개의 실행흐름을 갖고있다. 문맥 교환 시, 최소한의 스레드 정보만을 백업하고 복원하면 된다. 따라서 문맥 교환 오버헤드가 비교적 적다.

멀티 프로세스와 멀티 스레드

  • 멀티 프로세스: 여러 프로세스를 동시에 실행하는 것
  • 멀티 스레드: 여러 스레드로 프로세스를 동시에 실행하는 것
  • 멀티 프로세스와 멀티 스레드의 차이는?
    • 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 큰 차이점이 있다.
    • 멀티 프로세스는 모든 자원이 별도로 사용되기 때문에 중복과 이에 따른 낭비가 발생할 수 있다. 하지만 자원을 공유하지 않기 때문에 각각의 프로세스가 독립적으로 실행되고 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않는다.
    • 멀티 스레드의 경우, 같은 프로세스 내의 모든 스레드는 동일한 주소 공간의 코드, 데이터, 힙 영역 등의 프로세스 자원을 공유한다. 이에 따라, 메모리를 더 효율적으로 사용할 수 있고 프로세스의 자원을 공유하기 때문에 서로 협력과 통신에 유리하다.
    • 또한 멀티 스레드의 경우, 어느 한 스레드가 블락되거나 시간이 걸리는 작업을 하더라도, 다른 스레드들은 실행되고 있기 때문에 사용자 입장에서는 그 프로그램이 interactive하다고 볼 수 있다.

User Thread와 Kernel Thread

스레드를 지원하는 주체에 따라 나뉜다.

  • User Thread

    • 커널 영역 위에서 지원되며, 일반적으로 유저 레벨의 라이브러리를 통해 구현된다.
    • 라이브러리에서 스레드를 생성하고 스케줄링과 관련된 관리를 해준다.
    • Many-to-One 매핑
      • 여러 개의 유저 레벨 스레드들이 하나의 커널 스레드로 매핑됨
      • 한번에 하나의 스레드만 커널에 접근 가능하다. 하나의 스레드가 시스템 콜을 통해 커널에 접근하면, 나머지 스레드들은 대기해야 한다.
    • 장점
      • 동일한 메모리 영역에서 스레드가 생성, 관리되므로 이에 대한 속도가 빠르다.
    • 단점
      • 여러 개의 유저 스레드 중 하나의 스레드가 시스템 콜 요청으로 블락된다면, 나머지 모든 스레드 역시 블락된다.(커널은 여러 유저 스레드들을 하나의 프로세스로 간주하기 때문이다.)
  • Kernel Thread

    • 운영체제에서 스레드를 지원
    • 커널 영역에서 스레드의 생성, 스케줄링 등을 관리
    • One-to-One
      • 각각의 유저 스레드를 커널 스레드로 매핑
      • 유저 스레드가 생성되면, 그에 따른 커널 스레드가 생성된다.
      • 커널 스레드도 한정된 자원이기 때문에 무한정으로 생성할 수 없다는 한계점이 있다. 이러한 한계점의 대안으로 Many-to-Many가 등장했다.
    • 장점
      • 스레드가 시스템 콜을 호출하여 블락되면, 커널은 다른 스레드를 실행함으로써 전체적인 스레드 블락킹이 없다. 실질적인 병렬 구현 가능
      • 멀티 프로세스 환경에서 커널이 여러 개의 스레드를 다른 프로세스에 할당할 수 있다.
    • 단점
      • 유저 스레드보다 생성 및 관리가 느리다.
  • multiplexed thread

    • 유저 스레드와 커널 스레드를 혼합한 구조.
    • 여러 개의 유저 스레드를 여러 개의 커널 스레드로 매핑.
    • Many-to-Many
      • 여러 개의 유저 스레드를 여러 개의 커널 스레드로 매핑
      • 기존 매핑 모델들의 문제점을 해결
      • 커널 스레드는 생성된 유저 스레드와 같거나 적은 수만큼 생성되어 적절히 스케줄링 된다.
  • Scheduler Activations

    • 사용자 스레드 레벨과 커널 스레드 레벨과의 통신을 하는 매커니즘이다.
    • 애플리케이션은 사용자 스레드 레벨에 대해 부족한 정보를 가지고 있다.(커널은 알지만) 커널도 사용자 스레드 레벨에 대한 부족한 정보를 가지고 있다. 시스템 콜로만 알고 있다.
      그래서 이 둘 사이에 정보를 원활히 교환할 수 있는 매커니즘이 필요했는데 이가 Scheduler Activation 매커니즘이다.

스레드의 상태 변화

스레드의 상태에는 준비, 실행, 대기, 종료 상태가 있다. 스레드는 프로세서를 함께 사용하고 항상 하나만 실행함. 그리고 하나의 프로세스에 있는 스레드는 순차적으로 실행된다.


[참고자료]
혼자 공부하는 컴퓨터구조+운영체제(저자: 강민철, 출판사: 한빛미디어)

profile
이전의 기록들 👉 https://blog.naver.com/reviewerkyj

0개의 댓글