[OS] Thread

impala·2023년 3월 13일
0

[CS] Operating System

목록 보기
4/4

4. 쓰레드

4.1 쓰레드의 정의 및 특징

프로세스는 다음과 같은 두가지 독립된 특성을 가진다.

  • 자원 소유권 : 프로세스는 프로세스 이미지를 저장하기 위한 가상의 주소공간을 가지고, 파일과 I/O같은 외부 자원은 프로세스에게 할당될 수 있다.
  • 스케줄링 및 수행 : 프로세스는 운영체제에 의해 스케줄되고 디스패치되는 개체이다.

현대 운영체제에서는 이 두가지 특성을 구분하기 위해서 자원 소유권의 단위는 프로세스 또는 태스크(task), 디스패칭의 단위는 쓰레드라고 정의한다.

멀티 쓰레딩

멀티 쓰레딩이란 운영체제가 하나의 프로세스 안에서 여러개의 쓰레드를 지원하는 기능이다. 운영체제가 지원하는 쓰레딩 모델의 종류는 다음과 같다.

  • 단일 프로세스/ 단일 쓰레드 : 쓰레드의 개념이 확실하지 않음. MS-DOS
  • 다중 프로세스/ 단일 쓰레드 : 프로세스는 여러개가 동시에 수행되지만 각 프로세스는 하나의 쓰레드만 생성. UNIX
  • 단일 프로세스/ 다중 쓰레드 : 하나의 프로세스가 여러 쓰레드를 지원함. JRE
  • 다중 프로세스/ 다중 쓰레드 : 여러 쓰레드를 지원하는 프로세스가 여러개 존재. Windows, 최신UNIX

멀티 쓰레딩 환경에서 프로세스와 쓰레드는 다음과 같은 특징을 가진다.

  • 프로세스 : 자원할당과 보호의 단위. 각 프로세스는 하나 이상의 쓰레드를 가진다
    • 프로세스 이미지의 가상 주소공간
    • 프로세서, 다른 프로세스, 파일, I/O리소스등에 대한 접근제어
  • 쓰레드 : 명령어 수행의 단위
    • 쓰레드 수행 상태
    • 쓰레드 문맥(독립된 PC)
    • 시스템 스택
    • 로컬 저장소
    • 프로세스 메모리 및 자원에 대한 접근 : 모든 쓰레드가 공유

프로세스 모델

단일 쓰레드 프로세스 모델과 멀티 쓰레드 프로세스 모델은 프로세스 관리의 관점에서 차이를 가진다.

단일 쓰레드 프로세스 모델은 하나의 프로세스에 하나의 쓰레드만 존재하기 때문에 쓰레드가 없는 것처럼 동작한다. 즉, 프로세스는 사용자 주소공간, PCB, 사용자 스택 및 커널 스택으로 이루어져있고, 수행중인 프로세스가 바뀌면 레지스터의 정보들이 현제 프로세서에 저장된다.

반면 멀티 쓰레드 프로세스 모델에서는 위와 동일하게 프로세스별 하나의 PCB와 사용자 주소공간을 가지지만, 각각의 쓰레드가 독립된 수행 흐름을 가지기 때문에 각 쓰레드별로 사용자 스택과 커널 스택이 있고, 쓰레드의 상태를 보관하는 쓰레드 제어 블록(TCB)을 가진다. 각각의 쓰레드들은 독립된 작업 흐름을 가지지만 PCB와 사용자 주소공간은 프로세스별로 할당되기 때문에 동일 프로세스 내의 모든 쓰레드는 프로세스의 상태와 자원을 공유한다.

쓰레드의 장점

쓰레드를 사용하는 주된 이유는 쓰레드를 사용하지 않을 때보다 성능면에서 여러가지 장점을 가지기 때문이다.

  • 프로세스 생성/종료시간보다 쓰레드 생성/종료시간이 훨씬 적음
  • 프로세스 교환보다 동일 프로세스 내 쓰레드 교환이 효율적
  • 커널의 개입 없이 서로 다른 프로그램간 통신이 가능함

참고로 쓰레드를 지원하는 운영체제에서는 스케줄링과 디스채징이 쓰레드 단위로 이루어지기 때문에 대부분의 수행상태는 쓰레드 수준에서 관리되지만, 몇몇 작업은 프로세스 내의 모든 쓰레드에 영향을 주기 때문에 이 작업들의 수행정보는 예외적으로 프로세스 수준에서 관리된다.

  • 프로세스 보류 : 주기억장치의 공간을 마련하기 위해 주기억장치에 있는 Blocked상태의 프로세스를 디스크로 내리는 과정. 하나의 프로세스 내의 모든 쓰레드는 동일한 주소공간을 공유하기 때문에 프로세스가 보류(Suspend)되면 그 프로세스 내의 모든 쓰레드가 보류된다.

쓰레드의 상태

프로세스의 상태(Ready, Blocked, Suspend, Running)와 비슷하게 쓰레드도 3가지 상태(Running, Ready, Blocked)를 가진다. 쓰레드의 상태 변경과 관련하여 4가지 쓰레드 연산이 존재한다.

  • Spawn : 새로운 프로세스 생성 혹은 프로세스의 쓰레드 생성 요청 등으로 인해 쓰레드가 생성되고 Ready queue에 등록된다
  • Block : 쓰레드가 특정 이벤트를 기다려야 하는 경우
  • Unblock : 쓰레드가 기다리는 이벤트가 발생한 경우 쓰레드가 Ready queue로 이동
  • Finish : 쓰레드가 작업을 완료한 경우

이때 한 쓰레드가 블록되었을 때 전체 프로세스를 블록시키도록 설계할 수 있는데, 그 경우 쓰레드가 가진 장점과 유연성이 사라지게 된다. 위의 그림에서 하나의 프로세스 내의 두 쓰레드가 각각 RPC요청을 보내는데, 만약 첫번째 쓰레드가 RPC요청을 보내고 전체 프로세스를 블록시킨다면 RPC응답이 온 이후 두번째 RPC요청을 보낼 수 있지만, RPC요청을 보낸 쓰레드만 블록시킨다면 이어서 다른 쓰레드가 RPC요청을 보내고 두 쓰레드는 RPC응답을 동시에 기다릴 수 있다.

쓰레드 동기화

하나의 프로세스 내의 모든 쓰레드는 프로세스의 자원을 공유하기 때문에 하나의 쓰레드에 의한 변경은 동일 프로세스 내의 다른 쓰레드에 영향을 준다. 따라서 쓰레드들이 서로 간섭하지 않도록 쓰레드의 동기화가 필요하다.

4.2 쓰레드의 종류

ULT(User Level Thread)

사용자 수준 쓰레드에서는 쓰레드 관리와 연관된 모든 작업을 어플리케이션이 수행하기 때문에 커널은 쓰레드의 존재를 전혀 알지 못한다. 이때 어플리케이션은 쓰레드 관리 루틴(쓰레드 생성/제거, 쓰레드간 통신, 쓰레드 스케줄링, 쓰레드 문맥 저장/복구 등)들로 구성된 쓰레드 라이브러리를 사용하여 멀티 쓰레드 기반으로 프로그래밍할 수 있다.
어플리케이션이 시작되면 기본적으로 하나의 쓰레드를 생성하여 작업을 시작하는데, 이 쓰레드와 어플리케이션은 운영체제에서 관리하는 하나의 프로세스에 할당된다. 어플리케이션은 실행 도중 쓰레드 생성 유틸리티를 호출하여 새로운 쓰레드를 생성하고 같은 프로세스 안에서 수행시킬 수 있다. 쓰레드 생성 유틸리티를 호출하면 현재 쓰레드의 문맥은 저장되고 유틸리티로 제어가 넘어가 쓰레드를 생성한다. 중요한 것은 이러한 일련의 작업이 하나의 프로세스 내에서 일어나기 때문에 커널에는 쓰레드에 대한 정보가 없고 프로세스 단위로 스케줄링을 수행한다. 따라서 이 경우 프로세스 스케줄링과 쓰레드 스케줄링은 독립적으로 수행된다.

KLT와 비교해서 ULT를 사용할 때의 장단점은 다음과 같다.
1. 장점
- 쓰레드 관리를 위한 정보가 모든 쓰레드가 공유하는 사용자 주소공간에 있기 때문에 쓰레드 교환에 모드 스위칭이 필요하지 않아 오버헤드가 절감된다.
- 어플리케이션 맞춤 스케줄링 알고리즘을 사용할 수 있다.
- ULT는 어플리케이션 레벨에서 처리되기 때문에 모든 운영체제에서 적용될 수 있다.
2. 단점
- 쓰레드가 시스템을 호출할 경우 해당 프로세스의 모든 쓰레드가 블록된다
- 커널은 프로세스 단위의 스케줄링을 수행하므로 멀티프로세싱의 장점을 살릴 수 없다(프로세서에 하나의 프로세스를 할당)

만약 위의 단점을 해결하기 위해 어플리케이션을 멀티 프로세스 기반으로 프로그래밍한다면 쓰레드 대신 프로세스를 스위칭 함으로써 오버헤드가 증가하여 쓰레드의 장점을 살릴 수 없게 된다.

자켓팅(Jacketing)은 블록형 시스템 호출(시스템 호출시 프로세스 내의 모든 쓰레드를 블록)을 해결하기 위한 기술로, 블록형 시스템 호출을 nonblocking으로 변경하는 것이다. 즉, 쓰레드가 시스템을 직접 호출하지 않고 어플리케이션 수준의 루틴(Jacket routine)을 호출함으로써 시스템 호출을 위임하는 것이다. 이 경우 시스템 호출을 요청한 쓰레드만 블록처리하고 다른 쓰레드를 수행한다.

KLT(Kernel Level Thread)

커널 수준 쓰레드에서는 쓰레드와 관련된 모든 작업이 커널에 의해 이루어진다. 어플리케이션에는 쓰레드 관리를 위한 코드가 없고 커널 쓰레드 기능에 대한 API를 사용한다. KLT에서 커널은 전체 프로새스 뿐만 아니라 각 쓰레드의 문맥정보를 유지하고, 커널에 의한 스케줄링을 쓰레드 단위로 이루어진다.

ULT와 비교했을 때 KLT의 주된 장단점은 다음과 같다.
1. 장점
- 커널에서 쓰레드 단위의 스케줄링이 이루어지기 때문에 여러 프로세서에게 동일 프로세스 내의 여러 쓰레드를 동시에 처리하도록 할 수 있다
- 마찬가지로 쓰레드 단위의 스케줄링으로 인해 한 프로세스의 쓰레드가 블록되더라도 같은 프로세스의 다른 쓰레드를 수행할 수 있다
2. 단점
- 동일 프로세스 내의 서로 다른 쓰레드라 할지라도 쓰레드 사이에 제어가 이동할 때 모드스위칭이 필요하다

Combined Thread

ULT와 KLT의 장점은 살리고 단점을 최소화하기 위해 고안된 방법으로 어플리케이션 수준에서 모든 쓰레드의 생성과 스케줄링을 처리하고, 각 어플리케이션의 ULT들은 그보다 같거나 적은 수의 KLT로 매핑된다. 이로 인해 한 어플리케이션의 쓰레드들이 다수의 프로세서에서 병렬적으로 처리될 수 있고, 블록형 시스템 호출이 프로세스 전체를 블록시키지 않는다는 장점이 있다.

프로세스- 쓰레드 배합

쓰레드와 프로세스의 관계는 그 개수에 따라 1대1, 1대다, 다대1, 다대다로 나눌 수 있다.

쓰레드 : 프로세스설명
1 : 1전통적인 단일 프로세스 환경
M : 1멀티 쓰레드 환경
1 : N쓰레드가 프로세스 사이를 이동할 수 있음. 분산OS, 클라우드
M : N1 : N과 M : 1을 혼합한 것

4.3 멀티코어 프로세서환경의 쓰레드

멀티코어 시스템에서는 각 코어가 병렬적으로 쓰레드를 실행할 수 있기 때문에 어플리케이션이 멀티 쓰레딩으로 프로그래밍 된다면 병렬처리로 인해 성능의 향상이 가능해진다.

암달의 법칙(Amdahl's Law)

암달의 법칙은 멀티코어 시스템 상에서 단일 어플리케이션이 단일 프로세서 시스템에 비해 어느정도의 속도향상을 얻을 수 있는지 계산한 것으로, 병렬화가 불가능한 코드의 실행시간과 병렬화가 가능한 코드의 실행시간의 조합으로 계산된다.

속도 향상 = 단일 프로세서에서의 프로그램 실행시간 / N core에서 프로그램 실행시간 = 1 / ((1-f) + f/N)
f : 병렬처리가 가능한 코드의 실행시간

참고자료

  • Operating Systems : Internas and Design Principles - William Stallings

0개의 댓글