Как linux завершает процессы - PullRequest
0 голосов
/ 17 июня 2020

Я хочу знать некоторые подробности о завершении процесса. Спасибо. Есть ли у процесса точки отмены, такие как pthread? Если да, то какие? Учитывает ли SIGKILL эти баллы за отмену? Изменяет ли сигнал состояние процесса для запуска обработчика сигнала? Если да, значит ли это, что процесс никогда не завершится, если он никогда не получит процессор.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

В Linux, когда процесс завершается, процессу доставляется «сигнал завершения». Хотя существует множество различных типов сигналов, мы в основном имеем дело с сигналами «SIGTERM» и «SIGKILL». Их числовое значение c равно 15 и 9 соответственно.

По умолчанию, все команды уничтожения процессов используют «SIGTERM», что позволяет программе выполнить некоторый код перед завершением, таким образом позволяя ей завершиться «плавно».

Если вы хотите завершить процесс принудительно, вы можете вместо этого использовать «SIGKILL».

0 голосов
/ 18 июня 2020

Есть ли у процесса точки отмены, такие как pthread?

Нет.

Учитывает ли SIGKILL эти точки отмены?

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

Сравните SIGTERM, что немного мягче. Когда процесс получает SIGTERM, которое можно отложить, заблокировав его, или предотвратить, игнорируя, результат зависит от того, зарегистрирован ли для него обработчик сигнала. Если это так, то любой системный вызов, выполняемый потоком, выбранным для приема сигнала, прерывается и вызывается обработчик сигнала. Дополнительные эффекты определяются программой c. Если обработчик не зарегистрирован, программа переходит к выполнению чистого (-i sh) завершения, включая вызов зарегистрированных обработчиков выхода перед фактическим завершением.

Изменяет ли сигнал состояния процесса для запуска обработчика сигнала?

Я не уверен, что вы имеете в виду, но в случае SIGKILL обработчики сигналов не вызываются. В более широком смысле, однако, когда обработчики сигналов все же выполняются, например, в случае SIGTERM, они асинхронны по отношению к выполнению потока, в котором они выполняются.

Если да, означает ли это, что процесс никогда не завершит себя, если он никогда не получит процессор.

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

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

...