좀비 상태가 클리어되지 않으면 문제가 없나요?

좀비 상태가 클리어되지 않으면 문제가 없나요?

나는 자바 프로세스가 좀비가 되어 한동안 거기에 머물렀던 생산 단위를 가지고 있습니다. 기기를 다시 시작하면 삭제됩니다. 그러나 장치가 다시 시작되지 않고 다른 Java 프로세스가 시작되어 실행됩니다. 이 좀비 상태가 클리어되지 않고 그대로 남아 있으면 문제가 없을까요? 어떤 식으로든 (성능이나 속도 저하) 영향을 미치나요?

답변1

좀비 프로세스는 성능이나 속도에 아무런 영향을 미치지 않습니다.좀비 프로세스는 시스템 리소스를 차지하지 않습니다.

노트:- 실제로 제한된 리소스인 PID를 계속 사용하고 프로세스의 커널 데이터 구조를 할당합니다. 일반적으로 이는 중요하지 않지만 메모리가 매우 제한된 시스템에서는 커널 메모리 사용량이 상당할 수 있습니다.

좀비 프로세스로 인한 문제

각 좀비 프로세스는 해당 프로세스 ID를 유지합니다. Linux 시스템의 프로세스 ID 수는 제한되어 있습니다.3276732비트 시스템에서는 기본적으로. 좀비 프로세스가 매우 빠른 속도로 누적되면 사용 가능한 전체 PID 풀이 결국 좀비 프로세스에 할당되어 다른 프로세스가 시작되지 못하게 됩니다.

노트: 64비트 시스템에서는 최대 PID를 늘릴 수 있습니다.https://unix.stackexchange.com/a/16884/170373

그러나 시스템의 상위 프로세스에 문제가 있음을 나타내더라도 좀비 프로세스가 몇 개 남아 있는 것은 괜찮습니다.

설명하다:

Linux에서 프로세스가 종료되면 메모리에서 즉시 제거되지 않습니다. 해당 프로세스 설명자는 메모리에 남아 있습니다.

프로세스의 상태가 변경되고 EXIT_ZOMBIE, 이 신호를 통해 프로세스의 상위 프로세스에 하위 프로세스가 종료되었음을 알립니다 SIGCHLD.

그런 다음 상위 프로세스는 wait() 시스템 호출을 실행하여 종료 상태 및 종료된 프로세스의 기타 정보를 읽어야 합니다. 이를 통해 부모 프로세스는 죽은 프로세스로부터 정보를 얻을 수 있습니다.wait()를 호출한 후 좀비 프로세스는 메모리에서 완전히 제거됩니다.

이는 일반적으로 매우 빠르게 발생하므로 시스템에 좀비 프로세스가 축적되는 것을 볼 수 없습니다. 그러나 부모 프로세스가 올바르게 프로그래밍되지 않고 wait()를 호출하지 않으면 해당 좀비 자식 프로세스는 지워질 때까지 메모리에 남아 있습니다.

해결하다:

SIGKILL 신호를 사용하여 일반 프로세스를 종료할 수 있으므로 좀비 프로세스를 종료할 수 없습니다. 좀비 프로세스는 이미 종료되었습니다.

좀비 프로세스를 종료하는 한 가지 방법은 SIGCHLD 신호를 상위 프로세스에 보내는 것입니다. 이 신호는 상위 프로세스에게 wait() 시스템 호출을 실행하고 좀비 하위 프로세스를 정리하라고 지시합니다. kill 명령을 사용하여 신호를 보내고 다음 명령의 pid를 상위 프로세스의 PID로 바꿉니다.

kill -s SIGCHLD pid

좀비 프로세스 생성이 끝나면 init는 좀비 프로세스를 상속하고 새로운 부모 프로세스가 됩니다. (init은 Linux에서 부팅 시 시작되는 첫 번째 프로세스이며 PID 1이 할당됩니다.)

노트:-Linux 3.4부터 프로세스는 PR_SET_CHILD_SUBREAPER 옵션을 사용하여 prctl() 시스템 호출을 실행하여 프로세스 #1이 아닌 고아 하위 프로세스의 부모가 되도록 할 수 있습니다. 인용하다: https://unix.stackexchange.com/a/177361/5132  

그런 다음 INIT는 wait() 시스템 호출을 수행하여 좀비 하위 프로세스를 정리하므로 init는 좀비 프로세스를 신속하게 처리할 수 있습니다. 상위 프로세스를 닫은 후 다시 시작할 수 있습니다.

답변2

대부분의 경우 좀비는 큰 문제가 되지 않습니다. 그들은 "죽은" 프로세스이며 CPU 시간이나 할당된 메모리를 차지하지 않습니다.~해야 한다죽기 전에 이 과정을 통해 방출됩니다. 그들이 실제로 차지하는 유일한 리소스는 프로세스 목록의 항목입니다. 시스템에 따라 허용되는 최대 스레드 수를 지정할 수 있으며, 좀비가 있으면 아무 이유 없이 이 제한에 더 빨리 도달할 수 있습니다.

그러나 좀비는 일반적으로 프로그래머가 잘못되거나 결함이 있는 코드로 인해 발생합니다.잊다하위 프로세스의 상태를 확인하세요. 이는 의도적인 것일 수도 있지만 일반적으로 그렇지 않습니다. 버기/버기 코드는 종종 잘못된 방식으로 메모리를 처리하기도 합니다. 특별한방법, 그리고아니요할당된 일부 리소스를 해제합니다. 이 경우 이러한 리소스는 좀비가 완전히 종료될 때까지 좀비에 할당된 상태로 유지됩니다.

편집하다: 프로세스가 Java 프로그램인 경우 Java 가비지 수집기가 모든 것을 처리하므로 메모리를 해제하지 않아도 문제가 되지 않습니다.

관련 정보