부모 프로세스가 자식 프로세스 생성
프로세스의 트리(계층 구조) 형성
프로세스는 자원을 필요로 함
copy-on-write(COW)라는 테크닉도 있다. (부모의 주소공간을 모두 복사하는 것이 아니라, 일단 같은 페이지들을 공유하고 있다가 부모 자식 중 어느 하나가 write 연산을 해야만 해당 페이지가 복사되게 하는 기법. 모든 페이지를 복사하는 것에 비해 메모리 낭비를 막을 수 있다.)
이미지 출처: https://www.learnsteps.com/what-is-copy-on-write-and-where-is-it-used/
자원의 공유
수행(Execution)
주소 공간(Address space)
유닉스의 예
프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (exit 시스템 콜로 종료)
부모 프로세스가 자식의 수행을 종료시킴 (abort)
caller의 복사본인 새로운 주소공간을 만든다.
자식 프로세스는 program counter도 복사하기 때문에 시스템 콜을 호출한 이후의 코드부터 실행된다. (main 함수 호출부터 시작되는 것이 아님.)
int main()
{ int pid;
pid = fork(); // 시스템 콜. pid를 return해줌
if (pid == 0) /* 자식 프로세스. 이 코드부터 실행됨 */
printf('\n Hello, I am child\n');
else if (pid > 0) /* 부모 프로세스 */
printf('\n Hello, I am parent\n');
}
caller의 메모리 image를 새로운 프로그램으로 대체
int main()
{ int pid;
pid = fork(); // 시스템 콜. pid를 return해줌
if (pid == 0) /* 자식 프로세스. 이 코드부터 실행됨 */
printf('\n Hello, I am child! Now I'll run date\n');
execlp('/bin/date', '/bin/date', (char*) 0); /* date라는 새로운 프로그램으로 자식이 자기자신을 덮어씌움 */
else if (pid > 0) /* 부모 프로세스 */
printf('\n Hello, I am parent\n');
}
아래 코드에서는 1 -> 3 순서로 출력되지만, 2는 영원히 출력되지 않는다.
int main()
printf('1;);
execlp('echo', 'echo', '3', (char*)0);
printf('2');
보통 자식 프로세스를 생성한다음 wait() 시스템 콜을 한다.
프로세스 A가 wait() 시스템 콜을 호출하면
프로세스의 종료
자발적 종료
비자발적 종료
커널
을 통해 메시지 전달. 프로세스 사이에 공유변수(shared variable)를 일체 사용하지 않음.shared memory
메커니즘이 있음.