2013-05-07 3 views
3

Wikipedia в основном предоставляет всю возможную информацию о процессах зомби, которые мне НЕОБХОДИМО знать, а просто простая строка о том, как это может быть полезно ... в том, что конфликт в PID не будет существовать в том случае, если родительский процесс создает другой дочерний процесс.Почему необходим процесс зомби?

Как это тогда действительно «полезно»? Разве ПИД не был бы доступен, если бы названный зомби-процесс должен был быть удален, а не там?

Есть ли другие причины, почему должен существовать процесс зомби?

ответ

-2

Зомби-процессы полезны.

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

Процесс, который не очищает своих детей-зомби, не запрограммирован должным образом.

+2

Как отправить SIGCHLD родительскому процессу зомби удалить зомби? У вас есть ссылка на это? Кроме того, каждый процесс, который создает дочерние процессы, которые заканчиваются в определенный момент, создаст процесс зомби. Поэтому утверждение «Программа, создающая зомби-процессы, не запрограммирована должным образом». также неверно. Я думаю, вы имели в виду ** «Процесс, который не убирает его зомби, не запрограммирован должным образом» **. – Flow

+1

Отправка 'SIGCHLD' родителям происходит автоматически, когда дочерний процесс завершается. Если родительский процесс запрограммирован правильно, то есть с одним из вызовов 'wait()', повторная отправка будет иметь нулевой эффект, и если он запрограммирован правильно, он уже обработает исходный сигнал, поэтому обработка его снова просто смутит его и вызвать ошибку в зависимости от того, какой вызов 'wait()' использует. – EJP

+0

Это не должно вызывать ошибки в вызове 'wait()', если обработка родительских 'SIGCHLD' реализована должным образом. Это просто вызовет ненужный вызов обработчика сигнала. В противном случае вы правы: ОС, совместимые с POSIX, отправит «SIGCHLD», если состояние ребенка изменилось, поэтому ручная отправка SIGCHLD не улучшит ситуацию. – Flow

5

Ответ на Википедии, а также, что:

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

11

Процессы зомби на самом деле действительно важны и, безусловно, необходимо. Во-первых, важно понять, как работает процесс создания в Unix/Linux. Единственный способ создать новый процесс - создать существующий процесс для создания нового дочернего процесса через fork(). Таким образом, все процессы в системе расположены в красивой упорядоченной деревенской иерархии. Попробуйте запустить ps -Hu <your username> в системе Linux, чтобы увидеть иерархию процессов, которые у вас есть.

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

Но что происходит, если дочерний процесс завершается до того, как родитель ждет его? Здесь необходимы процессы зомби. Операционная система не может просто отказаться от дочернего процесса; операция родительского процесса может зависеть от знания статуса выхода или использования ресурса для ребенка. т.е. родительский процесс, возможно, должен знать, что ребенок вышел из строя ненормально, или может собирать статистику использования ЦП для своих детей и т. д. Таким образом, единственный выбор - это сберечь эту информацию и сделать ее доступной для родителя, когда она наконец позвоните по номеру wait(). Эта информация является тем, что является зомби-процессом, и это критическая часть того, как управление процессами работает в Unix/Linux. Процессы Zombie гарантируют, что родитель может быть способен восстановить статус выхода, учетную информацию и идентификатор процесса для дочерних процессов, независимо от того, вызывает ли родитель wait() до или после выхода дочернего процесса.

Вот почему зомби-процесс составляет.

Сноска: Если родительский процесс никогда не называет wait(), то дочерний процесс предок к init процесса, когда родительский процесс умирает, и init будет wait() для ребенка.

Смежные вопросы