int main() {
int pid;
pid = fork();
if (pid == 0) /* this is child */
printf("\n Hello, I am child!\n");
else if(pid > 0) /* this is parent */
printf("\n Hello, I am parent!\n");
fork() 시스템 호출에 의해 프로세스가 생성된다.
새 주소 공간에 호출자의 복제본을 생성한다.
exec() 시스템 콜
int main() {
int pid;
pid = fork();
if(pid == 0) { /* this is child */
printf("\n Hello, I am child! Now I'll run date \n");
execlp("/bin/date", "bin/date", (char *) 0);
} else if(pid > 0) { /* this is parent */
printf("\n Hello, I am parent!\n");
}
프로세스는 exec() 시스템 호출에 의해 다른 프로그램을 실행할 수 있다.
호출자의 메모리 이미지를 새 프로그램으로 교체
wait() 시스템 콜
프로세스 A가 wait() 시스템 콜을 호출하면
커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다. (block 상태)
Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
exit() 시스템 콜
프로세스의 종료
자발적 종료
마지막 statement 수행 후 exit() 호출을 통해
프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어 줌
비자발적 종료
부모 프로세스가 자식 프로세스를 종료시킴
자식 프로세스가 한계치를 넘어서는 자원 요청
자식에게 할당된 태스크가 더 이상 필요하지 않음
키보드로 kill, break 등을 친 경우
부모가 종료하는 경우
부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
프로세스와 관련한 시스템 콜
fork() : child를 생성 (copy)
exec() : 새로운 이미지로 변경
wait() : child가 종료될 때까지 대기
exit() : 모든 리소스 해제, 부모에게 알림
프로세스 간 협력
독립적 프로세스(Independent process)
프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
협력 프로세스(Cooperating process)
프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
프로세스 간 협력 메커니즘(IPC : Interprocess Communication)
메시지를 전달하는 방법
message passing : 커널을 통해 메시지 전달
주소 공간을 공유하는 방법
shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음
thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능
Message Passing
Message system
프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템