0. 시작하기전에
- 프로세스의 구조가 어떻게 되어있는지 복습해보자.
https://devraphy.tistory.com/159
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를 반환하기 때문에, 이에 따라서 조건문에 의해 다른 출력문을 수행하게 된다.
'컴퓨터공학기초 개념 > 시스템 프로그래밍' 카테고리의 다른 글
21. 프로세스 - wait & 쉘 만들기 (0) | 2021.09.16 |
---|---|
20. 프로세스 - 프로세스 생성(exec) (0) | 2021.09.15 |
18. 프로세스 - 시스템 콜 (0) | 2021.09.15 |
17. 프로세스 - 프로세스 ID (0) | 2021.09.15 |
16. 시스템 프로그래밍 - ABI와 표준 (0) | 2021.09.10 |
댓글