http://www.kocw.net/home/cview.do?lid=d1784f0ecb42285a
http://www.kocw.net/home/cview.do?lid=21cfd4db05e27901
부모 프로세스(Parent process)가 자식 프로세스(children process) 생성
프로세스가 생성되면 그 프로세스만의 독자적인 주소 공간(code-data-stack)이 생성된다.
fork() vs exec()
fork() : 복제 및 생성
exec() : 완전히 새로운 프로그램으로 덮어씌우는 것
컴퓨터 세계에서는 자식 프로세스가 부모 프로세스보다 먼저 종료된다
fork()
: create a child(copy)exec()
: overlay new imagewait()
: sleep until child is doneexit()
: frees all the resources, notify parent자식 프로세스 생성하는 커널 함수 호출
A process is created by the fork() system call
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
print("\n Hello, I am parent\n");
}
부모 프로세스와 자식 프로세스는 원본과 복제본이기 때문에 구분할 필요가 있다.
둘 다 똑같은 부분에서부터 실행됨!
fork() 시스템 콜을 호출한 그 결과값, return value가
부모 프로세스인 경우 양수를 리턴
자식 프로세스인 경우 0을 리턴
- parent process : pid > 0
child process : pid = 0
보통은 자식 프로세스에게 다른 일을 시키기 때문에 pid로 구분할 필요가 있다.
부모와 자식 프로세스가 다른 프로그램을 돌리기 위해서는, 즉 새로운 프로그램을 덮어 씌우기 위해서는 exec() 시스템 콜을 이용한다.
A process can execute a differnt program by the exec() system call
int main()
{
printf("\n Hello"); // printf - 1
execlp("/bin/date", "/bin/date". (char *) 0); // execlp
printf("\n Hello"); // printf - 2
}
A process can execute a different program by the exec() system call
fork() 후 exec()
int main()
{ int pid;
pid = fork();
if (pid == 0) // this is child
printf("\n Hello, I am child\n");
execlp("/bin/date", "/bin/date". (char *) 0); // execlp
else if (pid > 0) // this is parent
print("\n Hello, I am parent\n");
}
- 부모 프로세스가 fork() 함수를 호출하여 운영체제에 자식 프로세스를 요청하면 자식 프로세스가 생성된다. 모든 시스템 안에 있는 프로세스는 부모 프로세스가 존재한다. 또한 fork()는 자기 자신의 복제 생성이다.
- 자식 프로세스는 부모 프로세스의 문맥을 그대로 따르기 때문에 fork()가 실행된 직후부터 수행되며, 이 때 fork()의 return value는 부모 프로세스는 pid = 0, 자식의 프로세스는 pid > 0
pid에 따라 다른 작업을 수행할 수 있도록 한다- 또한 exec() 는 하나의 프로세스를 완전히 다른 프로세스로 덮어씌우는 함수 (C에서는 execlp() ... exec() 호출)
exec() 안에 수행할 프로그램과 전달할 인자를 argument 로 넣고..
자식이 종료될 때까지 부모 프로세스는 block 상태
프로세스A가 wait() 시스템 콜을 호출하면
wait() 시스템 콜을 호출하는 이유?
wait()를 하지 않으면 부모와 자식 프로세스는 경쟁 상태에 놓이게 됨
프로세스를 종료시키는 시스템 콜
자식 프로세스는 모든 자원을 반납하고 부모 프로세스에게 종료됨을 알림
명시적으로 작성하지 않아도 컴파일러가 마지막에 exit()를 넣어줌
프로그램 상에서 명시적으로 작성할 수도 있음
프로세스는 독립적이고 서로 간섭하지 않지만 경우에 따라서는 서로 협력이 필요할 때가 있다.
message passing
: 커널을 통해 메시지 전달shared memory
: 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memorythread
: shared memory와는 다르다. shared memory는 다른 프로세스 간의 문제지만 쓰레드는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵다. 다만 동일한 process를 구성하는 thread 간에는 주소 공간을 공유하므로 협력이 가능 (쓰레드끼리.. 결국 메모리 공간이 하나니까..)누가 받을지 명시하든지 메시지를 메일 박스를 통해 전달할 수 있다.
두 방법 다 직접 전달은 아님
Direct : 양자 간 누구에게 보낼지 명시
Indirect : 누구에게 보낼지 명시하지 않고 mailbox를 통해 메시지 전달