프로세스를 새로 생성하는 방법뿐만아니라 실행중인 프로세스로부터 새로운 프로세스를 복사하는 방법도 있다.
fork() 시스템 콜이란?
fork() 시스템 호출의 동작 과정
fork() 시스템 호출의 예⭐
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
/* 자식 프로세스 포크 */
pid = fork();
if (pid < 0) { /* pid가 0보다 작으면 포크 실패 */
fprintf(stderr, "Fork Failed");
return 1;
}
else if (pid == 0) { /* pid가 0이면 자식 프로세스 */
execlp("/bin/ls", "ls", NULL);
}
else { /* 부모 프로세스(양수) */
/* 자식이 끝날 때(Termination)까지 부모는 대기함 */
wait(NULL);
printf("Child Complete");
}
return 0;
}
fork() 시스템 호출의 장점
프로세스의 생성 속도가 빠르다.
추가 작업 없이 자원을 상속할 수 있다.
효율적으로 시스템 관리를 할 수 있다.
exec() 시스템 콜이란?
exec() 시스템 콜의 장점
exec() 시스템 호출의 예
부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 끝날 때까지 기다려야한다.
하지만 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스들을 좀비 프로세스 또는 고아 프로세스라고 한다
그림 3.30에 표시된 프로그램을 사용하여 LINE A에서 출력되는 내용을 설명하라.
『 Operating System Concept 10th 연습문제 3.1번 』
답 :[ PARENT: value = 5 ]
새로운 프로세스는 fork()로 생성되는데, 이때 새로운 프로세스는 원래 프로세스(부모)의 복사본이다.
원래 프로세스(부모)에서의 변경은 새로운 프로세스에 영향을 미치지 않기 때문에 A라인은 부모 프로세스의 공간이므로 자식 프로세스의 value+=15가 공유되지 않는다.
따라서 A행의 출력은"PARENT: value = 5"가 된다.
이는 부모 프로세스에서만 value 값이 5로 변경되고, 자식 프로세스에서는 변경이 없음을 의미한다.
최초의 부모 프로세스를 포함하여 그림 3.31 에 표시된 프로그램에 의해 몇 개의 프로세스가 생성되는가?
『 Operating System Concept 10th 연습문제 3.2번 』
답 :[ 8개의 프로세스 ]
fork()가 호출되면 프로세스 복제되어 새로운 자식 프로세스가 생성된다.
초기 부모프로세스 1개
첫 번째 fork()를 호출하면, 현재 실행 중인 프로세스가 복제되어 총 프로세스 2개
두 번째 fork()를 호출하면, 현재 실행 중인 모든 프로세스(2개)가 복제되어 총 프로세스 4개
세 번째 fork()를 호출하면, 현재 실행 중인 모든 프로세스(4개)가 복제되어 총 프로세스 8개
이를 통해 fork()는 자식 프로세스들을 생성하고 또 다시 fork를 하면 전에 생성된 자식프로세스들도 자식을 낳는 것을 확인할 수 있다. 즉 2의 3승(2^2^2) 이 되는 것이다
프로세스가 fork() 연산을 사용하여 새로운 프로세스를 생성할 때 다음 중 어떤 상태가 부모 프로세스와 자식 프로세스 간에 공유되는가?
『 Operating System Concept 10th 연습문제 3.5번 』
- A. 스택
- B. 힙
- C. 공유 메모리 세그먼트
답 :[ C ]
fork()가 호출되면 프로세스는 부모 프로세스의 메모리를 복사하기 때문에 각 프로세스마다 갖는 stack, heap, data, code 영역은 공유되지 않고, 공유 메모리 세그먼트만 공유가 된다.