Operating System: Concepts 9판 한글판 기준 연습문제 및 풀이입니다.
4.1 다중 스레드 기법을 사용했을 때 단일 스레드 기법을 사용했을 때보다 성능이 좋지 않은 프로그래밍 사례 2가지를 제시하시오.
(Provide two programming examples in which multithreading does not provide better performance than a single-threaded solution.)
예시 1: 순차적인 프로그램에서 다중 스레드 기법을 사용하면 예상치 못한 결과가 나올 수 있다. 예를 들어 공유되는 변수 i를 1씩 증가시키는 프로그램에서 다중 스레드인 경우 값이 한번에 2씩 증가할 수도 있는 등 순차적으로 실행되는 것을 보장할 수 없다.
예시 2: 실행 내용을 계속 모니터링 해야하는 쉘 프로그램(ex. C shell) 등에서 다중 스레드인 경우 제대로 모니터링을 할 수 없다.
4.2 단일 처리기 시스템에서의 프로그래밍을 고려하자. 다중 커널 스레드를 사용하여 다중 스레드 프로그램을 만들었을 때 이 프로그램의 성능이 단일 스레드만 사용하는 프로그램에 비해 더 나은 성능을 보이는 경우는 언제인가?
(Under what circumstances does a multithreaded solution using multiple kernel threads provide better performance than a single-threaded solution on a single-processor system?)
단일 처리기 시스템에서 다중 스레드 프로그램은 비록 (단일 처리기라서) 연산 속도 측면에서 이점은 없지만, 사용자 반응 시간 측면에서 성능 향상을 기대할 수 있다.
여러 스레드가 시스템에 적재되어 있고 각각의 스레드가 사용자 반응에 의해 활성화되도록 프로그램을 구성한다면 위와 같은 성능 향상이 가능하다.
4.3 다음 중 다중 스레드 프로세스의 스레드 사이에 공유되는 프로그램 상태는 무엇인가?
(Which of the following components of program state are shared across threads in a multithreaded process?)
a. 레지스터 값들: Register values
b. 힙 메모리: Heap memory
c. 전역 변수들: Global variables
d. 스택 메모리: Stack memory
정답은 b.힙 메모리와 c.전역변수 이다.
레지스터 값들, 스택 메모리는 스레드가 개별적으로 갖고있는 값들이고,
힙 메모리, 전역변수는 스레드 간 공유한다.(한 프로세스 안에서 여러 일을 빠르게 하기 위해)
4.4 다수의 사용자 수준 스레드를 사용하는 다중 스레드 해결책이 단일 처리기 시스템보다 다중 처리기 시스템에서 더 나은 성능을 보일 수 있는가? 여러분의 답에 대한 정당성을 제시하시오.
(Can a multithreaded solution using multiple user-level threads achieve better performance on a multiprocessor system than on a singleprocessor system? Explain.)
더 나은 성능을 보일 수 있다. 하나의 코어에서는 한번에 오직 하나의 쓰레드만 실행시킬 수 있다. 단일 처리기 시스템은 처리기가 하나인 반면 다중 처리기 시스템은 각각의 처리기에게 사용자 스레드를 분배할 수 있기 때문에 단일 처리기 시스템보다 더 빠르게 처리할 수 있다.
4.5 3장에서 Google 의 Chrome 브라우저에 대해서 논의할 때 새로운 웹사이트마다 개별 프로세스에서 연다는 것을 알았다. 만일 새로운 웹사이트를 프로세스 대신에 개별 스레드에서 열었다면 같은 이득을 얻을 수 있을까?
개별 스레드에서 연다면 하나의 웹사이트에서 오류가 발생해서 종료해야 하는 상황에서 다른 모든 웹사이트도 종료해야하기 때문에 같은 이득을 얻을 수 없다.
(개별 프로세스인 경우 오류가 난 해당 웹사이트만 종료시킬 수 있다.)
4.6 병렬성은 아니지만 동시 수행성을 가지는 것이 가능한가? 여러분의 답에 대한 정당성을 설명하시오.
사용자가 인식하지 못할 정도로 빠르게 문맥 교환(context switching)을 수행하면,
사용자는 프로그램이나 기능이 동시에 수행되는 것처럼 느끼기 때문에 병렬성은 아니지만 동시 수행성을 가지는게 가능하다.
4.7 Amdahl의 법칙을 사용하여 60%의 병렬 수행 부분을 가진 응용을 (a) 두 개의 계산 코어와 (b) 4개의 계산 코어를 가진 컴퓨터에서 실행 했을 때의 속도 향상 이득을 계산하시오.
Amdahl의 법칙: speed up<= 1/S+(1-S)/N
S: 순차적인 구성요소, N: 코어의 개수
(a): S=0.4, N=2
speed up<= 1/S+(1-S)/2
≈ 1.43이므로 약 1.43배 속도 향상이 됩니다.
(b): S=0.4, N=4
speed up<= 1/S+(1-S)/4
≈ 1.82이므로 약 1.82배 속도 향상이 됩니다.
4.8 다음 문제들이 태스크 병렬성 또는 데이터 병렬성을 보이는 지 결정하시오.
태스크 병렬성:
데이터 병렬성:
- 연습문제 4.16에 설명되는 다중 스레드 통계 프로그래머
- 본 장의 프로젝트 1에서 설명되는 다중 스레드 Sudoku 검증기
- 본 장의 프로젝트 2에서 설명되는 다중 스레드 소팅 문제
- 4.1절에서 설명된 다중 스레드 웹서버
: TODO
4.9 두 개의 이중 코어 처리기는 스케줄 가능한 4개의 처리기를 가지고 있다. CPU-집중응용이 이 이스템에서 실행중이라고 하자. 모든 입력은 프로그램이 시작할 때 주어지고 반드시 하나의 파일이 열려야 한다. 마찬가지로 모든 출력은 프로그램이 종료되기 전에 수행된다. 프로그램의 결과는 하나의 파일에 모두 기록되어야한다. 프로그램이 시작해서 종료할 때까지 프로그램은 CPU 집중적이다. 여러분은 이 프로그램을 다중 스레드화하여 성능을 향상시켜야한다. 응용은 일대일 스레드 모델을 사용하며 각 사용자 수준 스레드는 커널스레드에 사상된다.
입력과 출력을 위해 몇 개의 스레드를 생성할 것인가? 근거를 제시하시오.
입출력을 위해서는 1개의 스레드를 생성할 것이다.
입출력 부분에서 스레드가 많다고 속도가 빠를 것 같다고 생각하지 않는다.
스레드 간의 경쟁으로 인해서 입력과 출력이 순차적으로 되지 않을 것 같다.
CPU 집중 부분 연산을 위해 몇 개의 스레드를 생성할 것인가? 근거를 제시하시오.
연산을 위해 4개의 스레드를 생성할 것이다. (처리기 개수와 동일하게 생성)
병렬 수행으로 연산을 빨리 할 수 있기 때문에 처리 시간이 단축될 것이다.
스레드를 더 많이 생성하면 오버헤드 때문에 성능이 저하될 것 같다.
4.10 다음 코드 세그먼트를 고려하시오.
pid t pid;
pid = fork();
if (pid == 0) { // child process
fork();
thread create( . . .);
}
fork();
a. 몇 개의 프로세스가 생성되는가?
: 6개
b. 몇 개의 스레드가 생성되는가?
: 2개
처음 fork()에서 원래 프로세스의 복사본 생성 -> 프로세스 총 2개
if 문 안에서 fork() -> 프로세스 총 3개
thread create() -> 스레드 총 2개
맨 밑의 fork() -> 세 프로세스 모두 fork() 호출 -> 프로세스 총 6개, 2개의 스레드
4.11 4.7.2절에서 설명된 것처럼 Linux는 프로세스와 스레드를 구별하지 않는다. 대신 Linux는 둘을 같은 방법으로 다룬다. clone() 시스템 호출에 전달되는 플래그에 따라 태스크는 프로세스에 더 가깝거나 스레드에 가까울 수 있다. 그러나 Windows와 같은 많은 운영체제들은 프로세스와 스레드를 다르게 취급한다. 통상 이러한 시스템들은 프로세스를 위한 자료 구조가 프로세스에 속한 스레드를 가리키는 포인터를 포함하게 하여 이 관계를 표시한다. 커널 안에서 프로세스와 스레드를 모델링하는 이 두 가지 방식을 비교하라.
: TODO
4.12 그림 4.16에 보인 프로그램은 Pthreads API를 사용한다. LINE C와 LINE P의 출력은 무엇인가?
LINE C:
CHILD: value = 5
LINE P:
PARENT: value = 0
4.13 다중 처리기 시스템과 다대다 모델을 사용하여 작성된 다중 스레드 프로그램을 고려하자. 프로그램의 사용자 수준 스레드의 개수가 시스템의 처리기 개수 보다 많다고 가정하자. 다음과 같은 시나리오에서 성능 예측을 논의하시오.
a. 프로그램에 할당한 커널 스레드의 개수가 처리기보다 많다.
처리기 1개당 커널 스레드가 1개보다 많으므로 병렬 수행은 가능하나,
커널 스레드의 개수가 많아서 오버헤드의 가능성이 있다.
b. 프로그램에 할당된 커널 스레드의 개수가 처리기의 개수와 같다.
처리기 1개당 커널 스레드가 1개 씩 있는 것이므로 병렬 수행이 가능하고 성능이 좋다.
c. 프로그램에 할당된 커널 스레드의 개수가 처리기의 개수보다 훨씬 많지만 사용자 수준의 스레드 보다는 작다.
처리기 1개당 커널 스레드가 1개보다 많으므로 병렬 수행이 가능하고, block이 발생해도 swap되므로 시스템 활용율이 높을 것이다.
하지만 a와 마찬가지로 커널 스레드의 개수가 많아서 오버헤드의 가능성이 있다.
4.14 Pthreads는 스레드 취소를 관리할 수 있는 API를 제공한다. pthread_setcancel-state() 함수는 스레드 상태를 지정하는 데 사용되며, 원형은 다음과 같다.
pthread setcancelstate(int state, int *oldstate)
PTHREAD_CANCEL_ENABLE과 PTHREAD_CANCEL_DISABLE 상태 중에서 하나로 지정할 수 있다.
그림 4.17의 코드 세그먼트를 사용하여 스레드 취소 사용불가능 상태로 지정하기 위한 함수 호출과 취소 사용 가능 상태로 지정하기 위한 함수 호출 상태 사이에 수행하기 적합한 두 연산의 예를 제시하시오.
: TODO
'CS > 운영체제론' 카테고리의 다른 글
운영체제 공룡책 3장(Ch.3) 연습 문제 및 풀이 (0) | 2022.07.11 |
---|---|
운영체제 공룡책 Ch1: Introduction (0) | 2022.06.28 |