커널의 프로세스 생성 및 삭제 기능에 대해 설명한다. 실제 동작을 제대로 이해하려면 가상 기억장치의 이해가 필요한데, 이 부분은 5장에서 다루고 3장에서는 단순한 경우만 설명한다.

프로세스 생성 목적

fork() 함수

// C++ program to demonstrate creating processes using fork()  
#include <unistd.h>  
#include <stdio.h>  

int main()  
{
	// Creating first child  
	int n1 = fork();  

	// Creating second child. First child  
	// also executes this line and creates  
	// grandchild.  
	int n2 = fork();  

	if (n1 > 0 && n2 > 0) {  
		printf("parent\n");  
		printf("%d %d \n", n1, n2);  
		printf(" my id is %d \n", getpid());  
	}  
	else if (n1 == 0 && n2 > 0)  
	{  
		printf("First child\n");  
		printf("%d %d \n", n1, n2);  
		printf("my id is %d \n", getpid());  
	}  
	else if (n1 > 0 && n2 == 0)  
	{  
		printf("Second child\n");  
		printf("%d %d \n", n1, n2);  
		printf("my id is %d \n", getpid());  
	}  
	else {  
		printf("third child\n");  
		printf("%d %d \n", n1, n2);  
		printf(" my id is %d \n", getpid());  
	}  
	return 0;  
}

결과

parent  
28808 28809  
my id is 28807  

First child  
0 28810  
my id is 28808  

Second child  
28808 0  
my id is 28809  

third child  
0 0  

execve() 함수

전혀 다른 프로그램을 생성할 때 사용한다. 커널이 각각의 프로세스를 실행하기까지의 흐름.

  1. 실행 파일을 읽은 다음 프로세스의 메모리 맵에 필요한 정보를 읽음
    1. 코드영역: 파일상 오프셋, 사이즈, 메모리 맵 시작 주소, 코드
    2. 데이터 영역 : 파일상 오프셋, 사이즈, 메모리 맵 시작 주소, 변수
    3. 엔트리 포인트(최초로 실행할 명령의 메모리 주소)
  2. 현재 프로세스의 메모리를 새로운 프로세스의 데이터로 덮어씀
  3. 새로운 프로세스의 첫 명령부터 실행

fork and exec

  1. 부모 프로세스에서 fork()로 프로세스를 복제하여 만든다.
  2. 자식 프로세스에서 execve() 실행하여 새로운 데이터로 덮어씀