Interested Article - Родительский процесс
- 2020-12-05
- 1
Родительский процесс — в информатике , это процесс , который создал («породил») один или несколько («процессов потомков»). За счёт чего, процесс может стать дочерним или родительским и наоборот. Таким образом, с помощью механизмов связывания в операционных системах могут формироваться целые иерархии из связанных процессов .
Также из особенностей создания подобных иерархий, можно отметить, то что при создании дочерних процессов, может передаваться часть свойств родительского процесса, а при передачи сигналов управления родительскому процессу, сигналы могут быть переданы от «родителя» к «детям». Примером может послужить любой современный браузер , в котором каждая отдельная вкладка создаётся в отдельном дочернем процессе браузера, и если вы отправите браузеру сигнал о завершении, то все его вкладки также прекратят свою работу.
Unix-подобные системы
В Unix-подобных операционных системах каждый процесс, кроме процесса 0 (swapper), создаётся, когда другой процесс выполняет системный вызов fork . Процесс, который вызвал fork, является родительским процессом, а вновь созданный процесс — дочерним процессом. Каждый процесс (кроме процесса 0) имеет один родительский процесс, но может иметь много дочерних процессов.
Ядро операционной системы идентифицирует каждый процесс по его идентификатору . Процесс 0 — это специальный процесс, который создается при загрузке системы, после разветвления дочернего процесса (процесс 1) процесс 0 становится « процессом замены » (также известным как «swapper process» и « idle task »). Процесс 1, известный как init , является главным предком любого другого процесса в системе.
Linux
В ядре Linux , в котором существует очень тонкая разница между процессами и потоками POSIX , существует два вида родительских процессов, а именно «реальный родитель» (real parent) и «родитель» (parent). Родитель — это процесс, который получает сигнал SIGCHLD при завершении дочернего процесса, тогда как реальный родитель — это поток, который фактически создал этот дочерний процесс в многопоточной среде. Для обычного процесса эти два значения одинаковы, но для потока POSIX, который действует как процесс, эти два значения могут отличаться.
Процессы-зомби
Операционная система ведёт таблицу, которая связывает каждый процесс с помощью его идентификатора процесса (обычно называемого «PID» — «Process Identifier») с данными, необходимыми для его функционирования. В течение срока службы процесса такие данные могут включать сегменты памяти назначенные процессу, аргументы , с которыми он был вызван, переменные среды , счетчики использования ресурсов, идентификатор пользователя , , набор групп и возможно, другие типы информации.
Когда процесс завершает свое выполнение, либо путём вызова функции exit (даже если неявно, путем выполнения команды возврата из главной функции), либо путём получения сигнала, который приводит к его внезапному завершению, операционная система освобождает большую часть ресурсов и информации, связанных с этим процессом, но по-прежнему сохраняет данные об использовании ресурсов и коде состояния завершения, потому что родительский процесс может быть заинтересован в том, чтобы узнать, успешно ли выполнен этот дочерний процесс (с помощью стандартных функций для расшифровки кода состояния завершения) и количество системных ресурсов, которые он потреблял во время его выполнения.
По умолчанию система предполагает, что родительский процесс действительно заинтересован в такой информации в момент завершения дочернего процесса, и таким образом посылает родительскому процессу сигнал SIGCHLD , чтобы предупредить, что есть некоторые данные о дочернем процессе, которые необходимо собрать. Такой сбор выполняется путем вызова функции семейства wait (либо самой , либо таких как , или ). Как только этот сбор сделан, система освобождает эти последние биты информации о дочернем процессе и удаляет его PID из таблицы процессов. Однако, если родительский процесс задерживается в сборе данных дочернего процесса (или не делает этого вообще), у системы нет другого выбора, кроме как хранить PID дочернего процесса и данные о его завершении в таблице процессов на неопределенное время.
Такой завершённый процесс, данные которого не были собраны, называется зомби-процессом или просто зомби на языке UNIX . Название представляет собой шутливую аналогию из—за рассмотрения завершённого процесса как «больше не живого» или «мёртвого», поскольку он действительно перестал функционировать и не может «умереть».
Процессы-зомби могут создавать проблемы в системах с ограниченными ресурсами или с таблицами процессов ограниченного размера, поскольку созданию новых активных процессов может помешать нехватка ресурсов, которые всё ещё зарезервированы зомби-процессами.
Процессы-сироты
Процесс-сирота — это ситуация противоположная зомби-процессам, относящаяся к случаю, когда родительский процесс завершается перед его дочерними процессами, которые как говорят, становятся «сиротами». В отличие от асинхронного уведомления от дочернего процесса к родительскому, которое происходит, когда дочерний процесс завершается (через SIGCHLD сигнал), дочерние процессы не уведомляются вовремя, когда их родительский процесс подвергся завершению. Вместо этого система просто переопределяет поле «родительского PID» в данных дочернего процесса, на процесс, который является «предком» любого другого процесса в системе, чей PID обычно имеет значение — «1» и чьё имя традиционно «init» (за исключением ядра Linux версии 3.4 и выше). Это значит, что init «усыновляет» каждый сиротский процесс в системе, если тот теряет своего родителя.
После ядра Linux 3.4 это уже не так, на самом деле процессы могут выдавать системный вызов
с опцией
PR_SET_CHILD_SUBREAPER
, и в результате они, а не процесс под номером 1, станут родительскими для любого из своих осиротевших процессов-потомков. Это способ работы современных менеджеров служб и утилит контроля
демонов
, включая
systemd
,
upstart
и nosh service manager.
См. также
Примечания
- Таненбаум Э. С. , Бос Х. . Глава 1. Процессы и потоки // = Modern Operating Systems . — 4-е изд. — СПб. : Питер , 2015. — С. 64-65. — 1120 с. — ISBN 978-5-4461-1155-8 . 4 марта 2022 года.
- Джонсон Харт . Глава 6. Управление процессами // = Windows System Programming . — 3-е изд. — М. : Вильямс, 2005. — 592 с. — ISBN 5-8459-0879-5 . 8 декабря 2021 года.
- Робачевский А. М. , Немнюгин С. А. , Стесик О. Л. . Глава 1. Работа в операционной системе UNIX // Операционная система UNIX . — 2-е изд. — СПб. : БХВ-Петербург, 2010. — С. 46-53. — 656 с. — ISBN 978-5-94157-538-1 .
Ссылки
- (англ.)
- 2020-12-05
- 1