zombie process

agnusdei·2024년 11월 4일
0

Hardware & Software

목록 보기
93/136

Unix에서 fork는 부모 프로세스가 자식 프로세스를 생성하는 시스템 호출로, 두 프로세스가 거의 동일한 환경에서 실행되도록 복제됩니다. fork 이후에는 wait와 exit 호출을 통해 프로세스의 종료와 자원 회수를 관리하게 됩니다. 간단히 개념과 역할을 설명하면 다음과 같습니다.

  1. fork로 프로세스 생성

fork를 호출하면 부모 프로세스는 자식 프로세스를 새로 생성합니다. 두 프로세스는 코드와 데이터를 동일하게 복제하지만 각자 독립된 주소 공간을 가지므로 서로의 메모리에 영향을 주지 않습니다. 부모와 자식 프로세스는 fork 호출의 반환값으로 서로를 구분합니다:

•	부모 프로세스는 fork의 반환값으로 자식의 PID(Process ID)를 받습니다.
•	자식 프로세스는 0을 반환받습니다.
  1. exit: 자식 프로세스의 종료

자식 프로세스가 수행을 마치면 exit을 호출하여 종료하게 됩니다. 이때 자식 프로세스는 부모에게 종료 상태를 전달하고 메모리를 포함한 자원을 반환해야 합니다. 자식 프로세스가 종료되면 그 상태는 부모 프로세스가 확인할 때까지 좀비(zombie) 상태로 남아있게 되는데, 이 상태에서는 프로세스가 종료되었지만 자원이 완전히 해제되지 않습니다. 따라서 wait를 통해 자원 회수가 필요합니다.

  1. wait: 부모가 자식의 종료 상태를 수신

부모 프로세스는 wait를 호출하여 자식 프로세스의 종료 상태를 수신합니다. wait가 호출되면 부모 프로세스는 자식 프로세스가 종료할 때까지 대기합니다. 자식이 종료되면 wait는 종료 상태를 반환하며 좀비 상태의 자원을 해제합니다. 즉, wait는 자식이 종료될 때까지 기다렸다가 종료 상태를 받고, 이를 통해 부모가 자식의 종료 결과를 확인할 수 있습니다.

간단한 예시

아래는 fork, wait, exit의 동작을 간단하게 보여주는 예제입니다.

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

int main() {
pid_t pid = fork(); // 자식 프로세스 생성

if (pid == 0) { // 자식 프로세스
    printf("Child process (PID: %d)\n", getpid());
    exit(0); // 자식 프로세스 종료
} else if (pid > 0) { // 부모 프로세스
    int status;
    wait(&status); // 자식 프로세스의 종료 대기 및 상태 수신
    printf("Parent process received child's exit status.\n");
} else {
    perror("fork failed");
}

return 0;

}

요약

•	fork: 부모와 자식 프로세스를 복제.
•	exit: 자식 프로세스가 수행을 종료할 때 호출, 종료 상태 반환.
•	wait: 부모 프로세스가 자식 프로세스의 종료 상태를 수신하여 좀비 상태를 방지.

이 구조를 통해 Unix에서 프로세스 관리를 효율적으로 수행할 수 있게 됩니다.

0개의 댓글