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

редактировать
Системный вызов

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

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

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

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

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

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

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

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

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

См. Также
Ссылки
Последняя правка сделана 2021-06-20 06:29:44
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте