Как Linux справляется с процессом зомби

12

Зомби-процессы создаются в системах Unix / Linux. Мы можем удалить их с помощью killкоманды.

Но есть ли в Linux встроенный механизм очистки для обработки процессов зомби?

Atur
источник

Ответы:

18

Зомби-процессы уже мертвы. Вы не можете убить их. Команда killили системный вызов не влияют на процесс зомби. (Вы можете заставить зомби уйти kill, но вы должны застрелить родителя, а не зомби, как мы увидим через минуту.)

Процесс зомби на самом деле не процесс, а всего лишь запись в таблице процессов. Других ресурсов, связанных с процессом зомби, нет: у него нет памяти или запущенного кода, он не держит открытых файлов и т. Д.

Когда процесс умирает, последним, что нужно сделать после очистки всех других ресурсов, является запись в таблице процессов. Эта запись сохраняется, образуя зомби, чтобы позволить родительскому процессу отслеживать состояние выхода дочернего элемента. Родитель читает статус выхода, вызывая одно из waitсемейства системных вызовов; в этот момент зомби исчезает. waitГоворят, что призвание пожинает ребенка, расширяя метафору о том, что зомби мертв, но каким-то образом все еще не полностью переработан в загробную жизнь. Родитель также может указать, что ему все равно (игнорируя сигнал SIGCHLD или вызывая sigactionс SA_NOCLDWAITфлагом), и в этом случае запись в таблице процессов удаляется сразу после смерти ребенка.

Таким образом, зомби существует только тогда, когда процесс умер, а его родитель еще не вызвал wait. Это состояние может длиться только до тех пор, пока родитель еще работает. Если родитель умирает раньше ребенка или умирает без чтения статуса ребенка, родительский процесс зомби устанавливается на процесс с PID 1, то есть init. Одна из задач initсостоит в том, чтобы вызывать waitцикл и таким образом пожинать любой процесс зомби, оставленный его родителем.

Жиль "ТАК - перестань быть злым"
источник
6

Вы не killзомби-процесс, так как он уже мертв.

Процессы зомби должны waitредактироваться их родителями, чтобы можно было получить их статус выхода.

Единственный «встроенный механизм очистки», существующий в Linux, работает в том случае, если любой родительский процесс умирает до того, как он соберет свой дочерний статус выхода. В этом случае каждый дочерний объект наследуется initпроцессом, который waitна дочернем элементе собирает свой статус выхода и удаляет свою запись в таблице процессов.

chrk
источник
3

Как только родитель процесса умирает, процесс становится сиротой - независимо от того, зомби это или нет. Что происходит с сиротами? Они получают новый родитель, называется init. initбудет waitна каждой сироте, которую он собрал, таким образом пожиная сироту (которая, возможно, также была зомби).

Филипп Мерри
источник
1
Нет . Будучи точным, initне убивает любой процесс. Только waitего дети собирают свой статус.
ч. В
1
@chrk, Филипп: обычный термин пожинает .
Жиль "ТАК - перестать быть злым"
1

Нет, встроенного механизма очистки для зомби нет. Зомби попадают в рай зомби, как только их родитель убит. До тех пор ОС сохраняет их, чтобы они возвращали родительский статус выхода.

unxnut
источник
так .. разве это не имеет негативного влияния на память и т.д.?
1
фактически, когда родитель зомби умирает, initпроцесс вступает во владение и назовет waitего
Нет, все ресурсы, выделенные процессу, освобождаются, за исключением записи в таблице процесса.
unxnut