본문 바로가기
운영체제

OPERATING SYSTEM CONCEPTS 에센셜 연습문제 3장 #2

by 핫동경 2022. 4. 9.
반응형

 

오답이 있을 시 댓글 부탁드립니다.

 

[3.8] 단기, 중기, 장기 스케줄링의 차이점을 설명하시오

[단기]

다음 번에 실행될 프로세스를 선택한다,CPU를 할당할 프로세스를 선택한다.

매우 자주 호출되기 때문에 아주 빠르다

 

[중기]

메모리를 자유화 시키기 위해서 스와핑을 사용한다

다중프로그래밍 정도를 낮출 때 사용된다

메모리에서 프로세스를 제거하여 디스크에 저장하고, 다시 실행을 위해서는 디스크에서 메모리로 다시 적재된다.

 

[장기]

준비 큐로 불러들일 프로세스를 선택한다

자주 호출되지 않는다(느리게 실행될 수도 있음)

다중프로그래밍의 정도를 결정한다


[3.9] 프로세스들 사이에 문맥을 교환할 때 커널이 수행하는 작업을 수행하시오

현재 실행중인 프로세스의 문맥을 PCB(Process Control Block)에 저장한다. 문맥은 cpu의 레지스터의 값, 프로세스의 상태, program counter, 메모리 관리 정보등을 포함한다. 문맥을 PCB에 저장후 대기큐로 옮긴다. 후 교환할 프로세스의 PCB에 저장되어 있던 문맥을 복구하고 처리기에 할당된다.


[3.10] 그림 3.8 과 유사한 프로세스 트리를 구축하시오. UNIX 또는 linux 시스템에서 프로세스에 관한 정보를 얻기 위해 ps -ael 명령을 사용하시오. ps 명령어에 대한 더 많은 정보를 얻기 위해 man ps 명령을 사용하시오. window 시스템의 작업 관리자는 부모 프로세스 id를 알려주지 않는다. 그러나 technet.microsoft.com에서 얻을 수 있는 프로세스 감시 도구가 프로세스-트리 도구를 제공한다.

너무 많기 때문에 트리구조는 형성하지 않고 이러한 형식으로 pid번호와 ppid번호가 나타는것만 확인했다.


[3.11] UNIX 와 linux 시스템의 init 프로세스의 역활을 프로세스 종료의 관점에서 설명하시오

init 프로세스는 시스템이 부팅되고 가장먼저 load되는 프로세스이다. pid번호는 1번이며 load 된 후 다양한 사용자 프로세스를 생성한다. 후 다른 프로세스들을 감시하는 역활을 하는데 운영체제마다 다르지만 

UNIX 와 Linux에서는 기다리고 있는 부모가 없는 프로세스를 좀비라고 하는데 이 좀비 프로세스들을 반환한다.


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

#include<stdio.h>
#include<unistd.h>
int main(){
int i;
for(i=0;i<4;i++)
	fork();
   return 0;
}

2*2*2*2=16

16개의 프로세스가 생성된다


[3.13] 다음 프로그램에서 printf("LINE J")가 실행되는 상황을 설명하시오

#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main(){
	pid_t pid;
    pid=fork();
    if(pid<0){
    	fprintf(stderr,"Fork Failed");
        return 1;
        }
     else if(pid==0){
     	execlp("/bin/ls","ls",NULL);
        printf("LINE J"):
        }
      else{
      wait(NULL);
      printf("Child Complete");
      }
      return 0;
     }

코드에 대한 결과물이다.

execlp 시스템 콜은 정상적인 파라메터가 들어왔다면 실행 후 프로세스는 사라진다. 때문에 LINE J 는 출력되지 않는다


[3.14] 그림에 보인 프로그램에서 A, B, C, D행의 pid 값은 무엇인가?

#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
	pid_t pid,pid1;
    pid=fork();
    if(pid<0){
    	fprintf(stderr,"Fork Failed");
        return 1;
        }
    else if(pid==0){
    	pid1=getpid();
        printf("child: pid=%d\n",pid);
        printf("child: pid1=%d\n",pid1);
        }
    else{
    	pid1=getpid();
        printf("parent: pid=%d\n",pid);
        printf("parent: pid1=%d",pid1);
        }
     return 0;
  }


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

일반 파이프는 한 쌍의 프로세스가 통신할 수 있는 간단한 기법을 제공한다. 일반 파이프는 오로지 프로세스들이 서로 통신하는 동안에만 존재하기 때문에 특정 프로세스만 파이프를 이용하여 통신할 때 유용하다.

하지만 일반 파이프는 통신하는 프로세스는 부모 자식 관계이어야 가능하기 때문에 여러 프로세스가 파이프를 사용하여 통신할 수 없다. 지명 파이프는 여러 프로세스가 지명파이프를 사용하여 통신할 수 있기 때문에 여러 프로세스의 통신을 보장할 수 있다.


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

여러번의 프로시저 콜이 일어날 수 있다. 

만약 송금을 RPC기법을 사용할 때 "최대 한 번", "정확히 한 번만"의 제약을 하지 않았을 때 여러번 송금될 수 있다.


[3.17] 다음 코드에서 X와 Y행의 출력에 대해 설명하시오

#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#define SIZE 5
int nums[SIZE]={0,1,2,3,4};
int main(){
	int i;
    pid_t pid;
    pid=fork();
    if(pid==0){
    	for(i=0;i<SIZE;i++){
        	nums[i]*=-i;
            printf("CHILD: %d\n",nums[i]); //LINE X
            	}
            }
    else if(pid>0){
    	wait(NULL);
        for(i=0;i<SIZE;i++)
        	printf("PARENT :%d\n",nums[i]); //LINE Y
            }
     return 0;
 }

자식 프로세스는 부모 프로세스를 복사해 갔으며 부모 프로세스와 자식프로세스의 자원은 공유되지 않고 다르다.


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

[동기적 통신과 비동기적 통신]

동기적 통신은 송신자는 메시지가 수신될 때까지 실행이 막히고 수신자는 수신할 메시지가 생길 때까지 실행이 막힌다. 구현이 간단하지만 실행이 막히게 되면 다른 작업을 수행할 수 없다.

비동기적 통신은 송신자나 수신자는 메시지를 보내거나 수신하고 다른 작업을 계속할 수 있는 장점이 있다.

하지만 약간의 오버헤드가 있을 수 있다.

 

[자동과 명시적 버퍼링]

자동 버퍼링은 운영체제가 알아서 버퍼링을 해주기 때문에 매우 효율적이고 구현이 쉽다. 하지만 경우에 따라 프로그래머가 명시한 버퍼링보다 효율이 안좋을 수도 있다.

명시적 버퍼링은 프로그래머가 명시적으로 버퍼링을 구현해야 한다는 점이 어렵지만 정말 효율적이고 잘 짠다면 자동버퍼링보다 더 효율적일 수 있다.

 

[복사에 의한 송신과 참조에 의한 송신]

복사에 의한 송신은 데이터의 안정성을 보장하지만 복사하는데 오버헤드가 생길 수 있다.

참조에 의한 송신은 오버헤드는 없지만 데이터의 값이 바뀔 수 있다.

 

[고정-크기와 가변-크기 메시지]

고정 크기 메시지는 구현이 쉽지만 고정크기가 넘어가는 메시지는 보낼 수 없는 단점이 있다.

또한 고정크기보다 작은 메시지만 있다면 공간의 낭비가 된다.가변 크기 메시지는 공간을 효율적으로 사용하고 모든 크기의 메시지를 보낼 수 있는 장점이 있지만 시스템이 연산을 최적화할 수 없다.


2022.04.09 - [운영체제] - OPERATING SYSTEM CONCEPTS 에센셜 연습문제 3장 #1

 

OPERATING SYSTEM CONCEPTS 에센셜 연습문제 3장 #1

오답이 있을 시 댓글 부탁드립니다. [3.1] 그림에 보인 프로그램을 실행했을 때, A 행의 출력은 무엇인가? #include #inlcude #include int value=5; int main(){ pid_t pid; pid=fork(); if(pid==0) { /*child pr..

dongkyung.tistory.com

 

 

반응형

댓글