CafeM0ca

[OS] 공룡책 Chapter 3 연습문제 풀이 10th edition 본문

OS/공룡책

[OS] 공룡책 Chapter 3 연습문제 풀이 10th edition

M0ca 2021. 1. 14. 20:07
반응형

 

3.1) 3.30 Figure를 보고 LINE A의 결과물이 무엇인지 설명하세요.

Figure 3.30

 

코드를 실행하면 위와 같은 결과가 나온다. 의문점은 pid = fork()를 통해서 자식프로세스도 똑같은 코드를 갖게 될 텐데, 재귀적으로 fork()를 하는거라고 생각할 수 있다. forum.falinux.com/zbxe/index.php?mid=C_LIB&document_srl=412814 에 따르면

fork된 자식 프로세스는 딱 하나가 다른데, pid = fork()한 부분이 없어지고 pid = 0으로 갖게 된다.

wait(NULL)은 자식 프로세스를 기다린다. 

 

3.2) 부모프로세스에서 초기화를 포함하면 Figure 3.31에서는 얼마나 많은 프로세스가 생성되나요?

초기 부모프로세스 1개

첫번째 fork()에서 부모 1개, 자식 1개, 총 프로세스 2개

두번재 fork()에서 부모 1개, 자식 3개, 총 프로세스 4개

세번째 fork()에서 부모 1개, 자식7개, 총 프로세스 8개

아래 코드에서 pid1은 2번, pid2는 4번, pid3는 8번 출력되는 것을 확인할 수 있다.

 

3.3) Original versions of Apple’s mobile iOS operating system provided no means of concurrent processing. Discuss three major complications that concurrent processing adds to an operating system.

1) 동시성 지원을 위한 CPU 스케쥴링과 알고리즘

2) 프로세스간 통신을 위한 IPC

3) 여러 프로세스를 동시에 관리하기 위한 메모리 관리

 

 

3.4) 몇몇 컴퓨터 시스템은 multiple register 집합을 제공한다. 만약 새로운 context가 존재하는데 레지스터 집합을 다 사용했으면 context switch할 때 무슨 일이 발생하는지 설명하세요. 

레지스터 집합중에 하나를 랜덤하게 뺏어서 context 를 담을 레지스터를 확보한다. 

 

3.5) 프로세스가 fork()를 수행한다면 부모와 자식 프로세스는 아래 a,b,c 중에 어느 영역을 공유하는가?

a) Stack

b) Heap

c) Shared memory segments

답은 c) fork() 된 프로세스는 부모 프로세스의 메모리를 복사하기 때문에 각 프로세스마다 갖는 stack, heap, data, code 영역은 동일할 것이고, 공유메모리 영역은 프로세스 메모리 영역이 아닌, 따로 존재하므로 c를 공유할 것이다.

3.6) RPC 메커니즘의 '정확히 한 번'의 의미를 고려해봅시다. 이 메커니즘 체계를 구현하는 알고리즘은 네트워크 문제로 인해 클라이언트로 다시  전송된 ACK 메시지가 손실 된 경우에도 올바르게 실행되는가? 메시지의 순서를 설명하고 '정확히 한 번'이 보장되는지 논의하십시오.

 

The general strategy is for the client to send the RPC to the server along with a timestamp. The client will also start a timeout clock. The client will then wait for one of two occurrences: (1) it will receive an ACK from the server indicating that the remote procedure was performed, or (2) it will time out. If the client times out, it assumes the server was unable to perform the remote procedure, so the client invokes the RPC a second time, sending a later timestamp. The client may not receive the ACK for one of two reasons: (1) the original RPC was never received by the server, or (2) the RPC was correctly received—and performed—by the server but the ACK was lost. In situation (1), the use of ACKs allows the server ultimately to receive and perform the RPC. In situation (2), the server will receive a duplicate RPC, and it will use the timestamp to identify it as a duplicate so as not to perform the RPC a second time. It is important to note that the server must send a second ACK back to the client to inform the client the RPC has been performed.

3.7) 분산된 시스템이 서버 오류에 취약하다고 가정하자. 어떤 메커니즘이 RPC 실행을 위해 "exactly once"의 의미를 보장할 수 있도록 요구되어야 하는가?

서버는 RPC를 받았는지, 성공적으로 수행여부와 동작과 관련된 결과를 stable storage(디스크 로그)로 지속적으로 추적할 수 있어야한다.

서버가 충돌나고  RPC메시지를 받았을때 서버는 RPC가 이전에 수행되었는지 확인할 수 있어야 "exactly once"를 보장할 수 있다.

 

반응형

3.8) 프로세스간 context-switch 할 때 커널이 어떤식으로 작동하는지 설명하세요.

1. clcok 인터럽트에 대한 응답으로 OS는 현재 실행중인 프로세스의 스택포인터를 저장하고 제어권을 커널 clock 인터럽트 핸들러에게 전달

2. clock interrupt handler는 PCB에 저장된 레지스터를 저장한다.

3. OS는 스케줄러를 호출하여 실행할 다음 프로세스를 결정한다.

4. OS는 PCB로 부터 다음 프로세스의 상태를 가져오고 레지스터를 복구한다. 이 복원 작업은 프로세서를 프로세스가 이전에 중단 된 상태로 되돌리고 사용자 모드 권한이 있는 사용자 코드에서 실행된다.

 

tmi) 프로세스는 커널에서 살아나고 커널에서 죽는다.

3.9) 넘어갑니다. process monitor tool에 관한 내용

 

3.10) 프로세스 종료와 관련하여 유닉스와 리눅스 시스템에서 init(또는 systemed) 프로세스의 역할을 설명하세요.

init 프로세스는 다른 프로세스들의 선조가 되는 역할을 한다. 커널이 부팅되는 동안 실행된다.

스크립트로 저장된 /etc/inittab의 있는 프로세스들을 생성하는게 역할이다.

 

프로세스가 종료 될 때, 부모프로세스에 데이터를 전달하기 위하여 자식 프로세스의 영역이 남게 된다. 보통은 부모 프로세스가 wait() 시스템 콜을 호출해 메모리를 해제하는데 wait()을 호출하지 못하면 init 프로세스가 그 역할을 주기적으로 해주어 고아/좀비 프로세스를 해제시킨다.

 

3.11) 초기 부모 프로세스를 포함하면 아래 코드에서 몇 개의 프로세스들이 생성됩니까?

초기 부모 1개

첫번째 for문에서 자식 1개, 자식은 앞으로 3개의 fork 실행.  현재 총 프로세스 : 부모1, 자식 1

두번째 for문에서 자식 2개, 각각의 자식은 앞으로 2개의 fork 실행. 현재 총 프로세스 : 부모1, 자식 3

세번째 for문에서 자식 4개, 각각의 자식은 앞으로 1개의 fork 실행. 현재 총 프로세스 : 부모1, 자식 7

네번째 for문에서 자식 8개, 루프가 끝나면서 총 프로세스는 부모 1 + 자식 15 = 16개

2의 제곱으로 올라가는 것을 확인할 수 있다. 

 

3.12) LINE J에 도달하는 상황을 설명하세요.

 

우선 자식 프로세스를 fork()한다.

부모는 wait(NULL)에 걸려서 자식 프 로세스가 종료될 떄 까지 기다린다.

자식은 pid == 0에서 분기되어 ls를 실행하고 LINE J를 출력한다.

자식 프로세스는 죽는다.

부모 프로세스는 자식 프로세스가 죽고 Chile Complete를 출력한다.

 

3.13) 아래 코드의 LINE A,B,C,D의 값을 작성하세요. (부모 프로세스는 pid가 2600, 자식프로세스는 pid가 2603으로 가정합니다.)

pid = fork()에서 할당된 pidsms 2603이다.

부모와 자식이 누가 먼저 출력하는 지는 운영체제의 스케쥴러에 따라 다르므로 알 수 없다.

A는 분기에서 pid == 0이므로 0

B는 자식 프로세스가 2603으로 가정했으므로 2603

C는 부모 프로세스가 자식프로세스의 PID를 갖고 있으므로 2603

D는 부모 프로세스의 값 2600 

3.14) Ordinary pipe가 Named pipe보다 적합한 상황과 Named pipe가 Ordinary pipe보다 적합한 상황을 제시하시오.

Ordinary pipe가 Named pipe 보다 더 적합한 경우: 생산자-소비자 모델을 사용할 때(프로세스간 심플한 통신이 필요할 때)

Named pipe가 Ordinary pipe보다 더 적합한 경우: 여러 프로세스간 복잡한 통신이 필요할 때.(A,B,C 프로세스간 통신을 Oridinary pipe로 상호 통신하려면 6개의 파이프가 필요함. Named Pipe의 경우 3개면 충분)

 

3.15) 넘어갑니다.

 

3.16) 아래 소스코드에서 X,Y에 값은?

X : 0, -1, -4, -9, -16

Y : 0, 1, 2, 3, 4

3.17) 아래 질문에서 각각의 장점과 단점은 무엇인가요? 시스템 레벨과 프로그래머 레벨에서 생각해보세요.

A: 동기와 비동기의 커뮤니케이션

  동기의 장점은 데이터의 순서를 보장할 수 있고 프로그래밍이 비동기보다 쉽다는 점. 

  비동기는 이와 반대로 데이터 순서 보장 불가, 프로그래밍이 까다로움

 

B: automatic buffering과 explict buffering

  automatic 버퍼는 무한 큐로 sender는 block 되지 않음. explicit 버퍼는 버퍼가 꽉 찼으면 sender는 block됨

 

C: 복사로 전송과 참조로 전송

  복사로 전송할 경우 receiver는 값을 수정해도 문제가 없음. 참조로 보낼 경우 reciver는 값을 안바꾸는게 좋음.

 

D: 고정된 메시지와 가변길이 메시지

  fixed size message는 전체 메시지의 일부분만 보낼 때나, 메시지의 크기가 버퍼보다 작을 때 사용하고 variable-size 메시지는 버퍼의 크기를 모를 때 사용함. 

 

답지) codex.cs.yale.edu/avi/os-book/OS10/practice-exercises/index-solu.html

반응형
Comments