스레드 관리

2020. 10. 7. 20:48운영체제/프로세스

스레드

 이전 포스팅(인터럽트)에서 나는 인터럽트문맥교환(Context Switching)에 대해 이야기를 했다. 운영체제는 문맥교환을 통해 이전에 작업했던 프로세스를 이어서 작업할 수 있지만, 너무 잦은 문맥교환은 오버헤드와 비용을 증가시킨다. 이 문제를 해결하기 위해서 운영체제는 스레드라는 단위를 관리하게 된다.

 

 

 그렇다면 스레드는 무엇인가? 스레드를 설명하기 위해서 상위개념인 프로세스라는 것을 가져오려고 한다. 프로세스는 요청받은 작업이 커널에 등록된 상태를 말한다. 간단히 실행중인 프로그램이라고 말할 수 있다. 프로세스가 하는 일은 두 가지 요소로 나눌 수 있는데, 첫째자원을 할당받는 것이고, 둘째할당받은 자원을 제어하는 것이다.

 

 

 

 

이 요소 중에 제어부분만 따로 떼어놓은 것을 스레드라고 한다. 따라서 스레드란, 프로세스 자원을 제어하는 유닛, 단위를 일컫는다. 하나의 프로세서(CPU)를 오직 한 개의 프로세스만이 점유할 수 있지만, 프로세스 안에는 자원을 여러 개 할당받고, 제어할 수 있기 때문에, 하나의 프로세스에서 여러 개의 스레드가 존재할 수 있다. 

 

 

 또한, 쓰레드는 여러 개가 있더라도 결국은 하나의 프로세스라는 공간안에 있기 때문에 서로 자원을 서로 공유할 수 있다. 스레드의 구성요소는 다음과 같다.

 

  1. 쓰레드 ID
  2. Register Set(각 제어에 필요한 레지스터)
  3. 스택(자기 고유의 작업영역)

또한, 쓰레드는 서로 동시에 자원을 공유함으로써 커널의 간섭을 피하고(사용자 라이브러리) 시스템 효율성을 증가시킬 수 있고, 프로세스 문맥교환을 하는 것보다 비용이 적게든다. 그리고 하나의 프로세스를 멀티 프로세서를 이용하면 병렬처리를 이용하여 성능을 향상시킬 수 있다. 마지막으로 사용자 응답성이 뛰어나다는 장점이 있다.

 

 

 예를들어, 두 가지 기능을 가진 프로세스가 있다고 가정하자. 첫 번째 기능은 1부터 100까지 더하는 것이고, 두 번째 기능은 다른 프로세스가 더한 값을 전달하는 기능이다. 운영체제는 두 개의 기능에 맞는 스레드를 각각 생성해서 사용자 응답성을 향상시킬 수 있다.

 

 

 

구현 

1. 사용자 수준 스레드

 사용자 수준 스레드사용자 영역에서 스레드 라이브러리로 구현된 것을 말한다. 유저가 프로그래밍 언어를 이용해서 스레드 라이브러리를 불러온 후 스레드를 생성한 경우와 같다. 커널이 스레드의 존재를 몰라 부하가 적고 유연하다는 장점이 있으나, 하나의 스레드 블록에 에러가 생기면 모든 스레드가 동작을 멈춘다는 단점이 있다. 그 이유는 커널이 프로세스 단위로 자원을 할당받기 때문이다.

 

 

2. 커널 수준 스레드

 커널이 스레드를 직접 관리하는 경우를 말한다. 즉, n개의 커널 스레드가 n개의 사용자 스레드를 담당하는 1:1매핑 방식을 말한다. 이는 병렬성은 좋으나 오버헤드가 크다는 단점이 있다.

 

 

3. 혼합형 스레드(n:m)

 사용자 수준 스레드와 커널 수준 스레드를 혼합한 방식이다. 사용자는 원하는만큼 스레드를 사용할 수 있고, 커널은 스레드를 병렬적으로 처리할 수 있다는 장점이 있다.

'운영체제 > 프로세스' 카테고리의 다른 글

프로세스 스케줄링 알고리즘, FCFS  (0) 2021.01.15
프로세스 스케줄링의 목적, 기준, 단계, 방법  (0) 2020.10.28
인터럽트  (0) 2020.10.06
프로세스 관리  (0) 2020.10.05