stringtranslate.com

ожидание (системный вызов)

В компьютерных операционных системах процесс (или задача ) может ожидать , пока другой процесс завершит свое выполнение. В большинстве систем родительский процесс может создать независимо выполняемый дочерний процесс . Затем родительский процесс может выполнить системный вызов wait , который приостанавливает выполнение родительского процесса, пока выполняется дочерний процесс. Когда дочерний процесс завершается, он возвращает операционной системе статус выхода , который затем возвращается ожидающему родительскому процессу. Затем родительский процесс возобновляет выполнение. [1]

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

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

Некоторые операционные системы отправляют сигнал ( SIGCHLD ) родительскому процессу при завершении дочернего процесса, уведомляя родительский процесс и позволяя ему получить статус завершения дочернего процесса.

Статус выхода, возвращаемый дочерним процессом, обычно указывает, завершился ли процесс нормально или ненормально . Для нормального завершения этот статус также включает код выхода (обычно целочисленное значение), который процесс вернул системе. В течение первых 20 лет UNIX только нижние 8 бит кода выхода были доступны ожидающему родительскому процессу. В 1989 году с SVR4 был введен новый waitid вызова, который возвращает все биты из вызова выхода в структуре , называемой siginfo_t , в члене структуры si_status . Waitid является обязательной частью стандарта POSIX с 2001 года.

Зомби и сироты

Когда дочерний процесс завершается, он становится процессом-зомби и продолжает существовать как запись в таблице системных процессов, даже если он больше не является активно выполняемой программой. При нормальной работе он, как правило, немедленно будет ожидаться своим родителем, а затем поглощаться системой, возвращая себе ресурс (запись в таблице процессов). Если дочерний процесс не ожидает своего родителя, он продолжает потреблять этот ресурс бесконечно, и, таким образом, происходит утечка ресурсов . Такие ситуации обычно обрабатываются специальным процессом-«сборщиком» [ требуется ссылка ], который находит зомби и извлекает их статус завершения, позволяя операционной системе затем освободить их ресурсы.

И наоборот, дочерний процесс, родительский процесс которого завершается до него, становится процессом-сиротой . Такие ситуации обычно обрабатываются специальным "корневым" (или "init") процессом, который назначается новым родителем процесса, когда его родительский процесс завершается. Этот специальный процесс определяет, когда процесс-сирота завершается, а затем извлекает его статус выхода, позволяя системе освободить завершенный дочерний процесс.

Если дочерний процесс получает сигнал, ожидающий родительский процесс продолжит выполнение, оставив позади процесс-сироту. [ требуется цитата ] Поэтому иногда необходимо проверить аргумент, установленный wait, waitpid или waitid, и, в случае, если WIFSIGNALED имеет значение true, дождаться, пока дочерний процесс снова освободит ресурсы. [ требуется цитата ]

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

Ссылки

  1. ^ "Ожидание системного вызова в C". GeeksforGeeks . 2017-06-03 . Получено 2023-05-15 .