[OS] 리눅스 프로세스 관리
커널의 프로세스 생성 및 삭제 기능에 대해 설명한다. 실제 동작을 제대로 이해하려면 가상 기억장치의 이해가 필요한데, 이 부분은 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() 함수
전혀 다른 프로그램을 생성할 때 사용한다. 커널이 각각의 프로세스를 실행하기까지의 흐름.
- 실행 파일을 읽은 다음 프로세스의 메모리 맵에 필요한 정보를 읽음
- 코드영역: 파일상 오프셋, 사이즈, 메모리 맵 시작 주소, 코드
- 데이터 영역 : 파일상 오프셋, 사이즈, 메모리 맵 시작 주소, 변수
- 엔트리 포인트(최초로 실행할 명령의 메모리 주소)
- 현재 프로세스의 메모리를 새로운 프로세스의 데이터로 덮어씀
- 새로운 프로세스의 첫 명령부터 실행
fork and exec
- 부모 프로세스에서 fork()로 프로세스를 복제하여 만든다.
- 자식 프로세스에서 execve() 실행하여 새로운 데이터로 덮어씀