-
프로세스 생성OS 운영체제/Linux 2020. 3. 23. 15:37
이제 프로세스는 프로그램이 Load 과정을 통해 OS에게 프로세스 자신만의 메모리 자원을 할당 (4GB) 받아 해당 해당 자원에 프로그램이 가지고 있는 내용 (코드, 데이터)을 각 자원의 영역 즉 세그먼트에 알맞게 적재한 상태라는 것을 알 수 있다. 또한 해당 프로세스의 구조는 Text, Data, Heep, Stack 과 같은 세그먼트로 나뉘어 진것을 알 수 있다.
이번 포스트에서는 위에서 설명한 프로세스를 생성하는 방법에 대해서 다룰 것이다.
+ 개념 : pid_t 구조체
- 프로세스 고유의 ID 값을 담기위한 전용 구조체이다.
- pid_t pid ; 와 같이 선언할 경우 stack 메모리에 pid 라는 주소를 가진 메모리의 값을 프로세스 ID 값으로 해석
프로세스 생성
프로세스를 생성하는 방법은 커널에게 프로세스를 생성해줘 라고 말하는 시스템 콜을 사용하면 된다. 이때 시스템 콜에 해당하는 함수가 fork (), vfork() 함수이다. 이번 포스트에서는 다룰 함수는 fork 함수에 대해서 다룰 것이다.
위의 자료는 원본 프로세스 즉 사용자가 가장 처음 실행한 프로그램의 내용이 커널로 부터 할당 받은 각 가상 메모리 세그먼트에 적재되어 있는 것을 나타낸다. 이때 pid 식별자가 가리키는 메모리에 fork 함수의 반환 값을 넣기로 하고 fork 함수를 Call 하였다.
위와 같이 fork 함수를 Call 할 경우 커널은 현재 fork 함수를 Call 한 프로그램의 내용을 똑같이 복사하여 새로운 자원을 할당한다. 따라서 원본 프로세스와 똑같은 기능을 하는 프로세스가 하나 더 생성되는 것이다.
이때 원본 프로세스는 부모 프로세스라 부르며 복사본 프로세스를 자식 프로세스라 부른다. 또한 원본 프로세스에서 fork 함수의 반환 값은 자식 프로세스의 ID 값이다. 반대로 자식 프로세스에서 fork 함수를 Call 하면 반환 값은 0이 반환 된다. 따라서 fork 함수의 반환 값에 따라서 현재 fork 함수의 Caller가 자식 프로세스 (return 0) 인지 아니면 부모 프로세스 (return 자식 프로세스 ID) 인지 구별할 수 있다.
fork 함수의 반환 값으로 부모 프로세스와 자식 프로세스 나누어 작업 하기
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { pid_t pid; int x; x = 0; pid = fork(); if(pid > 0) { // 부모 코드 x = 1; printf("부모 PID : %ld, x : %d , pid : %d\n",(long)getpid(), x, pid); } else if(pid == 0){ // 자식 코드 x = 2; printf("자식 PID : %ld, x : %d\n",(long)getpid(), x); } else { // fork 실패 printf("fork Fail! \n"); return -1; } return 0; }
위와 같이 fork 함수의 반환 값을 pid 라는 변수에 담고 해당 변수에 담긴 값(fork 의 반환 값) 을 비교하면서 현재 fork 함수의 Caller 가 자식 프로세스 or 부모 프로세스 인지 비교할 수 있으며 비교한 뒤 각 조건문에 따라 자식 or 부모 프로세스 각각에게 수행시키고자 하는 동작을 지시할 수 있다.
fork 함수의 원형은 다음과 같다.
#include <sys/types.h> #include <unistd.h> pid_t fork(void);
매계 변수로는 아무것도 받지 않으며, 반환 하는 것의 자료형은 pid_t (프로세스 ID를 담는 구조체)이다.