(1) Process Creation and Termination
@ 지난 시간에는 한 프로세스에서 다른 프로세스로 넘어갈 때
// 커널이 개입합니다.
> 이 때 Dispatch가 수행되고
.. Context Switching을 합니다.
.. 이 때 Interrupt가 필요합니다.
@ Interrupt는 두가지입니다.
// H/W Interrupt
> 이를 사용하는 것은 Pre-emptive Scheduling입니다.
.. Async 합니다.
// S/W Interrupt
> 이를 사용하는 것은 non Pre-emptive Scheduling입니다
.. Sync 합니다. (voluntarily)
@ 가장 중요한 mechanism은
// Interrupt와 Interrupt Service Routine을 이용해서
> Context Switching이 일어나는 스토리입니다.
.. 이 때 Stack을 이용하게 됩니다.
@ 이번에 배울 내용은 Process Creation and Termination 입니다.
// 새로운 프로세스가 생성되면
> OS가 Fake Stack을 만들어줍니다.
.. 이 작업이 Creation입니다.
// 앞서 설명한 내용은 매우 단순한 내용입니다.
// 하지만 Linux와 같은 OS에서는 조금 더 복잡합니다.
@ Creation은 OS가 Data Structure를 Alloc하고 초기화 시키는 것이라고 생각할 수 있습니다.
// File System은 대상이 되는 Executable file이 존재하고,
> 이를 메모리 컨텍스트에 읽어드립니다.
.. 이 작업이 프로그램 Load입니다.
> PCB를 만들어 malloc합니다.
> PCB를 Ready queue에 끼워 넣습니다.
// 이는 모두 수작업이라고 생각할 수 있습니다.
@ UNIX는 0번 Process만 위와 같이 생성하고
// 그 후 나머지 Process는 다른 방식으로 생성합니다.
> Cloning(복제)를 이용합니다.
.. fork() System Call을 이용합니다.
// 여기에서 Parent Process와 Child Process가 나뉘게 됩니다.
> fork를 하게 되면, Parent Process를 중단하고
> 모든 Context를 snapshot하게 됩니다.
.. Process ID를 제외한 모든 값은 같아집니다. (Child)
> 이를 Ready Queue로 보냅니다.
// 이 방법은 1970년대에 제안되었고 아직도, 사용되고 있습니다.
@ 위의 방법은 좋은 것일까요?
// 아니라면 어떤 문제가 있는 것일까요?
> 매번 Copy를 만드는 것은 비효율적입니다.
.. Functionaly correctness한가?
.. non Functionaly correctness(빠른가? override가 없는가?)
@ Functionaly correctness한가를 확인해보겠습니다.
// 맨 처음 Process를 제외하고 다른 Process를 실행할 수 없게됩니다.
> 그렇기 때문에 exec() System call를 사용하게 됩니다.
.. 가지고 있는 code등에 Override합니다.
.. 비로소 다른 프로그램이 됩니다.
.. 굉장히 비효율적입니다.
@ 도표를 보면서 살펴보겠습니다.
// Wait() System call의 Argument는 Child Process ID입니다.
> 의미는 Child Process가 수행을 종료할 때까지 Parent Process를 기다리게 하라는 의미입니다.
// Child는 수행이 끝나면
> exit() System Call을 호출하게 됩니다.
.. 리소스나 데이터 스트럭쳐를 OS가 가져가게 됩니다.
.. Exit이 잘 되었는지 확인하는 코드를 남깁니다. (Exit Status Data Structure) - (Zombi State)
// 마지막에 남은 코드를 Parent가 확인 후 나머지 수행을 진행합니다.
@ 위와 같은 프로세스간 관계가 생기게 됩니다.