Lab11_Sbrk.pdf


<aside> ☝ 각 상황에서 Process C의 변화를 포함한 Process C의 종료과정과, 자원이 회수되는 과정을 작성

</aside>


situation 1.

Process A fork B and wait

Process B exec C

Process C call exit()


process B가 C를 exec하면 덮어쓰기가 되기 때문에 A의 자식이 C가 된다. C가 exit을 호출하면 우선 켜져있던 파일은 다 닫아주고 자신의 자원을 회수해 줄 부모를 wakeup1 함수로 깨운 후 자신의 state를 zombie로 바꾸고 스케줄러를 호출한다. 나중에 부모가 스케줄링 되면 부모(process A)는 B를 포크한 이후에 바로 wait에 들어가 sleep을 하고있었기 때문에 이 과정에서 sleep에서 해제된다. 잠에서 깬 A는 다시 wait 함수의 for문을 돌게 되고 그 과정에서 부모가 자신(A)이고 state가 zombie로 변한 process C를 발견해 자원 회수를 진행한다. 그리고 자원 회수를 완료한 C의 pid를 반환해주는 것으로 자원 회수를 완료한다.


situation 2.

Process A fork B and call exit()

Process B exec C

Process C killed by user kill()


process A는 B를 포크해주고 나서 exit을 호출하기 때문에 exit 함수 내에서 자신의 자식인 B를 orphan process로 만들 수는 없어 init process의 자식으로 만들어준다. 그래야 나중에 process B가 종료되고 자원을 회수해줄 process가 있기 때문이다. process C가 유저가 호출한 kill 함수에 의해 kill이 된다면 우선 해당 process의 killed 변수에 1을 저장해주고 process C가 나중에 스케줄링 되었다가 timer interrupt에 의해 trap 코드를 실행하게 될 때 killed 변수를 확인해서 그곳에서 exit을 호출하게 된다. 그러면 아까 전에 부모를 init process으로 상속받았기 때문에 init process가 wait 합수에서 sleep하고 있다가 일어나 process C의 자원을 회수하는 과정을 situation 1과 같이 하게 된다.


<aside> ☝ xv6가 메모리를 관리한다고 할 때, 세가지 메모리 관리 법인 Best-fit, First-fit, Worst-fit의 장단점을 비교하고 xv6에 가장 적절한 방법과 그 이유를 작성

</aside>