Зомби-процессы

У меня тоже несколько вопросов по поводу зомби-процессов

  • Какие преимущества от концепции процесса зомби?
  • знайте, что ядро сохраняет (PID, статус завершения, информацию об использовании ресурсов) для процесса зомби
    что означает "информация об использовании ресурсов"
  • как PPID зомби() = 1 и он все еще зомби, (init пожинает зомби, потому что он ждет () по умолчанию)
    может ли кто-нибудь написать некоторый код C чтобы сделать зомби это родитель инит?
  • могут ли зомби отказаться от блокировки памяти??

спасибо заранее

3 ответов


-- что преимущества от концепции процесса зомби?

процесс зомби-это просто pid, статус выхода и некоторая учетная информация, которая остается вокруг, пока родитель не использует один из wait семейство системных вызовов для получения окончательного статуса. Пока родитель не позвонит wait идентификатор дочернего процесса должен оставаться помеченным как используемый, чтобы никакой другой процесс не мог быть назначен. Если бы другому процессу был назначен переработанный 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 */

-- могут ли зомби отказаться от блокировки памяти??

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


процесс зомби-это чисто PID и значение состояния выхода. Pid не может быть освобожден, поскольку ресурс (pid) "принадлежит" родительскому. Если бы он был освобожден, другой процесс мог бы получить тот же pid, и тогда родитель мог бы в конечном итоге отправить сигналы несвязанному процессу; даже если родитель сначала ждал, чтобы определить, вышел ли ребенок, не было бы никакого способа избежать условий гонки.


Если вам интересно увидеть процесс зомби в списке запущенных процессов, используйте это:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    pid_t p = fork();   // creates child process and stores the returned PID

    if (p != 0)         // executed by parent process
    {   sleep(1);       /* the child process terminates while the parent process sleeps,
                           the child then becomes a zombie process because the returned status
                           of the terminated child process isn't checked via a wait() */

        system("ps -eo pid,ppid,stat,cmd");  // prints a list of processes in your terminal

    }
    else        // executed by child process
    {
        exit(0);        // the child process terminates immediately
    }

    return 0;
}

вы можете определить процесс зомби по Z+ в списке:

screenshot of the zombie process

Примечание: вам придется изменить код, если вы используете windows.