본문 바로가기
컴퓨터공학기초 개념/시스템 프로그래밍

19. 프로세스 - 프로세스 생성(fork)

by devraphy 2021. 9. 15.

0. 시작하기전에

- 프로세스의 구조가 어떻게 되어있는지 복습해보자.

 

https://devraphy.tistory.com/159

 

13. 프로세스 구조(1)

프로세스와 컨텍스트 스위칭 스케줄러에 의해 어떤 프로세스에서 다른 프로세스로 바뀌는 과정을 컨텍스트 스위칭이라고 한다. 이 컨텍스트 스위칭을 이해하기 위해서는 프로세스의 구조에 대

devraphy.tistory.com


1. 프로세스 생성

a) 기본적인 프로세스 생성과정

- 5가지 프로세스 메모리 공간(Text, Data, BSS, Heap, Stack)이 생성된다.

- 코드 이미지가 각 프로세스 공간에 업로드되고, 실행된다. 

 

b) 프로세스 계층의 형성

- 이전 포스팅에서 다룬 내용이므로 간략하게 복습해보자. 

- 리눅스에서는 프로세스를 생성할 때, 기존의 프로세스를 복사해서 새로운 프로세스를 생성한다. 

- 기존의 프로세스를 부모 프로세스라고 하며, 새로운 프로세스를 자식 프로세스라고 한다. 

- 이와 같은 이유로, 프로세스 간의 계층이 형성된다. 


2. fork() - 프로세스를 생성하는 방법 

a) fork() 시스템 콜 

- fork() 시스템 콜을 호출한 프로세스를 복사한다. 

- 기존 프로세스에서 복사된 내용을 새로운 프로세스 공간에 그대로 붙여넣는다. 

- 이처럼 기존의 프로세스를 복사하여 새로운 프로세스를 생성하는 방식으로 관계(= 계층)가 형성된다.

- 기존의 프로세스는 부모 프로세스가 되고, 새로운 프로세스는 자식 프로세스가 된다. 

 

 

b) fork() 시스템 콜의 원형 

# 헤더파일 
<unistd.h>

# 함수 원형
pid_t fork(void);

 

- fork() 시스템 콜은 위의 코드와 같이 기본적으로 unistd 헤더파일을 필요로한다. 

- 부모 프로세스를 복사하여 자식 프로세스를 생성하는 방법이기 때문에, parameter를 따로 필요로하지 않는다. 

- fork() 시스템콜을 사용하면 데이터 타입으로 지정된 pid_t 형태의 데이터가 반환된다.

- 즉, 각 프로세스의 pid값이 반환된다. 

 

 

c) fork() 시스템콜 예제 분석 

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
	pid_t pid;
	printf("Before fork() call \n");
	pid = fork();

	if (pid == 0)
		printf("This is Child process, PID is %d\n", pid);
	else if (pid > 0)
		printf("This is Parent process, PID is %d\n", pid);
	else
		printf("fork() is failed\n");
	return 0;
}

* <sys/types.h>는 pid_t 자료형을 사용하기위해 import되는 헤더다.

* <stdio.h>는 printf를 사용하기 위해 import되는 헤더다.

 

- 우선 pid = fork()가 실행되기 전과 후에 따라서 구동되는 프로세스의 개수가 달라진다. 

 

- fork() 함수가 실행되기 이전에는 기존의 프로세스 1개만이 실행된다.

- fork() 함수가 실행된 후에는 기존의 프로세스 1개와 새로운 프로세스 1개, 총 2개의 프로세스가 구동된다. 

- 프로세스 내부에서 fork()를 실행하면, 새로운 프로세스가 실행되어 총 2개의 프로세스가 동일한 소스코드를 실행한다.

 

- 앞서 설명하였듯이, fork()는 pid를 반환하므로 조건문을 걸어서 각 pid에 따라서 다른 코드를 수행하도록 작성할 수 있다.  

 

 

d) fork() 예제 실습

- 분명 반복문은 존재하지 않는 코드인데, pid가 두번 출력된 것을 확인할 수 있다. 

- 하나는 부모 pid, 하나는 자식 pid를 출력한다. 

- 이처럼 작동하는 이유는, pid = fork()를 실행한 시점에서 동일한 코드에 대해 작동하는 프로세스가 2개가 되기 때문이다. 

- 한번은 기존의 프로세스 코드를 실행하고, 한번은 fork()를 통해 새로 생성된 프로세스가 코드를 실행한다. 

- 그러므로 총 2개의 프로세스가 동일한 코드를 한번씩 총 2번 실행하게 되는 것이다. 

- 여기서 fork()는 pid를 반환하기 때문에, 이에 따라서 조건문에 의해 다른 출력문을 수행하게 된다. 

댓글