Иерархия процессов

Операционной системе необходим способ, позволяющий удостовериться в наличии всех обслуживаемых процессов.

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

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

В UNIX-подобных системах процессы создаются при помощи системного вызова fork, создающего точную копию вызвавшего процесса; дочерние процессы также могут вызывать fork, таким образом, образуется дерево процессов; заложена жесткая иерархия процессов, т. е. каждый новый процесс, созданный системным вызовом fork, является дочерним к предыдущему процессу.

Дочернему процессу достаются от родительского процесса переменные, регистры и т. д. После вызова fork, как только родительские данные скопированы, последующие изменения в одном из процессов не влияют на другой, но процессы помнят о том, какой процесс является родительским. В UNIX-системах существует прародитель всех процессов – процесс init.

Дерево процессов может выглядеть следующим образом:

В ОС Windows не существует понятия иерархии процессов, в ней задается специальный маркер родительскому процессу, который позволяет контролировать дочерний процесс.

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

Для завершения процесса используется системный вызов exit() или ExitProcess, при котором освобождаются все используемые ресурсы (память и структуры таблиц ядра), завершаются дочерние процессы (потомки), порожденные данным процессом, т. е. происходит следующее:

· из памяти удаляются сегменты кода и данных, процесс переходит в состояние зомби (в таблице процессов в поле Stat заносится буква Z) и больше не занимает процессорного времени, но строка в таблице процессов остается, и соответствующие структуры ядра не освобождаются;

· после завершения родительского процесса зомби на короткое время становится потомком процесса init (выполняется первым, поскольку является прародителем всех процессов в UNIX-системах), затем окончательно умирает;

· родительский процесс очищает все ресурсы, занимаемые дочерними процессами.

Если родительский процесс завершится раньше дочернего, то дочерний процесс становится сиротой (orphaned process), которая автоматически усыновляется процессом init, принимающим сигнал о завершении процесса-сироты.

Процесс может впасть в состояние сна, которое невозможно прервать (в поле Stat таблицы процессов обозначается буквой D), и характеризуется тем, что процесс не реагирует на системные запросы и может быть уничтожен только перезагрузкой системы.

События, приводящие к завершению процесса (вызов exit или ExitProcess):

· плановое завершение (окончание выполнения);

· плановый выход по известной ошибке (например, отсутствие файла);

· выход по неисправимой ошибке (ошибка в программе);

· уничтожение другим процессом.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: