티스토리 뷰

SoftWare/OS

OS - 4. Thread 연습문제

White Whale 2016. 7. 5. 17:08
728x90

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

다중스레드에서는 각각의 스레드 중 어떤 스레드가 먼저 시작될지 모른다.

 예시 1) 공유되는 변수 i의 값을 1씩 증가시키는 프로그램의 경우. 순차적으로 값이 증가되어야 하는데 한 번에 2씩 증가할 수도 있는 등 순차적으로 실행되는 것을 보장 할 수 없다.


예시 2) C shell 같은 쉘프로그램(실행내용을 계속 모니터해야하는 프로그램들) 일 때 제대로 기능을 할 수 없다.


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

단일 처리기 시스템이기 때문에 비록 연산 속도의 향상은 얻을 수 없지만, 사용자 반응 시간이라는 측면에서 볼 때는 성능 향상을 얻을 수 있다. 여러 스레드가 시스템에 적재되어 있고, 각각의 스레드는 사용자의 반응에 의해 활성화되도록 프로그램을 구성한다면 사용자의 다양한 반응에 대해 즉각적으로 반응할 수 있기 때문에 단일 스레드만 사용하는 프로그램에 비해 더 나은 성능을 보일 수 있다.


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

a. 레지스터 값들

b. 힙 메모리

c. 전역변수들

d. 스택 메모리


-  다중 스레드 프로세서의 스레드 사이에 공유되는 프로그램 상태는 (b)힙 메모리와, (c) 전역 변수 들입니다. (a)레지스터 값들과 (d)스택 메모리는 프로세서 내에 다른 실행 흐름을 가지기 위해서 스레드당 개인적으로 들고 있는 값들이고 (b)힙 메모리와, (c) 전역 변수와 같이 공유되어지면서 한 프로세서 안에서 여러 일을 빠르게 할 수 있습니다.


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

더 나은 성능을 보일 수 있다고 생각한다. 하나의 코어에는 한 번에 오직 하나의 쓰레드만 실행시킬 수 있다. 다수의 사용자 수준 스레드가 잘 구성되어 있다고 하더라고 단일 처리기 시스템은 결국 처리기가 하나이기 때문에 순차적으로 진행될 수밖에 없다. 그러나 복수의 처리기를 가지고 있는 다중 처리기 시스템은 각각의 처리기에게 사용자 쓰레드를 분배할 수 있기 때문에 단일 처리기 시스템보다 빠르게 처리할 수 있다.


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

개별 스레드에서 연다면 하나의 웹사이트에서 오류가 발생해서 종료해야 할 상황이 오면

다른 모든 웹사이트도 종료해야하기 때문에 같은 이득을 얻을 수 없다.(개별 프로세스인 경우 오류가 난 해당 웹사이트만 종료시킬 수 있다.)


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

사용자가 인식하지 못할 정도로 빠르게 문맥 교환(context switching)을 수행하면 사용자는 프로그램이나 기능이 동시에 수행되는 것처럼 느끼기 때문에 병렬성은 아니지만 동시 수행성을 가지는 것이 가능하다.


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

-  Amdalhl의 법칙인 의 공식에서 S는 순차적인 구성요소 N은 코어의 개수이므로 60%가 병행 수행되면 S는 0.4인 (40%)의 값을 가지게 됩니다.


- (a) 코어가 2개이므로 N의 값은 2입니다.

≈ 1.43 약 1.43배 속도향상이 되었습니다.


- (b) 코어가 4개이므로 N의 값은 4입니다.

≈ 1. 82 약 1.82배 속도향상이 되었습니다.


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

- 데이터 병렬성 : 전체 데이터를 가능한 동일한 크기로 나누어 각 프로세스에 할당하고 프로세스는 할당 받은 데이터에 대해 동일한 일련의 계산을 수행하는 것으로 도메인 분해(Domain Decomposition) 라고도 한다.

- 태스크 병렬성 : 각 프로세스가 서로 다른 계산을 할당 받아 수행하는 것으로 기능적 분해(Functional Decomposition)라고도 한다. 각 프로세스는 동일한 데이터 또는 서로 다른 데이터를 가지고 서로 다른 함수의 계산을 수행하게 된다.


◾ 연습문제 4.16에 설명되는 다중 스레드 통계 프로그래머

  - 태스크 병렬성을 보인다. 문제를 보면 3개의 쓰레드를 생성한 후 하나는 숫자의 평균, 하나는 최댓값, 하나는 최솟값을 구한다. 이렇게 각각의 다른 일을 하는 것은 태스트의 병렬성이다.


◾ 본 장의 프로젝트 1에서 설명되는 다중 스레드  Sudoku 검증기

  - 태스크 병렬성과 데이터 병렬성 둘 다 보인다. 위 Sudoku 검증기는 총 11개의 쓰레드를 가지고 있다. 이중 2개의 쓰레드는 Sodoku 퍼즐의 행과 열을 각각 하나씩 검사하고 남은 9개의 쓰레드는 전체 9x9의 Sodoku 퍼즐 판을 3x3 크기로 나누어 하나씩 계산을 한다.


◾ 본 장의 프로젝트 2에서 설명되는 다중 스레드 소팅 문제

  - 데이터 병렬성을 보인다. 전체 데이터를 2개의 스레드에 정확히 둘로 나눈 후 정렬 알고리즘을 사용한다.

 

◾ 4.1절에서 설명된 다중 스레드 웹서버

  - 태스크 병렬성을 보인다. 서버는 클라이언트로부터 요청이 들어오면, 요청을 서비스할 새로운 쓰레드를 생성한다. 이때 생성된 쓰레드가 하는 읽은 클라이언트의 요청에 따라 달라짐으로 태스크의 병렬성이 보인다고 할 수 있다.


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

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

  입출력을 위해서는 1개의 스레드를 생성할 것이다. 입출력부분에서 스레드가 많다고 속도가 빠를 것 같다고 생각하지 않는다. 스레드간의 경쟁으로 인해서 입력과 출력이 순차적으로 되지 않을 것 같다.

- CPU 집중 부분 연산을 위해 몇 개의 스레드를 생성할 것인가? 근거를 제시하시오.

 연산을 위해서는 입출력을 위한 스레드를 제외하고 3개의 스레드를 생성할 것이다(처리기 개수와 동일하게) . 병렬수행으로 연산을 빨리 할 수 있기 때문에 처리시간이 단축될 것이다. 스레드를 더 많이 생성하면 오버헤드 때문에 성능이 저하될 것 같다.


4.10 다음 코드 세그먼트를 고려하시오.

a. 몇 개의 프로세스가 생성되는가? 부모 프로세스는 fork를 2번 실행하므로 부모 프로세스를 포함하여 총 3개의 프로세스가 생성된다. 또한 자식 프로세스는 fork를 한번 실행한 후에 다시 생성된 두 프로세스가 fork를 한 번씩 더 실행하므로 총 4개의 프로세스가 생성된다. 이 과정에서 부모 프로세스로부터 실행된 1개의 프로세스는 자식 프로세스로부터 생성된 4개의 프로세스의 부모 프로세스에 해당하므로 생성된 프로세스의 개수에서 제외하여야 한다. 따라서 생성된 프로세스의 수는 7개이다.


b. 몇 개의 스레드가 생성되는가? 코드에서는 자식 프로세스에서만 스레드를 생성한다. 그러나 스레드를 생성하기 전에 fork를 한번 실행하기 때문에 총 2개의 프로세스에서 1개씩 스레드를 생성하므로 2개의 스레드가 생성된다.


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

- Linux 커널에서 커널 자료구조인(struct task_struct)가 존재하는데 이 자료 구조 안에는 데이터가 저장되어 있는 다른 자료구조의 포인터를 포함합니다. 그 다른 자료 구조 안에는 열린 파일의 리스트의 자료구조나 신호처리 정보, 가상메모리 등 존재하게 됩니다.


1.  프로세서에서는 fork()를 호출하여서 새로운 task를 생성해서 부모 프로세서의 관련된 자료 구조를 복사 하게 됩니다.

2.  스레드에서는 clone() 시스템을 호출하여서 새로운 task를 생성하지만 fork()와 달리 clone()에게 전달된 플래그에 따라서 부모 task의 자료구조를 가리키게 됩니다.


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

- 코드를 보면 value는 전역변수이고 0으로 초기화 되어 있다. 이후 fork() 호출로 자식 프로세스가 생성이 된다. 자식 프로세스는 pthread를 이용해서 쓰레드를 생성한다. 해당 쓰레드 안에서는 value를 5로 초기화한다. 쓰레드는 프로세스 안에 존재하는 것이고 value는 전역변수이기 때문에 자식 프로세스의 출력에는 5라는 값을 출력되었다. 그러나 부모 프로세스의 value는 자식프로세스의 value와 다른 메모리에 있는 변수이기 때문에 자식프로세스의 스레드에 영향을 받지 않았고 따라서 출력에는 0이라는 값이 나왔다.


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

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

  - 처리기 1개당 커널스레드가 1개보다 많으므로 병렬수행이 가능한데

커널스레드의 개수가 많아서 오버헤드의 가능성이 있다.

스케쥴러가 커널스레드에 먼저 맵핑하기 때문에 유저스레드가 지연될 가능성이 있다


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

  -처리기 1개당 커널스레드가 1개씩 있는 것이므로 병렬 수행이 가능하고 성능이 좋다.

    커널스레드에서 block 이 발생하면 다른 처리기들에 지연이 발생함


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

 - 처리기 1개당 커널스레드가 1개보다 많으므로 병렬 수행이 가능하고

     block 이 발생해도 swap 되어서 시스템 활용율이 높을 것이다.

     커널스레드의 개수가 많아서 오버헤드의 가능성이 있다.


4.14 스레드 취소 사용불가능 상태로 지정하기 위한 함수 호출과 취소 사용 가능 상태로 지정하기 위한 함수 호출 상태 사이에 수행하기 적합한 두 연산의 예를 제시하시오.

1) 뮤텍스나 세마포어와 같은 상호배제 기법에서 공유 메모리에 대한 접근 권한을 획득한 스레드는 반드시 접근 권한을 반환하는 작업을 마친 후에 종료되어야 하기 때문에 위에서 예시를 들은 코드 사이에 수행하는 것이 필요하다.


2) 만약 어떠한 스레드가 필요해 의해 다른 스레드를 생성하였거나, 가비지 컬렉터가 존재하지 않는 환경에서 자신의 스택에 동적으로 할당받은 자원이 존재한다면 해당 스레드는 반드시 생성한 스레드를 종료하고, 동적으로 할당받은 자원을 반환해야 한다. 그러므로 스레드를 생성하였거나, 적으로 자원을 할당받은 스레드는 위에서 예시를 들은 코드 사이에 수행되는 것이 적합하다.



'SoftWare > OS' 카테고리의 다른 글

OS - 8. Memory Management 연습문제  (2) 2016.07.05
OS - 7. Deadlocks 연습문제  (8) 2016.07.05
OS - 3. Process 연습문제  (4) 2016.07.05
OS - 2. Operating System Structures 연습문제  (1) 2016.07.05
OS - 1. Introduction 연습문제  (4) 2016.07.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함