본문 바로가기
운영체제

OPERATING SYSTEM CONCEPTS 에센셜 연습문제 4장 #2

by 핫동경 2022. 4. 24.
반응형

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

1. 순차적으로 실행되어야 하는 프로그램일 때

2. 프로그램이 실행되는 것을 계속 모니터링해야하는 프로그램일 때


[4.7 단일 처리기 시스템에서의 프로그래밍을 고려하자. 다중 커널 스레드를 사용하여 다중 스레드 프로그램을 만들었을 때 이 프로그램의 성능이 단일 스레드만 사용하는 프로그램에 비해 더 나은 성능을 보이는 경우는 언제인가?]

응용 프로그램이 긴 작업을 수행할 때 더 나은 성능을 보여준다.

프로그램의 수행이 계속되는 것을 허용함으로써 사용자에 대한 응답성을 증가시킨다.

예를들어 시간이 많이 걸리는 연산을 시작하는 버튼을 클릭했을 때 단일 스레드는 그 연산이 완료될 때까지 사용자에게 응답하지 않지만 다중 스레드는 연산이 실행되어도 사용자에게 응답이 가능하다.


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

A. 레지스터 값들

B. 힙 메모리

C. 전역 변수들

D. 스택 메모리

 

힙 메모리와 전역변수들이 공유된다.


[4.9  다수의 사용자 수준 스레드를 사용하는 다중 스레드 해결책이 단일 처리기 시스템보다 다중 처리기 시스템에서 더 나은 성능을 보일 수 있는가? 여러분의 답에 대한 정당성을 제시하시오]

더 나은 성능을 보일 수 있다. 단일 처리기는 한번에 하나의 일을 처리할 수 있지만 다수의 사용자 수준 스레드를 사용하면 각 처리기에서 사용자 스레드에게 태스크를 분배할 수 있으므로 더 효율적일 것이다.


[4.10 3장에서 Google의 Chrome 브라우저에 대해서 논의할 때 새로운 웹사이트마다 개별 프로세스에서 연다는 것을 알았다. 만일 새로운 웹사이트를 프로세스 대신에 개별 스레드에서 열었다면 같은 이득을 얻을 수 있을까?]

얻지 못할 것이다. 스레드에서 새로운 웹사이트를 연다면 그 웹사이트가 오류로 인해 종료될 상황이 생기면 나머지 다른 웹사이트들 또한 종료되기 때문이다.


[4.11 병렬성은 아니지만 동시 수행성을 가지는 것이 가능한가? 여러분의 답에 대한 정당성을 설명하시오]

가능하다. 이러한 것을 병행 수행이라고 하는데 시분할을 이용하거나 빠른 문맥교환으로 인해 마치 동시 수행(병행수행)하는 것처럼 보이게 할 수 있다.


[4.12 Amdahl의 법칙을 사용하여 60%의 병렬 수행 부분을 가진 응용을 (a) 두 개의 계산 코어와 (b) 4개의 계산 코어를 가진 컴퓨터에서 실행했을 때 속도 향상 이득을 계산하시오.]

S = 순차 수행 부분

N = 처리 코어의 개수

 

60%의 병렬 수행이므로 S=40% 이므로 0.4

2개의 계산코어와 4개의 계산코어이므로 N은 각각 2, 4

 

(a)는 코어가 2개이다.  위 식을 대입해 소수점 3째자리까지 반올림을 한다면 1.43배 향상이다.

(b)는 코어가 4개이다. 위 식을 대입해 소수점 3째자리까지 반올림을 한다면 1.82배 향상이다.


[4.13 다음 문제들이 태스크 병렬성 또는 데이터 병렬성을 보이는지 결정하시오]

1. 연습문제 4.21에 설명되는 다중 스레드 통계 프로그램 = 태스크 병렬성(각 스레드가 자신만의 연산수행)

2. 이 장의 프로젝트 1에서 설명되는 다중 스레드 Sudoku 검증기 = 태스크 병렬, 데이터 병렬 모두

3. 이 장의 프로젝트 2에서 설명되는 다중 스레드 소팅 문제 = 데이터 병렬성

4. 4.1 절에서 설명된 다중 스레드 웹서버 = 태스크 병렬성


[4.14 두 개의 이중 코어 처리기는 스케줄 가능한 4개의 처리기를 가지고 있다. CPU-중심 응용이 이 시스템에서 실행 중이라고 하자. 모든 입력은 프로그램이 시작할 때 주어지고 반드시 하나의 파일이 열려야 한다. 마찬가지로 모든 출력은 프로그램이 종료되기 전에 수행된다. 프로그램의 결과는 하나의 파일에 모두 기록되어야 한다. 프로그램이 시작해서 종료할 때까지 프로그램은 CPU 집중적이다. 여러분은 이 프로그램을 다중 스레드화 하여 성능을 향상키여햐한다. 응용은 일대일 스레드 모델을 사용하며 각 사용자 수준 스레드는 커널 스레드에 생성된다.]

1. 입력과 출력을 위해 몇 개의 스레드를 생성할 것인가? 근거를 제시하시오

1개를 생성한다. 일대일 스레드 모델은 스레드가 많이 생성될 수록 오히려 성능이 저하되니 1개를 만든다. 스레드가 여러개 있다고해서 입출력이 많이 빨라지는 것도 아니기 때문이다.

 

2. CPU 자료구조 부분 연산을 위해 몇 개의 스레드를 생성할 것인가? 근거를 제시하시오

위에서 입출력을 위해 1개를 만들었으니 3개를 생성한다. 4개의 처리기를 가지고 있고 일대일 스레드 모델을 사용하기 때문에 처리기에 맞는 스레드의 개수를 만드는 것이 이상적이라고 생각한다.


[4.15 다음 코드 세그먼트롤 고려하시오]

pid_t pid;
pid=fork();
if(pid==0){
	fork();
    thread_create(...);
   }
  fork();

a. 몇 개의 프로세스가 생성되는가?  

부모 프로세스를 포함하면 8개 제외하면 7개

 

b. 몇 개의 스레드가 생성되는가?

2개


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

1. 프로세스는 fork()를 호출하여 부모의 복사본을 갖는다.

2. 스레드는 clone() 을 호출하고 전달하는 플래그에 따라서 갖는 자료구조가 다르다


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

#include<pthread.h>
#include<stdio.h>

int value = 0;
void* runner(void* param);
int main(int argc, char* argv[]) {
        pid_t pid;
        pthread_t tid;
        pthread_attr_t attr;
        pid=fork();
        if (pid == 0) {
                pthread_attr_init(&attr);
                pthread_create(&tid, &attr, runner, NULL);
                pthread_join(tid, NULL);
                printf("CHILD: value = %d\n", value);
        }
        else if (pid > 0) {
                wait(NULL);
                printf("PARENT: value = %d\n", value);
        }
}
void* runner(void* param) {
        value = 5;
        pthread_exit(0);
        }

자식 프로세스는 부모프로세스의 복사본을 갖지만 다른 값들을 가질 수 있기 때문에 값이 다르다

자식프로세스에서 쓰레드를 실행시켰기 때문에 자식프로세스의 값이 5로 변경되었다.


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

a.프로그램에 할당된 커널 스레드의 개수가 처리기보다 많다

  커널 스레드의 개수가 많기 때문에 오버헤드 및 성능저하 일어날 수 있음.

 

b.프로그램에 할당된 커널 스레드의 개수가 처리기의 개수가 같다.

  커널 스레드의 개수와 처리기의 개수가 같으므로 병렬수행이 가능하고 성능이 좋다.

 

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

 하나의 스레드가 block 되어도 봉쇄되지 않지만 스레드 개수가 많아 오버헤드 및 성능저하일어날 수 있음


 

반응형

댓글