Как уже отмечалось в главе
2, время жизни процесса можно
теоретически разбить на несколько
состояний, описывающих процесс.
Полный набор состояний процесса
содержится в следующем перечне: Рисунок 6.1 представляет
собой полную диаграмму переходов
процесса из состояния в состояние.
Рассмотрим с помощью модели
переходов типичное поведение
процесса. Ситуации, которые будут
обсуждаться, несколько
искусственны и процессы не всегда
имеют дело с ними, но эти ситуации
вполне применимы для иллюстрации
различных переходов. Начальным
состоянием модели является
создание процесса родительским
процессом с помощью системной
функции fork; из этого состояния
процесс неминуемо переходит в
состояние готовности к запуску (3
или 5). Для простоты предположим, что
процесс перешел в состояние
"готовности к запуску в
памяти" (3). Планировщик процессов
в конечном счете выберет процесс
для выполнения и процесс перейдет в
состояние "выполнения в режиме
ядра", где доиграет до конца роль,
отведенную ему функцией fork.
После всего этого процесс может
перейти в состояние "выполнения
в режиме задачи". По прохождении
определенного периода времени
может произойти прерывание работы
процессора по таймеру и процесс
снова перейдет в состояние
"выполнения в режиме ядра". Как
только программа обработки
прерывания закончит работу, ядру
может понадобиться подготовить к
запуску другой процесс, поэтому
первый процесс перейдет в
состояние "резервирования",
уступив дорогу второму процессу.
Состояние "резервирования" в
действительности не отличается от
состояния "готовности к запуску
в памяти" (пунктирная линия на
рисунке, соединяющая между собой
оба состояния, подчеркивает их
эквивалентность), но они выделяются
в отдельные состояния, чтобы
подчеркнуть, что процесс,
выполняющийся в режиме ядра, может
быть зарезервирован только в том
случае, если он собирается
вернуться в режим задачи.
Следовательно, ядро может при
необходимости подкачивать процесс
из состояния "резервирования".
При известных условиях планировщик
выберет процесс для исполнения и
тот снова вернется в состояние
"выполнения в режиме задачи". Когда процесс выполняет вызов
системной функции, он из состояния
"выполнения в режиме задачи"
переходит в состояние
"выполнения в режиме ядра".
Предположим, что системной функции
требуется ввод-вывод с диска и
поэтому процесс вынужден
дожидаться завершения
ввода-вывода. Он переходит в
состояние "приостанова в
памяти", в котором будет
находиться до тех пор, пока не
получит извещения об окончании
ввода-вывода. Когда ввод-вывод
завершится, произойдет аппаратное
прерывание работы центрального
процессора и программа обработки
прерывания возобновит выполнение
процесса, в результате чего он
перейдет в состояние "готовности
к запуску в памяти". Предположим, что система
выполняет множество процессов,
которые одновременно никак не
могут поместиться в оперативной
памяти, и программа подкачки
(нулевой процесс) выгружает один
процесс, чтобы освободить место для
другого процесса, находящегося в
состоянии "готов к запуску, но
выгружен". Первый процесс,
выгруженный из оперативной памяти,
переходит в то же состояние. Когда
программа подкачки выбирает
наиболее подходящий процесс для
загрузки в оперативную память, этот
процесс переходит в состояние
"готовности к запуску в
памяти". Планировщик выбирает
процесс для исполнения и он
переходит в состояние
"выполнения в режиме ядра".
Когда процесс завершается, он
исполняет системную функцию exit,
последовательно переходя в
состояния "выполнения в режиме
ядра" и, наконец, в состояние
"прекращения существования". Процесс может управлять
некоторыми из переходов на уровне
задачи. Во-первых, один процесс
может создать другой процесс. Тем
не менее, в какое из состояний
процесс перейдет после создания
(т.е. в состояние "готов к
выполнению, находясь в памяти"
или в состояние "готов к
выполнению, но выгружен") зависит
уже от ядра. Процессу эти состояния
не подконтрольны. Во-вторых,
процесс может обратиться к
различным системным функциям,
чтобы перейти из состояния
"выполнения в режиме задачи" в
состояние "выполнения в режиме
ядра", а также перейти в режим
ядра по своей собственной воле. Тем
не менее, момент возвращения из
режима ядра от процесса уже не
зависит; в результате каких-то
событий он может никогда не
вернуться из этого режима и из него
перейдет в состояние
"прекращения существования" (см. раздел 7.2, где
говорится о сигналах). Наконец,
процесс может завершиться с
помощью функции exit по своей
собственной воле, но как
указывалось ранее, внешние события
могут потребовать завершения
процесса без явного обращения к
функции exit. Все остальные переходы
относятся к жестко закрепленной
части модели, закодированной в
ядре, и являются результатом
определенных событий, реагируя на
них в соответствии с правилами,
сформулированными в этой и
последующих главах. Некоторые из
правил уже упоминались: например,
то, что процесс может выгрузить
другой процесс, выполняющийся в
ядре. Две принадлежащие ядру структуры
данных описывают процесс: запись в
таблице процессов и пространство
процесса. Таблица процессов
содержит поля, которые должны быть
всегда доступны ядру, а
пространство процесса - поля,
необходимость в которых возникает
только у выполняющегося процесса.
Поэтому ядро выделяет место для
пространства процесса только при
создании процесса: в нем нет
необходимости, если записи в
таблице процессов не соответствует
конкретный процесс. Запись в таблице процессов
состоит из следующих полей: Предыдущая
глава || Оглавление
|| Следующая глава
6.1 СОСТОЯНИЯ ПРОЦЕССА И
ПЕРЕХОДЫ МЕЖДУ НИМИ
Рисунок 6.1. Диаграмма переходов
процесса из состояния в состояние