본문 바로가기
Operating System/Problem & Solution

Chapter04. 스레드 : 문제풀이

by autumnly 2017. 1. 10.

1 다중 스레드 기법을 사용했을 때 단일 스레드 기법을 사용했을 때 보다 성능이 좋지 않은 프로그래밍 사례 2가지를 제시하시오.

모든 순차적 프로그램은 다중 스레드 기법을 사용하여도 성능이 좋지 않다. 또한 shell 프로그램은 항상 환경변수, 작업 디렉토리 등의 정보를 감시해야 하기 때문에 다중 스레드 기법이 필요하지 않다(ex. C-shell, Korn shell).


2 다음 중 다중 스레드 프로세스의 스레드 사이에 공유되는 프로그램 상태는 무엇인가?

  1. 레지스터 값들
  2. 힙 메모리
  3. 전역 변수들
  4. 스택 메모리


모든 스레드는 각각의 레지스터와 스택을 가지므로, 공유되는 프로그램 상태는 B힙 메모리와 C전역 변수들 이다.


3 다수의 사용자 수준 스레드를 사용하는 다중 스레드 해결책이 단일 처리기 시스템보다 다중 처리기 시스템에서 더 나은 성능을 보일 수 있는가?

없다. 운영체제는 한번에 하나의 프로세스만을 관리하며, 프로세스의 서로 다른 스레드들을 다른 처리기에 배정하지 않는다. 다시 말해 다중 스레드는 동시에 여러 처리기에서 수행될 수 없다. 따라서 다수의 사용자 수준 스레드를 사용하는 다중 스레드는 단일 처리기와 다중 처리기에서 같은 성능을 보인다.


4 4.72절에서 설명된 것처럼 Linux는 프로세스와 스레드를 구별하지 않는다. 대신 Linux는 둘을 같은 방법으로 다룬다. clone() 시스템 호출에 전달되는 플래그에 따라 태스크는 프로세스에 더 가깝거나 스레드에 가까울 수 있다. 그러나 Windows와 같은 많은 운영체제들은 프로세스와 스레드를 다르게 취급한다. 통상 이러한 시스템들은 프로세스를 위한 자료 구조가 프로세스에 속한 스레드를 가리키는 포인터를 포함하게 하여 이 관계를 표시한다. 커널 안에서 프로세스와 스레드를 모델링하는 이 두 가지 방식을 비교하라.

프로세스와 스레드가 비슷한 개체로 간주되는 시스템에서는, 운영체제의 일부 코드가 간단해질 수 있다. 예를들어, 스케줄러는 스케줄링을 할 때 특별한 코드 없이 프로세스와 스레드를 같은 것으로 간주할 수 있다. 반면 이러한 동일성은 프로세스 수준의 자원을 직접 제한하는 것을 어렵게 할 수 있다. 어떤 스레드가 어떤 프로세스에 작용하고, 어떤 일을 수행하는지 알기 위해선 복잡성이 좀 더 요구된다.


5 그림 4.16에 보인 프로그램은 Pthreads API를 사용한다. LINE C와 LINE P의 출력은 무엇인가?


LINE C : 5, LINE P : 0


6 다중 처리기 시스템과 다대다 모델을 사용하여 작성된 다중 스레드 프로그램을 고려하자. 프로그램의 사용자 수준 스레드의 개수가 시스템의 처리기 개수보다 많다고 가정하자. 다음과 같은 시나리오에서 성능 예측을 논의하시오.

  1. 프로그램에 할당된 커널 스레드의 개수가 처리기보다 적다.
  2. 프로그램에 할당된 커널 스레드의 개수가 처리기의 개수와 같다.
  3. 프로그램에 할당된 커널 스레드의 개수가 처리기의 개수보다 훨씬 많지만 사용자 수준의 스레드 보다는 작다.


본문에 비추어보면 하나의 코어(처리기)는 한 번에 하나의 스레드만 실행할 수 있고, 시스템에서 개별 스레드를 각 코어에 배정하게 된다.

A: 몇 처리기는 일을 하지 않고 방치될 수 있다. 스케줄러가 처리기와 커널스레드를 맵핑하지만 사용자 수준 스레드에는 관여하지 않기 때문.

B: 모든 처리기가 동시에 일을 할 수 있다. 하지만 만약 한 커널 스레드에서 봉쇄적 시스템 콜(blocking system call)이 일어나면 해당 스레드를 처리하던 처리기는 놀게된다.

C: 한 처리기가 관리하던 커널 스레드에서 봉쇄적 시스템 콜이 일어나도 다른 준비된 커널 스레드로 대체될 수 있다. 모든 처리기가 계속 일을 하게 되어 다중 처리기의 효율이 높아진다.