본문 바로가기

OS/운영체제론

[운영체제론] 스레딩 모델 / 2021.10.26

* 참고 자료 : 운영체제론 한빛아카데미

 

스레딩 모델은 총 3가지로 나뉜다.

 

1. 사용자 수준 스레드

사용자 수준 스레드는 사용자 영역에서 스레드 연산을 수행한다. 사용자 수준 스레드는 운영체제에 투명하다. 다시 말해, 운영체제는 각각의 멀티스레드 프로세스를 단일 실행 문맥으로 인식하고 실행한다. 런타임 라이브러리가 스레드를 생성하는데, 즉 특권 명령을 실행할 수 없거나 커널 프리미티브에 직접 접근할 수 없다.

 

- 다대일 스레드 맵핑 : 

운영체제가 멀티스레드 프로세스 하나에 있는 모든 스레드에 실행 문맥 하나를 맵핑한다. (운영체제는 프로세스가 여러 스레드를 포함하고 있다는 것을 알지 못한다.) 

프로세스가 사용자 수준 스레드를 사용할 때는 사용자 수준 라이브러리로 프로세스의 스레드를 스케줄링하고 디스패치 한다. 

스레드는 자신에 할당된 퀀텀이 만료되거나 다른 이유 때문에 커널에 프로세서를 선점당할 때까지 실행을 계속한다.

 

- 장점 : 

(1) 운영체제에서 지원하지 않으므로 이식성이 좋다.

(2) 응용 프로그램 요구에 맞게 스레딩 라이브러리에서 스케줄링 알고리즘이 변경 가능하다.  (오버헤드 작음)

 

- 단점 :

(1) 커널은 멀티스레드를 한 프로세스로 간주함에 따라 멀티 프로세서 시스템에서의 확장이 어렵다.

(2) 프로세스에 속한 한 스레드가 블록 되면 프로세스 전체가 블록 된다. 

 

사용자 수준 스레드

 

1. 사용자 수준 스레드의 구현이 이식성을 높여주는 이유는 무엇인가?
답 : 사용자 수준 스레드는 응용 프로그램에 운영체제 API와 독립적인 API를 제공한다.
2. 다대일 스레드 맵핑에서 한 스레드가 블록 되면, 운영체제에서 멀티스레드 프로세스 전체를 블록 하는 이유는 무엇인가?
답 : 운영체제에는 멀티스레드 프로세스 전체가 제어 스레드 하나로 인식된다. 그러므로 운영체제가 블록킹이 필요한 입출력 요청을 받으면 프로세스 전체를 블록 한다.

 

2. 커널 수준 스레드 

커널 수준 스레드는 각 스레드마다 고유한 실행 문맥을 맵핑하는 방법으로 사용자 수준 스레드의 한계를 해결하려고 한다. 따라서 커널 수준 스레드를 일대일 맵핑 스레드라고 한다.

 

- 장점 :

(1) 복수의 스레드를 복수의 프로세서에 디스 패치해서 빨리 실행할 수 있다.

(2) 어느 한 스레드가 블록 되어도 준비상태에 있는 다른 스레드를 실행할 수 있다.

(3) 각 스레드에 우선순위를 부여해서 서비스 수준을 조절할 수 있다.

 

 

- 단점 : 

(1) 실행될 시스템이 달라지면 해당 운영체제의 API에 맞게 프로그램을 수정해야 한다.

(2) 스케쥴링 동기화를 위해 커널을 호출해야 한다. (오버헤드 증가)

(3) 사용자 수준 스레드보다 더 많은 자원을 사용하는 경향이 있다.

 

커널 수준 스레드

 

1. 어떤 경우에 커널 수준 스레드가 사용자 수준 스레드보다 효율적인가?
답 : 응용 프로그램에 블록 되는 스레드 혹은 명령어를 병렬로 실행할 수 있는 스레드가 포함되어있다면 커널 수준 스레드가 사용자 수준 스레드보다 효율적이다.
2. 커널 수준 스레드로 작성한 응용프로그램 소프트웨어가 사용자 수준 스레드를 사용하는 것보다 이식성이 떨어지는 이유는 무엇인가?
답 : 커널 수준 스레드를 사용하는 응용 프로그램 소프트웨어는 특정 운영체제의 스레드 API를 사용해야 하므로, 각 시스템의 운영체제에 종속적이다.

 

3. 사용자 수준 스레드와 커널 수준 스레드의 조합

사용자 수준 스레드와 커널 수준 스레드를 조합한 구현을 다대다 스레드 맵핑이라고 한다. 스레드 풀을 사용한다.

 

- 장점 :

스레딩 라이브러리 스케쥴러 알고리즘을 필요에 맞게 만들 수 있다.

 

- 단점 :

(1) 설계가 복잡하고 표준화된 구현이 없다.

(2) 한 스레드가 블록 되면 이 스레드가 속한 스레드 그룹 전체 블록 -> 멀티 프로세서에서 동시에 실행시킬 수 없다.

=> 이를 해결하기 위해 스케줄러 활성화를 이용한다.

 

- 스케줄러 활성화 :

스케줄러 활성화는 사용자 수준 스레드 라이브러리에 이벤트 발생을 알리는 커널 스레드이다. 

 

- 스케줄러 활성화를 통한 동작 :

(1) 멀티스레드 프로세스가 생성될 때 

운영체제는 프로세서마다 스케줄러 활성화를 생성하여, 사용자 수준 스레드 라이브러리가 멀티 프로세서에 여러 스레드를 동시에 할당할 수 있도록 한다. -> 멀티 프로세서 환경에서 동작

(2) 사용자 수준 스레드가 블록 되면

운영체제는 스레드의 상태를 해당 스케줄러 활성화에 저장한다. 그리고 새로운 스케줄러 활성화를 생성하여 사용자 수준 라이브러리에 스레드가 블록 되었음을 알린다. 사용자 수준 라이브러리는 블록 된 스레드의 상태를 저장하고 새 스레드에 다른 스레드를 할당한다.

 

- 작업자 스레드 :

스레드 풀링은 커널 스레드의 생성, 소멸 횟수를 줄일 수 있다. 

예를 들어보자. 서버는 클라이언트로부터 서비스 요청이 있으면 새로운 스레드를 생성한다. 그리고 클라이언트에 대한 서비스를 종료한 후에도 커널 스레드는 남아 있다. 이와 같이 풀에서 지속되는 커널 스레드는 할당된 스레드에 따라 다른 기능을 수행한다. 이 커널 스레드를 작업자 스레드라고 한다.

 

사용자 수준 스레드와 커널 수준 스레드의 조합

 

 

1. 응용 프로그램이 스레드 풀의 크기를 정할 때, 프로그램이 실행될 때 준비 상태에 있는 사용자 스레드 수가 최대치 일 때보다 크게 잡으면 어떤 점에서 비효율적인가?
답 : 스레드 생성에 오버헤드가 들고 메모리 할당도 비효율적이다.
2. 스케줄러 활성화는 다대다 스레드 맵핑의 효율을 어떻게 높이는가?
답 : 스케줄러 활성화는 응용 프로그램이 처리량을 최대화하기 위해 스레드 스케줄링 방법을 지정할 수 있게 해 준다.