2013-12-19 10 views
32

Зомби создается, когда родительский процесс не использует системный вызов wait после того, как ребенок умирает, чтобы прочитать его статус выхода, а сирота - это дочерний процесс, который восстанавливается init, когда исходный родительский процесс завершается перед ребенком.Процесс зомби против орфографического процесса

Что касается управления памятью и таблицы процессов, как эти процессы обрабатываются по-разному, в частности, в UNIX?

Каков пример или крайний случай, когда создание зомби или сирот может нанести ущерб большему приложению или системе?

+5

Создайте много зомби и наблюдайте за своей системой ssssllooooowwww – dbarnes

+4

Нет причин для использования зомби-процесса (нетривиального количества) памяти ... он мертв. Это в основном местозаполнитель, так что родитель все еще может прочитать статус выхода в какой-то момент в будущем. – FatalError

+6

Зомби не занимает значительную память или ресурсы, это (фактически) только статус выхода, ожидающий доставки. Сирота - это живой, бегущий процесс, как и любой другой - у него просто своеобразное имя. –

ответ

48

Когда ребенок выходит, какой-то процесс должен получить wait, чтобы получить код выхода. Этот код выхода хранится в таблице процессов до тех пор, пока это не произойдет. Акт чтения этого кода выхода называется «пожинать» ребенка. Между тем, когда ребенок выходит и собирается, он называется зомби. (Вся номенклатура немного ужасна, когда вы об этом думаете, я не рекомендую слишком много думать об этом.)

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

Если процесс завершается с детьми, которые все еще работают (и не убивают своих детей, метафора продолжает быть странной), эти дети являются сиротами. Дети-сироты сразу же «принимаются» по init (на самом деле, я думаю, что большинство людей называют это «перевоспитанием», но «усыновление», по-видимому, лучше переносит метафору). Сирота - это всего лишь процесс. Он будет использовать любые ресурсы, которые он использует. Разумно сказать, что это не «сирота» вообще, поскольку у него есть родитель, но я слышал, что их часто называли так.

init автоматически пожинает своих детей (принято или иным образом). Поэтому, если вы выйдете, не очистив своих детей, тогда они не станут зомби (по крайней мере, не более чем на мгновение).

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

Итак, если вы видите зомби дольше, чем один момент, значит, что-то не так с родительским процессом, и что-то нужно сделать для улучшения этой программы.

1
  1. Там нет сирот, но процесс с использованием PID 1.

    От запущенного процесса точки зрения это не имеет никакого значения, была ли она запущена непосредственно и, следовательно, имеет PID 1, как родитель или получил в наследство от PID 1, потому что его исходный родитель (отличающийся от PID 1) закончился. Он обрабатывается, как и любой другой процесс.

  2. Каждый процесс проходит через какое-то состояние зомби, когда заканчивается, а именно фаза между объявлением ее конца путем выдачи SIGCHLD и подтверждения ее обработки (доставки или незнания).

Когда было введено состояние зомби, процесс - это всего лишь запись в списке процессов системы.

Единственный значительный ресурс, который использует исключительно зомби, является допустимым PID.

8

Когда процесс завершается, его ресурсы освобождаются операционной системой . Однако его запись в таблице процессов должна оставаться там до тех пор, пока родительский звонок не вызовет wait(), потому что в таблице процессов содержится статус выхода процесса. Процесс, который завершился, но чей родитель еще не назвал wait(), составляет , известный как процесс зомби . Все процессы переходят в это состояние, когда они заканчиваются, но обычно они существуют как зомби только ненадолго. Как только родительский вызывает wait(), идентификатор процесса процесса зомби и его запись в рабочей таблице освобождаются.

Теперь рассмотрим, что произойдет, если один из родителей не вызывать ожидание() и вместо прекращается, тем самым оставляя его дочерние процессы, как сирот. Linux и UNIX обращается к этому сценарию, назначая процесс init как новый родительский процесс для сирот. Процесс инициализации периодически вызывает wait(), тем самым позволяя статусу выхода любого потерянного процесса быть собранным и освобождающим идентификатор процесса сирота и запись в таблице процессов.

Источник: Операционная система Концепции по Авраамом, Питер, Грег

+2

Очень понравился этот короткий и четкий ответ. – Azim

+0

Итак, на самом деле нет сирот, поскольку они принимаются. – alk

4

процесс сирота это компьютер процесс, parent process закончил или прекращено, хотя он (дочерний процесс) продолжает работать на себя.
A Процесс зомби или несуществующий процесс - это процесс, который завершил выполнение, но все еще имеет запись в таблице процессов, поскольку его родительский процесс не вызывал системный вызов wait().