14.Подсистема управления процессом. Структура данных процесса, состояние процесса.
Подсистема управления процессами является сердцем ОС Unix. Вся функциональность ОС определяется выполнением тех или иных процессов. Процессы неотъемлемо связаны с двумя важнейшими ресурсами Процессором и оперативной памятью. Как правило, этих ресурсов никогда не бывает много, и в ОС происходит конкурентная борьба за право обладания процессом и памятью.
Каждый процесс представлен в системе двумя основными структурами данных – proc и user, описанными, соответственно, в файлах <sys/proc.h> и <sys/user.h>. Данные структур proc должны присутствовать в памяти в любой момент времени.
p_stat |
Состояние процесса |
p_pri |
Приоритет процесса |
p_uid |
UID процесса |
p_suid |
EUID процесса |
p_pid |
Идентификатор процесса PID |
p_size |
Размер адресного пространства процесса |
p_utime |
Время выполнения в режиме задачи |
p_stime |
Время выполнения в режиме ядра |
p_xstat |
Код возврата, передаваемы родительскому процессу |
p_utbl[] |
Массив записей таблицы страниц для
u-area |
Структура proc является записью системной таблицы процессов. Запись этой таблицы для выполняющегося в настоящий момент времени процесса адресуется системной переменной curproc. Каждый раз при переключении контекста, когда ресурсы процессора передаются другому процессу, соотв. изменяется значение переменной curproc, которая теперь уже указывает на структуру proc активного процесса.
Структура user так же называемая u-area содержит дополнительные данные о процессе, которые требуются ядру только во время выполнения процесса. Данные user размещаются в определённом месте виртуальной памяти ядра и адресуются переменной u. u-area так же содержит стек фиксированного размера, - системный стек или стек ядра. При выполнении процесса в режиме ядра операционная система использует этот стек, а не обычный стек процесса.
Жизненный цикл процесса может быть разбит на несколько состояний. Переход процесса из одного состояния в другое происходит в зависимости от наступления тех или иных событий в системе.
1. Процесс выполняется в режиме задачи. При этом процессом выполняются прикладные инструкции данного процесса.
2. Процесс выполняется в режиме ядра. При этом процессором выполняются системные инструкции ядра операционной системы от имени процесса.
3. Процесс не выполняется, но готов к запуску, как только планировщик выберет его (состояние runnable). Процесс находится в очереди на выполнение и обладает всеми необходимыми ему ресурсами, кроме вычислительных.
4. Процесс находится в состоянии сна (asleep), ожидая недоступного в данный момент ресурса, например завершения операции ввода/вывода
5. Процесс возвращается из режима ядра в режим задачи, но ядро процесс прерывает его и производит переключение контекста для запуска более высокоприоритетного процесса.
6. Процесс только что создан вызовом fork() и находится в переходном состоянии: он существует, но не готов к запуску и не находится в состоянии сна.
7. Процесс выполнил системный вызов exit() и перешёл в состояние зомби (zombie, defunct). Как такового процесса не существует, но остаются записи, содержащие код возврата и временную статистику его выполнения, доступную для родительского процесса. Это состояние является конечным в жизненном цикле процесса
|