Defunct (Zombie) 프로세스
실행을 완료했지만 프로세스 테이블에서 Parent 프로세스에 완료 상태를 전달하지 못한 프로세스를 Defunct 프로세스라고 부릅니다.
Child 프로세스는 항상 프로세스 테이블에서 제거되기 전 먼저 Defunct 상태가 되고,
Parent 프로세스는 프로세스 테이블에서 Child 프로세스 항목을 가져와 Child 프로세스의 종료 상태를 읽습니다.
Child 프로세스가 종료되면 대부분의 Parent 프로세스는 종료 코드를 얻기 위해 대기합니다.
종료 코드는 프로세스 테이블에 저장되고, 종료 코드를 읽는 행위를 "Reaping"이라고 합니다.
Child 프로세스의 종료 코드를 Parent 프로세스에서 Reaping 하지 못하면, Child 프로세스는 Defuct 프로세스가 되는 것입니다.
결론적으로 Defunct 프로세스란 Child 프로세스는 이미 종료되었지만,
Parent 프로세스가 종료의 상태를 알 수 없을 경우 Child 프로세스는 Defuct 상태가 됩니다.
Defunct 프로세스는 프로세스 테이블에서 공간만 차지합니다.
메모리나 CPU를 사용하지 않지만 프로세스 테이블은 RAM에 저장되는 유한한 리소스이고,
과도한 Defunct 프로세스를 만든다면 다른 프로세스에 영향을 줄 수 있기 때문에 항상 피해야합니다.
Defunct 프로세스 확인
다음 코드에서 Child 프로세스는 exit() 시스템 호출을 사용하여 실행을 마치고 Parent 프로세스는 50초 동안 sleep되기 때문에 wait()를 호출하지 않으며 Child 프로세스의 항목은 여전히 프로세스 테이블에 존재합니다.
50초 간 sleep으로 Parent 프로세스가 Child 프로세스의 상태를 알 수 없으므로 Child 프로세스는 Defunct 프로세스 상태로 존재하다가,
50초 후 Parent 프로세스가 종료되면 Defunct 프로세스가 되었던 Child 프로세스도 같이 종료됩니다.
Defunct 발생 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// A C program to demonstrate Zombie Process.
// Child becomes Zombie as parent is sleeping
// when child process exits.
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
// Fork returns process id
// in parent process
pid_t child_pid = fork();
// Parent process
if (child_pid > 0)
sleep(50);
// Child process
else
exit(0);
return 0;
}
|
Orphan 프로세스
Child 프로세스보다 Parent 프로세스가 먼저 죽었을 경우 Child 프로세스가 PID 1 인 Init 프로세스에 속하게 된 경우입니다.
즉, Child 프로세스가 종료되기를 Parent 프로세스가 기다리지 않고 종료된 Child 프로세스를 Orphan 프로세스라고 합니다.
Orphan 프로세스가 작업을 종료하면 Init 프로세스가 wait함수를 호출하여 Orphan 프로세스의 종료 상태를 회수함으로써 Defunct 프로세스가 되는 것을 방지합니다.
Orphan 프로세스 확인
다음 코드에서 Parent 프로세스는 Child 프로세스가 실행되고 있는 동안에 먼저 실행을 끝내고 종료되며 Child 프로세스는 Orphan 프로세스가 됩니다. Parent 프로세스가 먼저 종료되면 Child 프로세스는 Orphan 프로세스가 되고, 이 Orphan 프로세스의 Parent 프로세스는 Init 프로세스가 됩니다. PPID 값이 1로 변경되었으므로 Init 프로세스가 Child 프로세스의 Parent 프로세스가 된 것을 알 수 있습니다.
Orphan 발생 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
// A C program to demonstrate Orphan Process.
// Parent process finishes execution while the
// child process is running. The child process
// becomes orphan.
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
// Create a child process
int pid = fork();
if (pid > 0)
printf("in parent process");
// Note that pid is 0 in child process
// and negative if fork() fails
else if (pid == 0)
{
sleep(30);
printf("in child process");
}
return 0;
}
|
'Linux' 카테고리의 다른 글
부팅시 rc.local 활성화 (부팅시 스크립트 자동 실행) (0) | 2020.06.23 |
---|---|
리눅스 디바이스 드라이버 (0) | 2020.05.15 |
심볼릭 링크와 하드 링크 (0) | 2020.03.09 |
System Call과 Library Call (0) | 2020.02.21 |
Linux 환경 2TB 이상 하드디스크 파티셔닝 (0) | 2020.02.06 |