출처 : KOCW 운영체제-반효경
Parent process 가 children process를 만든다. 이로 인해 프로세스는 트리의 계층 구조를 가지게 된다. 자식 프로세스가 생성될때 부모 프로세스를 복제 생성한다. 자식은 부모의 공간을 주소 공간(binary & OS data)을 복사하고 그 공간에 새로운 프로그램을 올린다. 유닉스에서는 fork () 와 exec () 과 같은 시스템 콜을 통해 프로세스가 생성된다. fork () 를 통해 부모 공간을 복사하고, exec () 을 통해 새로운 프로그램을 올린다. 두 실행은 독립적이기 때문에 fork () 만 실행되어 복제만 할 수도 있고 exec () 을 통해 새로운 프로그램을 메모리에 올리는 것만 할 수도 있다.
Fork() 를 실행하면 프로세스르 복제하게 되면 cpu context인 program counter 또한 복제하기때문에 자식 프로세스는 fork() 이후의 코드가 실행된다. 하지만 여기서 문제가 될 수 있는 부분이 복제를 하게되면 자식과 부모가 완전히 동일시 될 수 있다는 것이다. 이는 fork 의 return value 인 pid(process id)를 부모에게는 양수, 자식에게는 0을 주어 해결하였다.
Exec() 를 실행하면 새로운 프로그램이 메모리에 올라간다. 그리고 새로운 프로그램의 처음부터 실행된다.
프로세스가 종료될때 운영체제에게 이를 알려준다.(exit) 그리고 그 프로세스의 자식이 부모에게 output data 를 보낸다.(via wait) 그 후 프로세스의 각종 자원들을 운영체제에게 반납한다. exit () 이라는 명령어 형태로 실행할 수도 있고 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어주는 경우도 있다.exit의 경우 프로세스가 자발적으로 종료되는 경우에 반해 abort는 프로세스가 강제적으로 종료되는 경우이다. 그 예로는 자식이 할당 자원 한계치를 넘어서는 경우, 자식에게 할당된 태스크가 더 이상 필요하지 않은 경우, 부모가 exit하는 경우 abort 를 통해 자식 프로세스가 종료되게 된다. 또는 키보드로 kill, break등을 친 경우 프로세스가 강제 종료되게 된다.
wait() 시스템 콜을 호출하면 커널은 child가 종료될 때까지 프로세스 A를 sleep시킨다.(block) child process가 종료되면 커널은 프로세스 A를 깨운다.(ready)
Process는 자원을 필요로 하게되고 이 자원은 운영체제로 부터 받는다. 이 자원을 부모와 자식이 공유하는 경우도 있고, 공유하지 않는 경우도 있다. 공유하지 않고 서로 자원을 많이 차지하려고 경쟁하는 관계가 일반적(원칙)이다. 공유하는 경우, Copy-on-write(COW) 하게된다.
Process가 실행될때 부모와 자식이 공존하며 수행되는 모델이 있고, 자식이 종료될 때까지 부모가 기다리는 모델이 있다.
원칙적으로 프로세스는 독립적이다. 프로세스는 각자의 주소공간을 가지기 때문에 하나의 프로세스는 다른 프로세스 수행에 영향을 미치지 못한다. 하지만, IPC(InterProcess Communication)를 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다. 이는 커널을 통해 수행된다.
프로세스간 협력 메커니즘(IPC)에는 메세지를 전달하는 방식과 주소 공간을 공유하는 방법이 있다.
메세지를 전달하는 방식은 message passing 이라고 하며 direct communication과 indirect communication 방식이 있다. Direct communication은 메시지를 주고 받을때 프로세스의 이름을 명시적으로 표시하는 방식이고 indirect communication은 이름을 명시적으로 표시하지 않고 mailbox(kernel에 존재)를 통해 메시지를 간접 전달하는 방식이다.
Shared memory 방식은 서로 다른 프로세스 간에도 일부 주소 공간을 공유하는 것이다. Shared memory 를 하기위해선 kernel의 도움이 필요하다. 일단 메모리를 공유하게 되면 그 후에는 kernel의 도움이 필요 없다. 그렇기 때문에 shared memory를 사용하는 두 프로세스는 상당히 신뢰할 수 있는 관계여야 한다.
thread의 경우 프로세스안에 cpu 수행단위가 여러개 있는 것이기 때문에 프로세스간의 협력이라고 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소공간을 공유하므로 협력이 가능하다.