@ 앞에서 본 것을 좀 더 구체적으로 코드로 확인하겠습니다.
// pid -> Child Process ID
> Child Process ID는 0이 될 수 없습니다.
> 기존 Parent Process가 0
// pid 가 0인 부분은 Child Process가 수행되는 곳입니다.
> Parent Process가 fork를 하게 되면 수행이 중단되고, Context가 복사됩니다.
.. 그 후 Child Process에 PCB가 생성되고, PCB가 ready queue에 들어갑니다.
.. 이 때 중요한 점은 System call이 호출되면 Interrupt가 발생하고,
.. return address가 Stack으로 들어가게 됩니다.
.. 그 return address가 바로 fork 다음으로 기억됩니다.
> 그래서 Child Process가 수행될 때는 fork 다음 부터 수행됩니다.
> return value가 0이 됩니다. (parent의 경우는 child의 pid, child의 경우는 0을 넣습니다)
> 그렇게 child를 exec()을 하게 됩니다.
> 끝나면 다시 Parent로 넘어가게 됩니다.
// pid가 0보다 큰 경우는
> 그렇기에 Parent라는 의미가 됩니다.
> wait()이 수행됩니다.
? Question 기억해야 할 중요한 점은 pid value가 fork()함수를 통해 Child로 갈 때는
// 0이 넘어간다는 것입니다.
> 이것을 사용하는 것은 Technical한 요소입니다.
.. 그리고 이를 이해하기 위해서는 코드를 이해할 수 있어야 합니다.
@ OS가 Process 0를 만들고
// Child는 여러개를 만들 수 있게 됩니다.
// 이 때 상충되는 개념이 Wait이 될 수 있는데
> 더 많은 일을 하고 Wait을 할 수 있게됩니다.
.. Parent가 Child의 종료상태에 관심이 있는 경우에만 Wait을 하게 됩니다.
.. 실제로 Wait이 필요없는 경우가 있습니다.
@ 이는 조금 비효율적입니다.
// Windows에서는 모두 Create하지만 왜 UNIX는 이렇게 Fork and exec을 하는 것일까요?
> Process간에 파일을 주고 받을 때, 쉽게 그 주소를 알 수 있는 방법은
.. fork()였습니다.
.. 이 방법을 사용하면 Parent와 Child가 모두 그 원본이 같아
.. 원파일에 서로 영향을 미치는 것이 가능했습니다.
@ Process Termination
// exit()
// 자신이 잘못했을 때, Parent가 kill하는 것입니다
> abort (실패하다)