본문 바로가기

CS/운영체제론

운영체제 공룡책 3장(Ch.3) 연습 문제 및 풀이

Operating System: Concepts 9판 한글판 기준 연습문제 및 풀이입니다.

 


3.1 단기, 중기, 장기 스케줄링의 차이점을 설명하시오.

(Describe the differences among short term, medium term, and long term scheduling.)

 

스케줄링: 메모리에 있는 여러 프로세스 중에서 어떤 프로세스가 CPU 점유권을 가질 지 정해주는 것을 말한다.

단기 스케줄링은 메모리와 CPU 사이의 스케줄링을 담당해 빈번하게 일어나며, 빠르다. (프로세스의 상태 중 ready -> running -> waiting -> ready)

중기 스케줄링은 스와핑에 관여한다. (프로세스를 디스크로 옮기거나 디스크에서 다시 메모리로 불러오는 것, 다른 챕터에서 자세히..)

장기 스케줄링은 메모리와 하드디스크 사이의 스케줄링을 담당하며 호출 빈도가 낮다. (new-> ready, running/ready -> terminated)

 


3.2 프로세스들 사이에 문맥을 교환할 때 커널이 수행하는 작업을 설명하시오.

(Describe the actions taken by a kernel to context-switch between processes.)

 

context-switch: CPU를 새로운 프로세스가 사용해야 할 때, 이전 프로세스 상태를 어딘가에 저장하고 새로 들어올 프로세스의 상태를 가져오는 작업

context-switch가 일어날 때 커널은 현재 실행하던 프로세스의 정보를 PCB(Process Control Block)에 저장하고 PCB를 대기큐에 등록한다. 이후 새로운 프로세스의 context가 담겨있는 PCB에서 정보를 가져와 CPU에 적재(load)한다.

 


3.4 UNIX와 Linux 시스템의 init 프로세스의 역할을 프로세스 종료의 관점에서 설명하시오.

(Explain the role of the init process on UNIX and Linux systems in regard to process termination.)

 

부팅 시 init 프로세스가 load되고, init 프로세스가 시스템 구동에 필요한 여러 프로세스들을 load 시킨다.

이후 init 프로세스는 백그라운드 프로세서로 동작하며 다른 프로세스들을 감시하는데,

이 때 감시하던 프로세스의 자원이 올바르게 반환되지 않아 좀비 프로세스가 될 경우 init 프로세스가 해당 프로세스의 부모 역할을 수행해준다. (해당 프로세스의 자원을 반환해준다.)

 

+ 부모프로세스가 wait()을 호출하지 않고 단순히 먼저 종료할 경우 해당 프로세스는 자원이 올바르게 반환되지 않아 좀비 프로세스가 된다.

 


3.5 그림 3.31에 보인 프로그램에서 부모 프로세스를 포함하여 총 몇 개의 프로세스가 생성되는가?

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

 

그림 3.31의 코드를 보면, for 문 (int i = 0 ~ 3까지 ) 안에서 fork();가 호출되므로 fork()가 총 4번 호출된다.

따라서 부모 프로세스를 포함하여 총 2^4 = 16 개의 프로세스가 생성된다.

 


3.6 그림 3.32의 프로그램에서 printf("LINE J")가 실행되는 상황을 설명하시오.

(Explain the circumstances under which the line of code marked printf(“LINE J”) in Figure 3.32 will be reached.)

그림 3.32의 코드에서 printf("LINE J");는 execlp("/bin/ls", "ls", NULL); 명령어 밑의 줄에 있는데,

exe 계열의 명령이 정상적으로 수행될 경우 밑 부분 코드는 실행되지 않는다.

따라서 printf("LINE J");가 실행되었다면 execlp의 파라미터가 잘못되었거나 지정된 프로그램이 존재하지 않아 execlp 명령에 실패한 것이다.

 


3.7 그림 3.33에 보인 프로그램에서 A, B, C, D행의 pid 값은 무엇인가? (부모와 자식의 실제 pid는 각각 2600과 2603이라고 가정한다.)

Using the program in Figure 3.33, identify the values of pid at lines A,B,C, and D. (Assume that the actual pids of the parent and child are 2600 and 2603, respectively.)

 

(한글판 책엔 그림 3.34로 오타가있다.)

A: child: pid = 0

B: child: pid1 = 2603

C: parent: pid = 2603

D: parent:  pid1 = 2600

 


3.8 일반 파이프를 사용하는 것이 지명 파이프를 사용하는 것보다 더 적절한 상황의 예와, 반대로 지명 파이프를 사용하는 것이 더 적절한 상황의 예를 들어보시오.

(Give an examples of a situation in which ordinary pipes are more suitable than named pipes and an example of a situation in which named pipes are more suitable than ordinary pipes.)

 

일반 파이프는 파이프를 사용하는 프로세스가 실행 중일때만 존재한다. 따라서, 일반 파이프는 특정 프로세스만 파이프를 이용할 때 유용하다. 반대로 지명 파이프는 파일 시스템을 사용하여 프로세스 간 통신을 구현하는 기법으로써 특정한 속성을 갖는 파이프를 다수의 프로세스에서 이용하고자 할 때 유용하다.

 


3.9 RPC 기법을 고려하자. “최대 한 번”이나 “정확히 한 번”방식으로 동작해야 한다는 제약을 하지 않았을 때 발생할 수 있는 바람직하지 않은 결과에 대해 기술하시오. 이와 같은 보장을 하지 않는 RPC를 사용할 수 있는 예를 들어 보시오.

(Consider the RPC mechanism. Describe the undesirable consequences that could arise from not enforcing either the “at most once” or “exactly once” semantic. Describe possible uses for a mechanism that has neither of these guarantees.)

 

RPC(Remote Procedure Call) 기법이 최대 한 번/정확히 한 번 동작한다는 제약을 받지 않으면, 이 RPC 기법을 가진 시스템에서 프로시저 콜이 한 번만 일어난다고 보장할 수가 없다. (= 프로시저 콜이 여러 번 발생할 수 있다.)

예를 들어, 전자 상거래의 경우 사용자가 결제 정보를 RPC 기법으로 처리하는데 위 두 가지를 제약하지 않는다면 결제정보가 여러 번 요청되어 결제되는 문제가 생길 수 있다.

이러한 보장을 하지 않는 RPC는 시간에 민감하지 않고 데이터를 변경시키지 않는 곳에서 사용 가능하다. 예를 들어, 전자 상거래에서 물건의 이름, 가격, 회사 위치 등의 정보를 물을 때는 최대 한 번, 정확히 한 번 동작함을 보장해주지 않는 RPC 방식을 사용할 수 있다.

 


3.10 그림 3.34의 프로그램에서 X와 Y행의 출력에 대해 설명하시오.

(Using the program shown in Figure 3.34, explain what the output will be at lines X and Y.)

 

일단, fork(); 이후 nums 배열은 부모/자식 프로세스가 각각 가지고 있는 배열이므로 별개이다.

LINE X: child 프로세스의 nums 배열에 -i를 곱한 값이므로 = 0, -1, -4, -9, -16

LINE Y: parent 프로세스의 nums 배열 =0, 1, 2, 3, 4

 


3.11 다음에 나오는 기법들의 장점과 단점은 무엇인가? 시스템 관점과 프로그래머 관점을 모두 고려하시오.

(What are the benefits and the disadvantages of each of following? Consider both the system level and the programmer level.)

 

a. 동기적 통신과 비동기적 통신:  Synchronous and asynchronous communication

동기적(Synchronous) 통신은 메시지를 보내고 답변이 올 때까지 답변을 기다리는 방식으로, 시스템 & 프로그래머 관점에서 구현이 간단하다는 장점이 있지만, 답변이 올 때까지 프로세스가 어떠한 작업도 할 수 없다는 단점이 존재한다.

비동기적(Asynchronous) 통신은 이벤트 핸들러를 이용해야 하는 등 오버헤드가 발생한다는 단점이 있지만, 통신을 하면서 프로세스가 다른 작업을 수행할 수 있다는 장점이 있다.

 

b. 자동 버퍼링과 명시적 버퍼링: Automatic and explicit buffering

자동 버퍼링은 OS가 버퍼링이 필요하다고 판단한 경우 버퍼링을 수행하기 때문에 시스템 측면에서 효율적으로 자원 관리가 가능하고 프로그래머 관점에서도 프로그램 구현이 단순해진다는 장점이 있으나, 특정 경우에는 프로그래머가 명시적으로 정의한 버퍼링보다 효율이 안좋을 수 있다는 단점이 있다.

명시적 버퍼링은 프로그래머가 명시적으로 버퍼링을 구현해야 한다는 단점이 있지만, 튜닝을 통해 자동 버퍼링보다 높은 성능 향상을 기대할 수 있다는 장점이 있다.

 

c. 복사에 의한 송신과 참조에 의한 송신: Send by copy and send by reference

복사에 의한 송신은 원본 데이터는 그대로 유지하기 때문에 데이터의 안정성을 확보할 수 있다는 장점이 있지만, 데이터 복사 과정에서 오버헤드가 발생한다는 단점이 있다.

참조에 의한 송신은 데이터 복사 과정이 없기 때문에 이에 대한 오버헤드가 발생하지 않는다는 장점이 있지만, 다른 함수/객체에서 의도치 않게 원본 데이터 값을 변경하게 되는 일이 발생할 수 있다는 단점이 있다.

 

d. 고정 크기와 가변 크기 메시지: Fixed-sized and variable-sized messages

고정 크기 메시지는 시스템 관점에서 항상 고정된 크기의 메세지를 다루므로 파이프라이닝, 버퍼링 등 시스템의 효율을 향상시킬 수 있는 여러 기법을 활용할 수 있다는 장점이 있으며 프로그래머 관점에서도 구현이 쉽다. 그러나 고정 크기 이므로 설정된 크기보다 작은 크기의 메시지의 경우 공간이 낭비되고, 설정된 크기보다 큰 메시지는 전송이 불가능하다는 단점이 있다.

반면, 가변 크기 메시지는 공간을 효율적으로 활용할 수 있고 메모리의 범위 안에서 모든 크기의 메시지를 전송할 수 있다는 장점이 있으나

시스템이 연산을 최적화 할 수 없다는 단점과 구현이 복잡해진다는 단점이 존재한다.