stringtranslate.com

Дочерний процесс

Дочерний процесс в вычислениях — это процесс , созданный другим процессом ( родительским процессом ). Этот метод относится к многозадачным операционным системам и иногда называется подпроцессом или традиционно подзадачой .

Существует две основные процедуры создания дочернего процесса: системный вызов fork (предпочтительный в Unix-подобных системах и стандарте POSIX ) и spawn (предпочтительный в современном (NT) ядре Microsoft Windows , а также в некоторых исторических операционных системах. системы).

История

Дочерние процессы появились в конце 1960-х годов, а ранняя форма появилась в более поздних версиях формы «Мультипрограммирование с фиксированным числом задач версии II» (MFT-II) операционной системы IBM OS/360 , в которой были представлены подзадачи (см. Задачу ). . Текущая форма в Unix основана на Multics (1969), а форма Windows NT — на OpenVMS (1978) из RSX-11 (1972).

Дети, созданные вилкой

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

Каждый процесс может создавать множество дочерних процессов, но иметь не более одного родительского процесса; если у процесса нет родителя, это обычно указывает на то, что он был создан непосредственно ядром . В некоторых системах, включая системы на базе Linux , самый первый процесс (называемый init ) запускается ядром во время загрузки и никогда не завершается (см. Процесс запуска Linux ); другие процессы без родителей могут быть запущены для выполнения различных задач демона в пользовательском пространстве . Другой способ остаться у процесса без родителя — это смерть его родителя, оставив процесс-сироту ; но в этом случае он вскоре будет принят init .

Сигнал SIGCHLD отправляется родительскому процессу дочернего процесса, когда он завершается , прерывается или возобновляется после прерывания. По умолчанию сигнал просто игнорируется. [1]

Дети, созданные спавном

Конец жизни

Когда дочерний процесс завершается, некоторая информация возвращается родительскому процессу.

Когда дочерний процесс завершается до того, как родительский процесс вызвал wait , ядро ​​сохраняет некоторую информацию о процессе, например его статус завершения , чтобы родительский процесс мог вызвать wait позже. [2] Поскольку дочерний процесс все еще потребляет системные ресурсы, но не выполняет его, это называется процессом-зомби . Системный вызов ожидания обычно вызывается в обработчике SIGCHLD.

POSIX.1-2001 позволяет родительскому процессу выбирать, чтобы ядро ​​автоматически извлекало дочерние процессы, которые завершаются, путем явной установки расположения SIGCHLD в SIG_IGN (хотя по умолчанию установлено значение «игнорировать», автоматическое получение происходит только в том случае, если расположение настроено на игнорирование явно [ 3] ) или установив флаг SA_NOCLDWAIT для сигнала SIGCHLD. Ядра Linux 2.6 придерживаются этого поведения, а FreeBSD поддерживает оба этих метода, начиная с версии 5.0. [4] Однако из-за исторических различий между поведением System V и BSD в отношении игнорирования SIGCHLD вызов ожидания остается наиболее переносимой парадигмой для очистки после разветвленных дочерних процессов. [5]

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

Рекомендации

  1. ^ signal.h  - Справочник базовых определений, Единая спецификация UNIX , версия 4 от Open Group.
  2. ^ wait(2) : дождаться изменения состояния процесса –  Руководство программиста Linux – Системные вызовы
  3. ^ «Ядро Linux: сигналы». Win.tue.nl.​ Проверено 30 апреля 2014 г.
  4. ^ [1] Архивировано 29 сентября 2011 г. в Wayback Machine .
  5. ^ sigaction(2) : проверить и изменить действие сигнала –  Руководство программиста Linux – Системные вызовы

Внешние ссылки