3 분 소요

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

image

  • 장기 스케쥴링
    • 장기 스케쥴링은 디스크와 메모리 사이의 스케쥴링을 담당한다.
    • Job Queue에서 프로세스를 가져와 Ready State로 변경한다.
    • 어떤 프로세스가 Ready State로 변경될 것인지를 결정한다.
    • 장기 스케쥴러는 I/O Bound Process (I/O burst가 큰 프로세스)와 CPU Bound Process (CPU burst가 큰 프로세스) 사이의 균형을 맞춰야 한다.
    • 대부분의 프로세스는 I/O Bound Process기 때문에, I/O bound process를 생성하게 되면 CPU가 놀게 된다.
    • 따라서 CPU bound process나, CPU bound와 I/O bound가 반반인 프로세스를 생성하게 되면 시스템의 능률이 오르게 된다.
  • 단기 스케쥴링
    • 단기 스케쥴링은 메모리와 CPU 사이의 스케쥴링을 담당한다.
    • Ready state의 프로세스들을 Running 상태로 변경한다.
    • 이 때에 스케쥴링 알고리즘들이 사용된다 (RR, FCFS…)
    • 단기 스케쥴러가 시스템의 성능에 영향을 많이 끼친다.
  • 중기 스케쥴링
    • 프로세스를 Running->Ready 혹은 Running->Wait 상태로 바꿔야 하는 경우가 있다.
    • 이 때 중기 스케쥴러를 사용한다.
    • 메인 메모리에서 다른 메모리로 프로세스를 스와핑 하거나 그 반대의 스와핑을 담당한다.
    • 이것은 CPU Bound와 I/O Bound의 균형을 맞추는데 큰 도움을 준다.
    • 또한 다중 프로그래밍의 정도를 줄여준다.

image

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

  1. 현재 실행 중인 프로세스의 정보를 PCB에 저장한다.
  2. OS가 다음에 실행 될 프로세스를 정하기 위해 스케쥴러를 호출한다.
  3. 실행될 프로세스의 정보를 PCB에서 가져오고, 실행한다.

3. Unix와 Linux 시스템의 Init 프로세스의 역할을 프로세스 종료의 관점에서 설명하시오.

  1. Init은 unix-base 시스템이 부팅 될 때 실행 된다. init은 daemon(백그라운드에서 실행되는 프로그램)이고 시스템이 종료될 때 까지 계속 실행 된다.
  2. Init은 모든 프로세스의 조상이다. (직접적이든 간접적이든) Init은 모든 고아 프로세스들을 입양한다.
  3. exit()을 호출 하였는데도 부모가 wait()을 호출하지 않은 프로세스들을 init()이 입양 한 후, wait()을 호출하여 프로세스의 리소스를 해제하고 반환한다.

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

  • 지명 파이프
    • 파일 시스템을 이용해서 파이프를 만드는 방법으로, 다수의 프로세스에서 사용할 때 유용하다.
    • 부모-자식 관계가 아니더라도 사용 가능하다.
    • 다른 컴퓨터에 있는 프로세스와 네트워크 통신도 가능하다.
    • 연결 된 프로세스가 여러개일 수 있다.
  • 일반 파이프
    • 일반 파이프는 프로세스가 실행 중에만 사용 가능하다. 따라서 특정 프로세스만 파이프를 이용할 때 유용하다.
    • 부모-자식 관계에만 사용 가능하다.
    • 로컬에서만 사용 가능하다.

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

  • a. 동기적 통신과 비동기적 통신
    • 동기적 통신은 작업이 완료 될 때까지 봉쇄한다. 따라서 연산이 종료 될 때까지 어플리케이션으로 제어권이 넘어가지 않는다.
    • 비동기적 통신은 비봉쇄형이고 연산을 시행만 한다. 따라서 연산이 종료 될 때까지 기다리지 않고 연산이 종료 된 시점에 변수 설정이나 콜백 함수같은걸로 연산의 종료를 알린다.
    • 프로세스가 통신을 할 때 send()와 receieve()를 사용한다. 동기적 통신을 사용해 send()의 종료를 기다림으로서 소비자-생산자 문제를 줄일 수 있다.
    • 하지만 이 기다리는 시간이 너무 길 수 있다. 이 때에는 비동기적 통신을 사용함으로서 여러개의 request를 보내고, 연산이 끝나면 나중에 결과를 받을 수 있다.
    • 하지만 결과가 도착하지 않거나, sender가 기다리지 않고 종료 해버린다면 오류를 야기할 수 있다.
  • b. 자동과 명시적 버퍼링
    • 프로세스 통신으로 인해 교환된 메시지들은 임시 큐에 저장이 된다.
    • 자동 버퍼링은 무한한 사이즈의 큐를 제공한다. 무한한 사이즈이기 때문에 이 메시지들은 큐 내부에서 무한정 대기할 수 있으므로, 봉쇄형을 사용할 필요가 없다.
    • 하지만 무한한 사이즈 때문에 메모리 낭비로 이어질 수 있다.
    • 명시적 버퍼링은 유한한 사이즈의 큐를 제공한다. 따라서 큐가 꽉 차있을 때에는 봉쇄함으로서 공간이 나기까지 기다려야 한다.
    • 하지만 메모리 낭비는 자동 버퍼링보다는 적다.
  • c. 복사에 의한 송신과 참조에 의한 송신
    • 복사에 의한 송신에서는 수신자가 복사된 데이터를 받게 된다. 따라서 데이터를 변경하게 된다면, 변화를 다른 사람이 알수 없다. 따라서 수신자는 송신자의 데이터를 변경할 수 없다.
    • 기존 데이터가 변경이 되지 않기 때문에 안전성은 높다.
    • 참조에 의한 송신은 주소값을 수신한다. 값을 변경하면 송신자와 수신자의 데이터 모두의 값이 변경이 된다.
    • 주소값을 송수신함으로서 데이터가 클 경우 효과적이다.
    • 또한 프로그래머가 여러 버젼을 만들 수 있게 한다.
  • d. 고정 크기와 가변 크기 메시지
    • 프로세스가 보내는 메시지는 고정되거나 가변적인 크기를 가질 수 있다.
    • 고정 크기는 메시지의 크기가 정해진 버퍼 크기보다 작아야 한다. 구현이 간편하다는 장점이 있다.
    • 크기가 정해져 있다는 단점이 있다.
    • 가변 크기 메시지를 사용하려면 공유 메모리 방식을 사용해야 한다.
    • 메모리의 크기만큼 메시지를 전송할 수 있다.
    • 구현이 어렵고 시스템 수준에서 최적화가 힘들다.

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?

fork() 연산으로 프로세스가 새로운 프로세스를 생성하면, 자식 프로세스와 부모 프로세스가 공유하는 것은 어떤 것인가?

a. stack
b. heap
c. Shared memory segments

  • fork()로 자식 프로세스가 생성이 되면, OS에 의해 부모와 다른 메모리 위치에 생성이 된다. 부모 프로세스는 공유 메모리 세그먼트만 공유한다.
  • stack과 heap은 새로운 프로세스에 복사본으로 생성된다.

카테고리:

업데이트: