하다보니

Process Management 2 본문

CS 지식/운영체제

Process Management 2

claire 2022. 2. 9. 23:00

부모 프로세스의 문맥을 모두 복사해서 자식 프로세스를 만든다. code data stack, cpu 문맥, program counter 모두 복사한다. 

프로세스가 만들어지고 난 후에는 독립적인 프로세스이기 때문에 부모와 경쟁한다. 

자식이 부모의 주소 공간을 공유한다. 

copy-on-write(COW) 기법. write가 발생했을 때 그때 copy 하겠다는 말이다. write라는 것은 내용이 바뀌는 것을 말한다. 그전에는 부모의 자원을 공유하고 있다가 자식 프로세스에 write가 발생해서 변화가 생기면 copy 하게 된다. 

운영체제에 부모 프로세스가 자식 프로세스의 생성을 요청한다. 

부모와 자식이 공존하며 수행되는 모델과 자식이 종료될 때까지 부모가 기다리는 모델이 있다. 

 

fork() 시스템 콜. 

int main(){
	printf("only parent"); //자식 프로세스는 fork 다음부터 실행하므로 여긴 부모만 출력한다. 
	int pid;
    pid=fork();
    if(pid==0) //this is child
    	printf("hi i'm child!");
    else if(pid>0)  //this is parent
    	printf("hello i'm parent");
}

fork 수행 후 자식 프로세스가 생성된다. fork는 cpu 문맥까지 복사를 하므로 새로 만들어진 자식 프로세스의 pc도 fork 다음 코드를 실행하게 된다. 프로그램을 처음부터 실행하는 것이 아닌 부모 프로세스의 program counter가 가리키는 부분을 실행한다. 

fork 실행시 부모 프로세스는 양수의 값을 리턴 받고 자식 프로세스는 0을 받는다. pid가 0이면 자식, 양수면 부모. 

따라서 부모와 자식이 다른 일을 할 수 있다. 

 

exec()

exec() 시스템 콜은 어떤 프로그램을 완전히 새로운 프로세스로 태어나게 해 준다. 

execlp 가 결국 exec 시스템 콜을 하게 된다.

int main(){
	int pid;
    pid=fork();
    if(pid==0){			//자식 프로세스
    	printf("hi i am child!");
        execlp("/bin/date","/bin/date",(char*)0);	//새로운 프로그램으로 덮어씌움
    }
    else if(pid>0)		//부모 프로세스
    	printf("hello, i am parent");
}

execlp는 date라는 프로그램을 새로이 시작하게 된다. exec을 하게 되면 다시 되돌아올 수 없다. 자식에게 정말 새로운 프로그램을 실행시킨다. 하지만 exec이 자식을 만들어야만 사용할 수 있는 것은 아니다. 

 

wait() 시스템 콜. 

프로세스 A가 wait() 시스템 콜을 호출하면 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다.(block 상태)

child process가 종료되면 커널은 프로세스 A를 깨운다. (ready 상태)

 

부모 프로세스 코드에 wait를 넣어주면 된다. 

 

exit() 시스템 콜 - 프로그램 종료. 

- 자발적 종료 : 마지막 statement 수행 후 exit() 시스템 콜을 통해 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌

- 비자발적 종료 : 부모 프로세스가 자식 프로세스를 강제 종료 시키는 경우가 대표적인 예이다. 키보드로 kill, break 등을 친 경우. 부모가 종료하는 경우에는 자식들이 반드시 먼저 종료되어야 한다. 

 

 

프로세스 간 협력. 

프로세스는 원칙적으로 굉장히 독립적이다. 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함. 

경우에 따라서는 협력을 해야지만 효율적으로 수행이 되는 경우도 있다. 

 

프로세스 간 협력 메커니즘(IPC: interprocess communication)

- 메시지를 전달하는 방법 : message passing - 하지만 프로세스는 굉장히 독립적이라 커널을 통해 프로세스 간에 전달. 

프로세스 사이에 공유변수를 일절 사용하지 않고 통신하는 시스템이다. 

-> direct communication(통신하려는 프로세스의 이름을 명시적으로 표시: 누구한테 보내고 받을지 표시)과 indirect communication(mail box 또는 port를 통해 메시지 간접 전달: 어디에 보내고 누가 꺼내볼지는 명시하지 않는다. )이 있다. 

 

- 주소 공간을 공유하는 방법 : shared memory( 일부 주소 공간을 공유) 

-> thread : 스레드는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 프로세스를 구성하는 스레드들 간에는 주소 공간을 공유하므로 협력이 가능하다. 

 

cpu 스케줄링

 

프로그램에 따라 차이가 있겠지만 cpu만 연속적으로 쓰는 단계와 i/o를 하는 단계가 번갈아서 실행이 된다. CPU burst와 i/o burst를 반복하며 실행이 된다. 프로그램 종료에 따라 이것이 빈번하게 반복되는 것이 있고 cpu가 진득이 실행되는 것도 있다. 사람이 interaction을 하는 작업이 cpu와 i/o가 자주 반복된다. interactive 한 job. i/o bound job(CPU를 잡고 계산하는 시간보다 i/o 에 많은 시간이 필요한 job-many short cpu bursts)이 cpu를 너무 기다리게 하지 않는 것이 cpu 스케줄링의 목적이다. 

 

cpu scheduler는 ready 상태의 프로세스 중에서 이번에 cpu를 줄 프로세스를 고른다. 이것은 운영체제 안에서 수행되는 코드를 말한다. dispatcher는 cpu 제어권을 cpu scheduler에 의해 선택된 프로세스에 넘겨주는 역할을 한다. 이 과정을 context switch(문맥 교환)이라고 한다. 

 

cpu 스케줄링이 필요한 경우.

1. running -> blocked (i/o 요청하는 시스템 콜) - io작업을 하기 위해 cpu를 자발적으로 내어줌. 

2. running -> ready (할당 시간 만료로 cpu 빼앗김)

3. blocked -> ready(i/o 완료 후 인터럽트) - io 작업이 끝나서 cpu 받을 준비 한다. 

4. terminate

 

1.4에서 스케줄링은 nonpreemitive(= 강제로 빼앗지 않고 자진 반납)

다른 것들은 preemitive(= 강제로 빼앗음)

'CS 지식 > 운영체제' 카테고리의 다른 글

CPU scheduling 2  (0) 2022.02.11
CPU scheduling  (0) 2022.02.10
Process Management 1  (0) 2022.02.09
Process 2,3  (0) 2022.02.07
Process  (0) 2022.02.06