Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Службы ядра Завершение процесса

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

Процессы завершаются либо добровольно - посредством системного вызова exit, либо непреднамеренно - в результате сигнала. В любом случае завершение процесса вызывает возвращение кода состояния родителю завершающегося процесса (если родитель все еще существует). Это состояние завершения возвращается посредством системного вызова wait4. Вызов wait4 дает приложению возможность запрашивать состояние как остановленных, так и завершенных процессов. Запрос wait4 может ожидать любого непосредственного потомка родителя, или он может по выбору ждать один порожденный процесс или только его потомков в определенной группе процессов. Wait4 может также запрашивать статистику, описывающую использование ресурсов завершившимся порожденным процессом. Наконец, интерфейс wait4 дает процессу возможность запрашивать коды состояния, не блокируясь.

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

Любой поток, входящий в ядро из пространства пользователя, выполнит thread exit(), когда попадет в ядро.

Любой поток, уже находящийся в ядре и пытающийся войти в состояние сна, немедленно возвратится со значением EINTR или EAGAIN, что вернет их обратно в пространство пользователя, освободив ресурсы. Когда поток пытается вернуться в пространство пользователя, он вместо этого попадет в threadexit().

Затем процедура exit() очистит состояние выполнения режима ядра процесса, выполнив следующее:

    отменив все ожидающие таймеры; освободив ресурсы виртуальной памяти; закрыв открытые дескрипторы; обработав остановленные или трассировавшиеся порожденные процессы.

Сбросив состояния режима ядра, процесс далее удаляется из списка активных процессов - списка allproc - и помещается в список процессов-зомби, на который указывает zombproc. Состояние процесса изменяется для отображения того, что в текущий момент не выполняется ни один поток. Процедура exit() делает затем следующее:

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

Наконец, после уведомления родителя процедура cpuexit() освобождает все машинно-зависимые ресурсы процессора и подготавливает завершающее переключение контекста из данного процесса.

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


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 70 гостей онлайн

Реклама на сайте: