CS/SystemSoftware

SystemSoftware - Creating Processes #2

Henu 2021. 6. 6. 02:06
 

SystemSoftware - Creating Processes #1

OS에서 process를 만드는 방식에 대해서 알아보자 process는 fork()라는 syscall을 통해서 child process를 생성한다. fork를 호출한 process가 parent process가 되고, 새로 생긴 process가 child가 process이다...

hyeo-noo.tistory.com

 

 

int wait(int *child_status)

child를 reaping하기 위해서 명시적으로 child가 종료할 때까지 기다리는 syscall

 

return : child의 pid 값

 

만약 int *child_status 가 null이 아니라면 문제가 발생한 것이다.

이때 여러개의 매크로를 통해서 어떤 문제가 발생했는지 알 수 있다. 


위 코드에서 parent가 fork() 된 경우를 보자(else 부분)

wait(&child_status)를 통해서 child 가 종료될 때까지 기다리는 것을 볼 수 있다.

 

이 과정을 그래프로 나타내 보자

 

 

wait()를 통해서 parent는 child가 종료할 때까지 기다리고 CT 와 Bye를 차례로 출력하며 parent도 종료된다.

 

HC -> HP -> CT -> Bye       (O)

HP -> CT -> Bye -> HC       (X)


 

코드가 조금 복잡해 졌다.

N 만큼 for loop을 돌면서 fork()를 수행하고 있다. (N개의 child 생성)

child인 경우에는 바로 종료되는 코드이다.

 

parent인 경우에는 다시 N 만큼 for loop을 돌면서 N번의 wait()를 호출한다.

 

WIFEXITED(child_status) : 정상적인 종료이면 true를 return

WEXITSTATUS(child_status) : child가 exit할 때 가지고 있는 값(exit(100+i))

 

만약 child가 정상적으로 종료된다면 종료할 때 가지고 있는 exitstatus값을 출력하게 되므로 몇 번째 child가 종료되었는지를 출력으로 알 수 있다.

종료되는 child의 순서는 OS의 scheduling 알고리즘에 의해 결정되므로 예측하기 힘들다.


 

이번 코드는 wait() 대신 waitpid()라는 syscall을 통해서 child를 기다린다.

 

-> 특정 child의 종료를 대기할 수 있다.

-> 생성된 순서대로 reaping을 할 수 있다.


execve : child가 parent와 다른 프로그램을 수행하기 위해서 실행하는 syscall

child 의 PID는 유지한 채로 나머지 stack, data들이 모두 바뀐다.

 

호출은 되지만 return을 하지는 않는다. (호출된 함수로 다시 돌아감)