Ответ 1
- каковы преимущества концепции зомби-процесса?
Процесс зомби - это просто pid, статус выхода и некоторая учетная информация, которая остается вокруг, пока родитель не использует одно из системных вызовов wait
для получения своего окончательного статуса. До тех пор, пока родитель не вызовет wait
, идентификатор дочернего процесса должен оставаться помеченным как использованный, так что ему не может быть назначен другой процесс. Если бы другой процесс получил назначение переработанного pid, было бы трудно сказать разницу между ним и предыдущими процессами, которые имели тот же pid. Как только wait
вызывается родителем и возвращает окончательный статус выхода, можно предположить, что никто не будет искать ребенка в этом pid снова, поэтому pid теперь может быть повторно использован.
(Я думаю, что в Linux, если родитель оставляет SIGCHLD как SIG_IGN, ядро не будет держать зомби вокруг, но перерегистрация SIGCHLD как SIG_IGN не имеет такого же эффекта)
- знать, что ядро сохраняет (PID, статус завершения, информацию об использовании ресурсов) для процесса зомби, что означает значение "информации об использовании ресурсов"
Некоторые из этой информации - это то, что работает программа как:
time my_program
сообщит. Эти значения обычно сообщаются в структуре siginfo для SIGCHLD (что не является точно вызовом wait
), но также доступно из вызова формы waitid
вызова systme (в некоторых системах). Посмотрите man sigaction
для информации об этой структуре.
- как зомби PPID() = 1, и он все еще зомби, (init забирает зомби, потому что он по-прежнему() по умолчанию)
Зомби, ppid = 1, не должны оставаться зомби очень долго, потому что init должен пожинать его довольно быстро. Процесс останется зомби из точки вскоре после того, как он умрет (либо через exit
, либо по необработанному сигналу, который убивает его), пока его родитель не вызовет wait
и не получит его окончательный статус. Это означает, что даже если init ничего не делает, кроме вызова init снова и снова, может быть небольшое количество времени, когда процесс может появиться как зомби. Если процессы появляются как дети init (0 = ppid) в течение длительного времени (в секундах), то что-то, вероятно, неверно.
- может ли кто-нибудь написать какой-нибудь C-код, чтобы сделать зомби его родительским? Init?
Это не ясно, но я думаю, что вы хотите:
pid_t f = fork();
if (f > 0) {
exit(0); // this is the parent dying, so the child will be an orphan
// and get adopted by init
} else if (f == 0) {
sleep(100); // This is the child doing something that takes enough time for
// its parent to commit suicide (exit(0)) and then for you to
// observe that it has now been adopted by init
exit(0); // And now it dyes as well, so init should reap its status, but
// it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */
- могут ли зомби отказаться от блокировки памяти?
Зомби не могут держаться над чем-либо. Они теряют все свои страницы памяти, открывают дескрипторы файлов и т.д. Практически все, что операционная система может понять, как освободиться, должна быть освобождена. Было бы ошибкой, но помните, что ОС должна знать, что это то, что должно быть освобождено. Очень просто создавать ресурсы в пространстве пользователя, которые должны быть освобождены, когда программа умирает, что ОС не знает, предполагается освободить.