우리 모두는 프로세스가 어떻게 작동하는지 알고 있습니다. 프로그램을 시작하고 작업을 시작한 다음 작업이 완료되면 프로세스를 중지합니다. 프로세스가 중지되면 프로세스 테이블에서 제거됩니다.
System-Monitor
를 통해 현재 진행상황을 보실 수 있습니다.
그러나 일부 프로그램이 실행된 후에도 프로세스 테이블에 여전히 남아 있는 경우가 있습니다.
그래서 라이프사이클을 완료했지만 여전히 프로세스 테이블에 남아 있는 이러한 프로세스를 "좀비 프로세스"라고 합니다.
프로그램을 실행하면 상위 프로세스와 많은 하위 프로세스가 생성됩니다. 이러한 모든 하위 프로세스는 커널이 할당한 메모리와 CPU 리소스를 소비합니다.
이 하위 프로세스는 실행이 완료된 후 종료 신호를 보낸 다음 종료됩니다. 이 종료 신호는 상위 프로세스에서 읽어야 합니다. 상위 프로세스는 이후에 wait
명령을 호출하여 하위 프로세스의 종료 상태를 읽고 프로세스 테이블에서 하위 프로세스를 제거해야 합니다.
상위 프로세스가 하위 프로세스의 종료 신호를 올바르게 읽으면 하위 프로세스가 프로세스 테이블에서 삭제됩니다.
그러나 상위 프로세스가 하위 프로세스의 종료 신호를 읽지 못하면 하위 프로세스가 실행을 완료하고 데드 상태가 되어도 프로세스 테이블에서 삭제되지 않습니다.
안돼. 좀비 프로세스는 아무 작업도 하지 않고 리소스도 사용하지 않으며 다른 프로세스에 영향을 주지 않으므로 좀비 프로세스가 존재해도 아무런 해가 없습니다. 그러나 프로세스 테이블의 종료 상태 및 기타 프로세스 정보도 메모리에 저장되므로 좀비 프로세스가 너무 많으면 문제가 될 수 있습니다.
다음과 같이 상상할 수 있습니다.
"당신은 건설회사 사장입니다. 일꾼들에게 매일 일한 만큼 월급을 줍니다. 매일 건설현장에 와서 그냥 앉아만 있는 노동자가 있습니다. 당신은 돈을 낼 필요도 없고, 그 사람은 돈을 주지 않습니다. 아무 일도 안 하고 그냥 매일 그 일만 해요. 그냥 거기 와서 앉기만 하면 돼요!”
이 작업자는 좀비 프로세스의 살아있는 예입니다. 하지만 좀비 작업자가 많으면 건설 현장이 혼잡해 일반 작업자가 작업하기 어려울 수 있습니다.
터미널을 열고 다음 명령을 입력하세요.
ps aux | grep Z
프로세스 테이블에는 모든 좀비 프로세스의 세부정보가 나열됩니다.
일반적인 상황에서는 SIGKILL
을 사용할 수 있습니다.
프로세스를 종료하라는 신호를 보냈지만 좀비 프로세스는 이미 종료되었으며 이미 종료된 프로세스를 종료할 수 없습니다. 따라서 입력해야 하는 명령은
이어야 합니다.
kill -s SIGCHLD pid
여기의 pid를 상위 프로세스의 프로세스 ID로 바꾸면 상위 프로세스가 완료되고 죽은 하위 프로세스를 모두 삭제합니다.
다음과 같이 생각할 수 있습니다.
"길 한복판에서 시신을 발견한 경우, 고인의 가족에게 연락하면 그 가족이 시신을 도로에서 가져갈 것입니다."
그러나 많은 프로그램은 잘 작성되지 않아 이러한 어린이 좀비를 삭제할 수 없습니다(그렇지 않으면 애초에 이러한 좀비를 볼 수 없습니다). 따라서 자식 좀비가 삭제되었는지 확인하는 유일한 방법은 부모 프로세스를 종료하는 것입니다.
위 내용은 좀비 프로세스를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!