Завершение выполнения процесса

We use cookies. Read the Privacy and Cookie Policy

Завершение выполнения процесса

Процесс завершает свое выполнение с помощью функции exit(). Эта функция может быть вызвана системным вызовом exit(2), а если завершение процесса вызвано получением сигнала, функцию exit() вызывает само ядро. Функция exit() выполняет следующие действия:

? Отключает все сигналы.

? Закрывает все открытые файлы.

? Сохраняет статистику использования вычислительных ресурсов и код возврата в записи proc таблицы процессов.

? Изменяет состояние процесса на "зомби".

? Делает процесс init(1M) родительским для всех потомков данного процесса.

? Освобождает адресное пространство процесса, u-area, карты отображения и области свопинга, связанные с процессом.

? Отправляет сигнал SIGCHLD родительскому процессу, уведомляя его о "смерти" потомка.

? Пробуждает родительский процесс, если тот ожидает завершения потомка.

? Запускает функцию переключения контекста, в результате чего высокоприоритетный процесс получает доступ к вычислительным ресурсам.

После завершения выполнения функции exit() процесс находится в состоянии "зомби". При этом от процесса остается запись proc в таблице процессов, содержащая статистику использования вычислительных ресурсов и код возврата. Эта информация может потребоваться родительскому процессу, поэтому освобождение структуры proc производит родитель с помощью системного вызова wait(2) возвращающего статистику и код возврата потомка. Если родительский процесс заканчивает свое выполнение раньше потомка, "родительские права" переходят к процессу init(1M). В этом случае после смерти потомка init(1M) делает системный вызов wait(2) и освобождает структуру proc.

Другая ситуация возникает, если потомок заканчивает свое выполнение раньше родителя, а родительский процесс не производит вызова wait(2). В этом случае структура proc потомка не освобождается и процесс продолжает находиться в состоянии "зомби" до перезапуска операционной системы. Хотя такой процесс (которого, вообще говоря, не существует) не потребляет ресурсов системы, он занимает место в таблице процессов, тем самым уменьшая максимальное число активных задач.

Данный текст является ознакомительным фрагментом.