13.1 Реализация процессов
Для реализации модели процессов операционная система ведет таблицу (состоящую из массива структур), называемую таб¬лицей процессов, в которой каждая запись соответствует какому-нибудь процессу. (Ряд авторов называют эти записи блоками управления процессом.) Эти записи содержат важную информацию о состоянии процесса, включая счетчик команд, указатель стека, распределение памяти, состояние открытых им файлов, его учет¬ную и планировочную информацию и все остальное, касающееся процесса, что должно быть сохранено, когда процесс переключа¬ется из состояния выполнения в состояние готовности или блоки¬ровки, чтобы позже он мог возобновить выполнение, как будто ни¬когда не останавливался.
В табл. 3 показан ряд ключевых полей типовой системы. Поля первого столбца относятся к управлению процессами. Поля остальных двух столбцов относятся к управлению памятью и фай¬лами соответственно. Следует заметить, что наличие тех или иных полей в таблице процессов в большей степени зависит от системы, но в этой таблице изложено основное представление о типе необ¬ходимой информации.
Теперь, после изучения таблицы процессов, появилась воз¬можность чуть лучше объяснить, как создается иллюзия несколь¬ких последовательных процессов, выполняемых на одном (или на каждом) центральном процессоре. Существует область памяти (обычно это фиксированная область в нижних адресах), связанная с каждым классом устройств ввода-вывода, которая называется век¬тором прерывания. В ней содержится адрес процедуры, обслужи¬вающей прерывание. Предположим, что при возникновении диско¬вого прерывания выполнялся пользовательский процесс № 3. Счет¬чик команд этого процесса, слово состояния программы, а иногда и один или несколько регистров помещаются в текущий стек аппаратными средствами прерывания. Затем компьютер переходит на адрес, указанный в векторе прерывания. На этом работа аппаратных средств заканчивается и вступает в действие программное обеспечение, а именно процедура обслуживания прерывания.
Таблица 3. Некоторые из полей типичной записи таблицы процессов
| Управление процессом | Управление памятью | Управление файлами |
| Регистры | Указатель на информацию о текстовом сегменте | Корневой каталог |
| Счетчик команд | Указатель на информацию о сегменте данных | Рабочий каталог |
| Слово состояния программы | Указатель на информацию о сегменте стека | Дескрипторы файлов |
| Указатель стека | Идентификатор пользователя | |
| Состояние процесса | Идентификатор группы | |
| Приоритет | ||
| Параметры планирования | ||
| Идентификатор процесса | ||
| Родительский процесс | ||
| Группа процесса | ||
| Сигналы | ||
| Время запуска процесса | ||
| Использованное время процессора | ||
| Время процессора, использованное дочерними процессами | ||
| Время следующего аварийного сигнала |
Все прерывания сначала сохраняют состояния регистров, зачастую используя для этого запись текущего процесса в таблице процессов. Затем информация, помещенная в стек прерыванием, удаляется и указатель стека переустанавливается на временный стек, используемый обработчиком прерывания. Такие действия, как сохранение регистров и переустановка указателя стека, не могут быть выражены на языках высокого уровня (например, C), поэтому они выполняются небольшой подпрограммой на языке ассемблера, обычно одной и той же для всех прерываний, поскольку характер работы по сохранению регистров не изменяется, какой бы ни была причина прерывания.
Когда эта подпрограмма завершает свою работу, она вызывает C-процедуру, которая делает всю остальную работу для данного конкретного типа прерывания. (Мы предполагаем, что операционная система написана на языке C, который обычно и выбирается для всех настоящих операционных систем.) Возможно, когда работа этой процедуры будет завершена, какой-нибудь процесс переходит в состояние готовности к работе и вызывается планировщик, чтобы определить, какой процесс будет выполняться следующим. После этого управление передается обратно коду, написанному на языке ассемблера, чтобы он загрузил для нового текущего процесса регистры и карту памяти и запустил выполнение этого процесса. Краткое изложение процесса обработки прерывания и планирования приведено в табл. 4. Следует заметить, что детали от системы к системе могут несколько различаться.
Таблица 4. Схема работы низшего уровня операционной системы при возникновении прерывания
| 1. | Оборудование помещает в стек счетчик команд и т. п |
| 2 | Оборудование загружает новый счетчик команд из вектора прерывания |
| 3 | Процедура на ассемблере сохраняет регистры |
| 4 | Процедура на ассемблере устанавливает указатель на новый стек |
| 5 | Запускается процедура на языке C, обслуживающая прерывание (как правило, она считывает входные данные и помещает их в буфер) |
| 6 | Планировщик принимает решение, какой процесс запускать следующим |
| 7 | Процедура на языке C возвращает управление ассемблерному коду |
| 8 | Процедура на ассемблере запускает новый текущий процесс |
Процесс во время своего выполнения может быть прерван тысячи раз, но ключевая идея состоит в том, что после каждого прерывания прерванный процесс возвращается в точности к такому же состоянию, в котором он был до того, как случилось прерывание.
13.2 Моделирование режима многозадачности
Режим многозадачности позволяет использовать центральный процессор более рационально. При грубой прикидке, если для среднестатистического процесса вычисления занимают лишь 20 % времени его пребывания в памяти, то при пяти одновременно находящихся в памяти процессах центральный процессор будет загружен постоянно. Но в эту модель заложен абсолютно нереальный оптимизм, поскольку в ней заведомо предполагается, что все пять процессов никогда не будут одновременно находиться в ожидании окончания какого-нибудь процесса ввода-вывода.
Лучше выстраивать модель на основе вероятностного взгляда на использование центрального процессора. Предположим, что процесс проводит часть своего времени p в ожидании завершения операций ввода-вывода. При одновременном присутствии в памяти n процессов вероятность того, что все n процессов ожидают завершения ввода-вывода (в случае чего процессор простаивает), равна pn. Тогда время задействования процессора вычисляется по формуле
Время задействования центрального процессора = 1 − pn.
На рис. 35 показано время задействования центрального процессора в виде функции от аргумента n, который называется степенью многозадачности.

Оставить комментарий