Родительский процесс
Родительский процесс — в информатике, это процесс, который создал («породил») один или несколько дочерних процессов («процессов потомков»). За счёт чего, процесс может стать дочерним или родительским и наоборот. Таким образом, с помощью механизмов связывания в операционных системах могут формироваться целые иерархии из связанных процессов[1][2][3].
Также из особенностей создания подобных иерархий, можно отметить, то что при создании дочерних процессов, может передаваться часть свойств родительского процесса, а при передачи сигналов управления родительскому процессу, сигналы могут быть переданы от «родителя» к «детям». Примером может послужить любой современный браузер, в котором каждая отдельная вкладка создаётся в отдельном дочернем процессе браузера, и если вы отправите браузеру сигнал о завершении, то все его вкладки также прекратят свою работу.
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 (либо самой wait, либо таких как waitpid, waitid или wait4). Как только этот сбор сделан, система освобождает эти последние биты информации о дочернем процессе и удаляет его PID из таблицы процессов. Однако, если родительский процесс задерживается в сборе данных дочернего процесса (или не делает этого вообще), у системы нет другого выбора, кроме как хранить PID дочернего процесса и данные о его завершении в таблице процессов на неопределенное время.
Такой завершённый процесс, данные которого не были собраны, называется зомби-процессом или просто зомби на языке UNIX. Название представляет собой шутливую аналогию из—за рассмотрения завершённого процесса как «больше не живого» или «мёртвого», поскольку он действительно перестал функционировать и не может «умереть».
Процессы-зомби могут создавать проблемы в системах с ограниченными ресурсами или с таблицами процессов ограниченного размера, поскольку созданию новых активных процессов может помешать нехватка ресурсов, которые всё ещё зарезервированы зомби-процессами.
Процессы-сироты
[править | править код]Процесс-сирота — это ситуация противоположная зомби-процессам, относящаяся к случаю, когда родительский процесс завершается перед его дочерними процессами, которые как говорят, становятся «сиротами». В отличие от асинхронного уведомления от дочернего процесса к родительскому, которое происходит, когда дочерний процесс завершается (через SIGCHLD сигнал), дочерние процессы не уведомляются вовремя, когда их родительский процесс подвергся завершению. Вместо этого система просто переопределяет поле «родительского PID» в данных дочернего процесса, на процесс, который является «предком» любого другого процесса в системе, чей PID обычно имеет значение — «1» и чьё имя традиционно «init» (за исключением ядра Linux версии 3.4 и выше). Это значит, что init «усыновляет» каждый сиротский процесс в системе, если тот теряет своего родителя.
После ядра Linux 3.4 это уже не так, на самом деле процессы могут выдавать системный вызов prctl с опцией 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 = 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.