본문 바로가기

COMPUTER/운영체제

[Operating System Concepts 10th] Chapter 3. Process 연습문제 풀이 3.1 - 3.6

친구들이랑 운영체제 스터디를 하면서, 찬찬히 배운 개념을 정리하려고 한다.

 

원래는 순서대로 해야지! 였는데, 스터디 날에 같이 푼 문제 내용을 정리해 두면 좋을 것 같아서 해당 주에 푼 문제를 정리해 놓을 생각이다.

오늘은 다들 바빠서 6문제 정도 밖에 풀지 못해서, 다음 주에 남은 부분 + chapter 4 연습문제를 풀기로. 풀면서 배웠던 것들도 있고, 이걸로 시험을 보기도 했었던 것 같은데 수업을 들으면서 해당 부분의 연습문제를 더 풀어볼 걸 하는 아쉬움이 남는다. 앞으로 복습해가면서 더 제대로 이해하기 위해 노력해야겠다.


문제 출처 : Operating System Concepts 10th edition.

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

 

3. 1 )

Using the program shown in Figure 3.30, explain what the output will be at LINE A

(해석 :  3.30번 자료를 이용해서, LINE A 가 어떤 결과를 가질지 설명하시오. )

 

> 정답

: LINE A는 5를 출력한다.

 

> 해설

: Figure 3.30번 같은 경우 기존의 value 값을 이용해서, fork()를 이용해서 자식 프로세스를 생성해서 자식 프로세스에서는 value 값에 +15, 부모 프로세스에서는 value에 아무런 동작도 하지 않는다.

: 처음에는 부모 프로세스에서 wait(NULL)을 이용하여, 자식 프로세스의 종료를 기다리기 때문에 자식 프로세스의 value 값을 반환받지 않을까라고 생각해서 20이라고 생각했었다.

: 그러나 자식 프로세스가 생성된 이후, 자식 프로세스는 부모 프로세스의 값을 복사해서 들고 있지만 이후로는 각각의 개별 된 프로세스로 메모리 영역이 분리되어 있다.

: 그러므로 자식 프로세스에서의 value 값은 20이지만, 부모 프로세스에서의 value 값은 5이다.

 

 

3. 2 )

Including the initial parent process, how many processes are created by the program shown in Figure 3.31?

(해석 : 3.31번 자료의 프로그램에 의해서 부모 프로세스를 포함해 몇 개의 프로세스가 만들어지는지 서술하시오.)

 

> 정답

: 8개의 프로세스가 만들어진다.

 

> 해설

: 해당 프로그램에서는 총 세 번의 fork() systeml call을 호출하고 있다.

: 첫 번째 fork()에서는 부모프로세스와 자식프로세스 하나가 생성되므로 총 2 개의 프로세스가 만들어진다.

: 두 번째 fork()에서는 부모프로세스가 또 다른 자식프로세스를 만들고, 첫 번째 fork() 콜로 인해 만들어진 자식프로세스가 또 다른 자식프로세스를 만든다. 즉, 부모프로세스 1개, 자식프로세스 3개가 생성되어 총 4개의 프로세스가 만들어진다.

: 세 번째 fork() 에서는 두 번째 fork() 에서와 유사하게, 이전에 생성된 자식 프로세스와 부모 프로세스가 각각 하나의 자식프로세스를 생성한다. 즉, 부모프로세스 1개, 자식 프로세스 7개가 생성되어 총 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.

(해석 : iOS의 원래 버전에서는 동시성 프로세싱을 제공하지 않는다. 그러면 OS(운영체제)에 동시성 프로세싱을 추가했을 때 세 가지 주요 문제(complications)에 대해 논하시오)

 

> 정답

: 이 문제의 경우 어떻게 해결해야 할지 몰라서, 답지를 보고 이해했다.

(1) CPU는 여러 개의 프로세스에 대한 정보를 가지고, 각 프로세스에 대한 스케줄링을 제공해야 한다.

(2) 각 프로세스끼리 통신할 수 있도록 IPC method를 개발할 필요성이 있다.

(3) 모바일 기기의 경우 메모리에 제한이 있기 때문에, 멀티 프로세싱을 지원하기 위해 사용되는 메모리가 다른 프로세스의 실행에 영향을 미칠 수 있다. 그러므로 메모리를 적절히 관리할 필요성이 있다.

 

> 추가

: 이 외에도 모바일 기기가 가지는 문제로는 배터리가 제한적이기 때문에, 명령을 처리하는 데 사용되는 에너지에 대한 고려도 필요함.

 

 

3. 4)

Some computer systems provide multiple register sets. Describe what happens when a context switch occurs if the new context is already loaded into one of the register sets. What happens if the new context is in memory rather than in a register set and all the register sets are in use?

(해석 : 몇몇 컴퓨터 시스템은 여러 개의 레지스터 집합을 제공한다. 그러면 context switch가 일어날 때, 새로운 context 가 이미 하나의 레지스터에 올라가 있을 때 어떤 일이 발생하는가? 모든 레지스터 집합이 사용 중이고, new context 가 메모리에 있다면 어떤 일이 벌어지는가?)

 

> 정답

: 이 문제 역시 답지를 참고했다. 흥미롭다.

: CPU의 레지스터 포인터는 새로운 context를 포함한 레지스터를 가리킨다.

: 만약 context 가 메모리에 있는 경우, 레지스터에 있는 context 중 하나는 반드시 선택되어, 메모리로 이동한다. 그리고 새로운 context 를 해당 위치에 로드된다.

 

 

3. 5)

When a process creates a new process using the fork() operation, which of the following states is shared between the parent process and the child process?

a. Stack

b. Heap

c. Shared memory segments

(해석 : 프로세스가 fork()를 이용해서 새로운 프로세스를 생성할 때, 다음 세 가지 선택지 중에서 부모 프로세스와 자식 프로세스 간 어떤 것을 공유하는가?)

 

> 정답

: C. Shared memory segments.

 

> 해설

: Stack과 Heap 은 프로세스의 메모리 영역에 존재하므로 부모 프로세스가 fork()를 호출할 때, 자식 프로세스에 해당 부분이 복사가 된다. 따라서 이후로 공유되는 것은 Shared memory segments 밖에 없다.

 

 

3. 6)

Consider the exactly oncesemantic with respect to the RPC mechanism. Does the algorithm for implementing this semantic execute correctly even if the ACK message sent back to the client is lost due to a network problem? Describe the sequence of messages, and discuss whether exactly onceis still preserved.

(해석 : RPC의 관점에서 "exactly once"를 생각해보자. 만약 클라이언트에게 다시 보내지는 ACK 메시지가 네트워크 문제로 유실되었을 때에도 이 알고리즘은 정확하게 동작하는가? 이 과정에 대해서 묘사하고, "exactly once"가 여전히 지켜질지 아닐지에 대해 논의하시오.)

 

> 정답

: 이것도 정답을 참고했다.

: "exactly once"의 경우 프로시저가 정확히 한번 실행될 수 있도록 하기 위한 장치로, 일반적으로 Timestamp와 ACK(acknowledgment) 스키마를 이용한다. 이때 client는 timeout clock을 같이 사용하는데, timeout clock이 종료될 때까지 응답이 되돌아오지 않으면 다시 요청을 보낸다.

: client는 서버에게 요청을 보낼 때 client 는 서버에게서 remote procedure(프로시저)가 수행되었다는 ACK 메시지를 받거나, timeout이 나게 된다.

: timeout이 발생하는 경우, 두 가지의 상황을 예측해 볼 수 있다. 

(1) 원래의 RPC가 네트워크 문제 등으로 인해 서버에 도달하지 않은 경우

: 이 경우 timeout 이후에 client에서 다시 요청을 보내기 때문에, 언젠가는 서버에서 RPC를 받고, 수행하게 된다.

(2) RPC가 서버에 제대로 도착했으나, 수행되었다는 ACK 메시지가 네트워크 문제로 전달되지 않은 경우.

: 이 경우 timeout 이후에 client에서 다시 요청을 보내기 때문에 서버는 중복된 RPC를 받는다. 그러나 요청에 포함된 timestamp를 이용해서 그것이 중복되었다는 것을 확인한 후 재실행하지 않는다.  이후 서버는 두 번째 요청에 대한 ACK 메시지를 클라이언트에게 보낸다. (첫 번째 요청에 대한 메시지를 보내는 것이 아님)

 

> 참고

해당 문제를 이해하는 데 있어서 RPC에서의 'at most one'과 'exactly one'의 차이나, 왜 사용하는지가 명확하지 않아서 다시 정리해봤다.

- at most one : 최대 1개의 동작을 수행한다는 의미로 RPC 가 수행되거나, 하나만 수행되는 것을 보장한다. 이때 요청에 timestamp를 담아서 보내게 되는데 서버는 모든 요청의 timestamp 를 기록해 두고 있다가, 같은 요청에 대한 정보가 이미 있다면 뒤에 들어온 요청을 무시한다. 즉, RPC를 여러 번 실행되는 것을 막으나, 네트워크 문제로 인해 RPC 요청이 받아지지 않는 경우 아무것도 수행하지 않는다.

- exactly one : 서버가 요청을 아예 받지 못하는 경우를 방지하기 위한 것으로, 'at most one' 방식에 client를 구분하는 동작이 추가된다.(ACK message). 이 경우 클라이언트는 주기적으로 ack 메시지를 보내는데, 서버로부터 동작이 제대로 수행되었다는 ack 메세지를 전달받지 못할 경우 클라이언트에서는 재요청을 보내게 된다. 즉, RPC 가 여러 번 실행되는 것과, 아예 실행되지 않는 경우 모두를 방지한다.