부모 프로세스가 자식 프로세스를 생성
프로세스의 트리(계층구조) 형성
프로세스는 자원을 필요로 함
OS로부터 받는다, 부모와 공유한다.
자원의 공유
1) 부모와 자식이 모든 자원을 공유하는 모델
2) 일부를 공유하는 모델
3) 전혀 공유하지 않는 모델(일반적)
보통은 부모와 자식이 CPU를 받으려고 경쟁을 한다.
수행
1) 부모와 자식이 공존하며 수행되는 모델
2) 자식이 종료될때까지 부모가 기다리는 모델
시스템 콜을 통해 OS에게 자식을 낳아달라고 요청받고 OS가 대신 낳아주는 것이다.
자식은 부모의 공간을 복사함
자식은 그 공간에 새로운 프로그램을 올림(덮어 씌움)
fork() 시스템 콜이 새로운 자식 프로세스를 생성
= 자식 프로세스는 부모 프로세스의 주소 공간(코드, 데이터, 힙, 스택 등)을 그대로 복사한다.
리턴 값: fork()는 부모 프로세스에서는 자식 프로세스의 프로세스 ID(PID)를 반환하고, 자식 프로세스에서는 0을 반환한다.
exec() 시스템 콜이 새로운 프로그램을 메모리에 올린다.
= 현재 프로세스의 주소 공간(코드, 데이터, 힙, 스택 등)을 지정한 새로운 프로그램으로 덮어쓴다.
fork없이 exec만 하면 그 새로운 프로세스를 로드한다는 뜻이다. (새로운 프로그램으로)
프로세스가 스스로 종료를 결정하고 운영 체제에게 이를 알리는 방식
1) 프로세스가 마지막 명령을 수행한 후 OS에게 이를 알려줌(exit)
자식이 먼저 종료 된다. exit(시스템 콜)
= 자신의 종료상태를 OS에게 알린다.(시스템 콜)
2) 자식프로세스라면 부모에게 Output Data를 보냄
부모는 wait(시스템콜)을 통해 데이터를 기다리고 있다.
3) 프로세스의 각종 자원들이 OS에게 반납됨
자식이 할당 자원의 한계치를 넘어섬 or 자식에게 할당된 Task가 더 이상 필요 없음
한계치 넘거나 자식에게 더 이상 시킬일이 없다.
자기 자식을 모두 죽이고 자기도 죽는다.
OS는 부모 프로세스가 종료하는 경우 자식들을 수행하도록 두지 않는다.
이는 단계적인 종료이다.
pid = fork();
<상황: 부모프로세스가 fork()함수를 호출한 상황>
1) 자식 프로세스가 생성된다.
2) 반환값
가. 부모는 fork의 반환으로 자식의 PID값을 받는다.
나. 자식은 fork의 반환으로 0을 받는다.
새로운 프로그램으로 덮는다.
int pid;
pid = fork(); // 1)번
if(pid==0){
printf("I'm Child\n");
execlp("/bin/date", "/bin/date", (char*)0); // 2)번
}
else if (pid>0){
printf("I'm Parent");
printf("1");
execlp("echo", "echo", "3", (char*)0); // 3)번
printf("2"); // 4)번
}
}
1) 자식을 생성한다.(부모도 그대로 있음)
2) execlp는 현재 자식 프로세스를 /bin/date 프로그램으로 덮어쓴다. 현재 날짜가 출력됨.
3) execlp는 현재 부모 프로세스를 echo 프로그램으로 덮어쓴다. 3이 출력됨.
4) execlp가 성공적으로 수행되면 printf("2")는 실행되지 않는다. 이미 새로운 프로그램으로 덮어 씌워졌기 때문이다.
int childPID;
childPID = fork();
if(childPID==0){
<자식 프로세스 코드>
}
else { wait(); }
부모 프로세스는 wait() 시스템콜 날리고 sleep 한다. (blocked 상태)
자식 프로세스코드가 종료되면 부모프로세스를 다시 깨운다. (ready 상태)
마지막 문장 실행 후 exit() 시스템 콜을 호출하면 된다.
: 사실 컴파일러가 알아서 넣어준다.
가. 부모 프로세스가 자식 프로세스를 강제종료 시킴
: 자식이 한계치 넘는 자원요청
: 자식 프로세스에게 더 이상 시킬일이 없음
나. 키보드로 kill, break 등을 친 경우
다. 부모가 스스로 종료하는 경우(부모 프로세스가 종료하기 전에 자식들을 먼저 종료시킴)
프로세스는 각자의 주소공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
message passing: 커널을 통해 메시지를 전달
커널이 할당해주면 그 뒤부터는 프로세스들끼리 공유
shared memory: 서로다른 프로세스 간에도 일부 주소 공간을 공유
통신하려는 프로세스의 이름을 명시적으로 표시
mailbox(또는 port)를 통해 메시지를 간접 전달
결론: Message Passing은 커널이 계속해서 관여한다.
그러나 Shared Memory는 초기에 한번만 할당해주고 관여하지 않는다.