Сиротский процесс

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

Unix-подобный

В операционной системе Unix любой осиротевший процесс будет немедленно принят системным процессом, определенным реализацией: ядро ​​устанавливает родительский процесс для этого процесса. Эта операция называется переустановкой родительского процесса и происходит автоматически. Несмотря на то, что технически родительским процессом процесса является системный процесс, он все равно называется осиротевшим процессом, поскольку процесс, который изначально его создал, больше не существует. В других системах осиротевшие процессы немедленно завершаются ядром. Большинство систем Unix исторически использовали init в качестве системного процесса, которому сироты переуступают родительский процесс, но в современных системах DragonFly BSD , FreeBSD и Linux осиротевший процесс может быть переуступлен родительскому процессу "subreaper" вместо init . [1] [2]

Процесс может быть непреднамеренно осиротевшим, например, когда родительский процесс завершается или аварийно завершается. Механизм групп процессов в большинстве операционных систем типа Unix может использоваться для защиты от случайного осиротевания, когда в координации с оболочкой пользователя будет пытаться завершить все дочерние процессы с помощью сигнала «зависания» ( SIGHUP ), а не позволять им продолжать работать как осиротевшим. Точнее, как часть управления заданиями , когда оболочка завершает работу, поскольку она является «лидером сеанса» (ее идентификатор сеанса равен идентификатору ее процесса), соответствующий сеанс входа завершается, и оболочка отправляет SIGHUP всем своим заданиям (внутреннее представление групп процессов).

Иногда желательно намеренно сделать процесс сиротой, обычно для того, чтобы позволить длительному заданию завершиться без дальнейшего внимания пользователя или запустить неопределенно работающую службу или агента; такие процессы (без связанного сеанса) известны как демоны , особенно если они работают неопределенно долго. Низкоуровневый подход заключается в двойном ветвлении , запуске нужного процесса во внучатом процессе и немедленном завершении дочернего процесса. Внучатый процесс теперь становится сиротой и принимается не его прародителем, а init. Альтернативы более высокого уровня обходят обработку зависания оболочки, либо сообщая дочернему процессу игнорировать SIGHUP (используя nohup ), либо удаляя задание из таблицы заданий, либо сообщая оболочке не отправлять SIGHUP в конце сеанса (используя disown в любом случае). В любом случае идентификатор сеанса (идентификатор процесса лидера сеанса, оболочки) не изменяется, а идентификатор процесса завершившегося сеанса продолжает использоваться до тех пор, пока все потерянные процессы не будут завершены или не изменят идентификатор сеанса (путем запуска нового сеанса через setsid(2)).

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

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

Эти осиротевшие процессы тратят ресурсы сервера и могут потенциально оставить сервер без ресурсов. Однако существует несколько решений проблемы сиротских процессов:

  1. Наиболее распространенным методом является прекращение существования; в этом случае сироту убивают.
  2. Реинкарнация — это метод, при котором машины периодически пытаются найти родительские процессы любых удаленных вычислений; в этот момент осиротевшие процессы уничтожаются.
  3. Экспирация — это метод, при котором каждому процессу выделяется определенное количество времени для завершения, прежде чем он будет уничтожен. При необходимости процесс может «попросить» больше времени для завершения, прежде чем выделенное время истечет.

Смотрите также

Ссылки

  1. ^ «Что такое процесс «подсборщика»?».
  2. ^ "Новый родительский процесс, когда родительский процесс умирает". Начиная с Linux 3.4 процессы могут выполнять системный вызов prctl() с опцией PR_SET_CHILD_SUBREAPER, и в результате они, а не процесс №1, станут родителем любого из своих осиротевших дочерних процессов.
  • «10.6.4 Группы процессов-сирот», Модель процесса разработки приложений Linux , Эрик В. Троан и Майкл К. Джонсон, 8 июля 2005 г.
Получено с "https://en.wikipedia.org/w/index.php?title=Сиротский_процесс&oldid=1237691334"