본문 바로가기
Operating System

Process Description and Control 3

by mangstory 2021. 4. 16.

 

Process Creation

프로세스는 크게 두 가지 방식으로 생성됨

- 직접 생성 : directed process creation

- 복제 : Cloning

 

Directed Process Creation

-> 운영체제가 Disk에 있는 프로그램을 memory에 올려서 process로 만들고 process image(PCB)를 만든다.

 

제일먼저

1. new process를 위한 메모리공간 확보

2. 새로운 메모리 공간에 Load (code,data를 메모리로 load, call stack 생성)

3. PCB 초기화 (pid 할당받고,,, 등등)

4. new process를 ready state 로 전환 (ready-list에 넣는다.)

 

일반 OS에서 첫 번째 Process는 이런식으로 만든다.

init process = first process = pid가 1인 프로세스

 

 

그렇다면 init process가 다음 프로세스 생성할 때는?

 

 

Cloning(process spawning)

-> 부모프로세스에서 복제하여 자식 프로세스 생성

-> 부모프로세스와 PCB의 상당부분 값이 비슷하기 때문

-> unix에서 fork()

1. PCB에서 text,data,stack 복사

2. 반드시 필요한 부분만 수정

3. 새로운 PCB를 ready-list에 집어넣음

fork() => 한 번 호출하면 return을 2번한다. return값 또한 다르다.(이게 가장 큰 차이)

 

부모에게는 자식의 pid, 자식에게는 0이 할당된다.

 

 

<fork example>

fork()함수가 호출되면 parent process에서 복제된 child process가 생성된다.

fork()의 return값이 pid로 할당되고,

parent의 pid(리턴값)는 양수, child의 pid(리턴값)는 0 이 된다.

 

출력창을 보면 hello는 한 번 출력되지만,

상당부분이 복제되기 때문에 변수값도 동일하게 출력된다.

 

 

COW (Copy on Write)

-> 모두 Copy하는 방법이 많은 memory를 차지하기 때문에 효율적인 memory사용을 위한 copy on write 기법이 나왔다.

-> parent, child process가 대부분을 공유하다가 수정이 필요한 부분만 copy하여 쓰는 기법.

fork() 후에는 모든 부분이 공유만 되어있다. 

이 후 어떤 operation으로 인해 수정이 필요하면 해당하는 부분만 copy하여 쓴다.

 

<COW example>

여기서는 parent, child process가 상당부분을 공유하다가

child process에서 변수값을 바꿔주었기에 해당하는 부분만 copy(메모리공간), 수정이 일어난 것이다.

그렇기에 여기서는 출력값을 보면 parent와 child가 각각 다르게 나타난다.

 


 

Separate Processes ( fork + exec )

일반적으로 process를 생성할 때는

fork() 후 exec()을 한다!

 

fork는 parent를 복제하여 child를 만들고

exec은 만든 child의 메모리 공간을 모두 새로 할당해준다. (새로운 프로그램을 하나 만드는 것이다.)

 

프로세스의 실행을 보면

부모프로세스는 자식프로세스와 병행적으로 수행이되다가

wait()이라는 함수를 만나면 자식프로세스가 종료될때까지 기다린다.

fork() 호출되면 두 갈래로 나뉜다. (부모프로세스와 자식프로세스)

부모프로세스에서 wait()이 호출되면 자식프로세스가 종료될 때까지 기다린다. (파란실선)

자식프로세스는 exec()으로 새로운 새로운 메모리 공간을 할당받고 exit()을 통해 종료될 수 있다.

종료가 되면 부모프로세스는 다시 수행된다.

 

프로세스가 종료될 때는 자발적으로 혹은 비자발적으로 종료될 수 있다.

 

Voluntary termination(자발적 종료) : exit(status)

- 자식프로세스에 의해 호출된다.(부모 프로세스에서 자발적으로 종료되면 자식이 갈 곳이 없잖아.. -> 이게 orphan이라는 용어이긴 함)

- 프로세스 자원은 OS에 의해 deallocate된다.

 

Involuntary termination(비자발적 종료) : kill(pid,signal) or  abort()

- 또 다른 프로세스(parent)나 OS에 의해 종료된다.

 

 

zombie / orphan

zombie : 프로세스가 종료됐음에도 PCB일부가 남아있는 상태

자식프로세스가 종료되었는데도 부모프로세스가 종료 상태를 회수하지 못하면 자식프로세스는 zombie가 된다.

(여기서 부모프로세스가 종료상태를 전달받아야 운영체제가 자식프로세스를 소멸시킬 수 있다.)

 

orphan : 자식프로세스가 종료되기 전에 부모프로세스가 종료되면 자식프로세스를 orphan process라고 한다.

orphan process가 발생되면 init process로 변형한다.

 

else는 오류가 발생했을 경우,

else if는 자식프로세스

if는 부모 프로세스의 수행과정이다.

 

부모프로세스에서 wait으로 자식 프로세스의 종료를 기다리고 있다.

자식프로세스는 exec을 통해 새로운 프로그램을 생성했기에 아래 코드는 수행되지 않는다.

출력창은 exec관련코드를 수행 후 (exec아래있는 코드는 수행되지 않음)부모로 돌아가서 나머지 코드를 수행하는 내용이다.

'Operating System' 카테고리의 다른 글

Process Scheduling 2  (0) 2021.05.10
Process Scheduling  (0) 2021.04.25
Process Description andControl 2  (2) 2021.04.13
Process Description and control 1  (0) 2021.04.11
User program and System Call  (2) 2021.04.11