Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures_OS.doc
Скачиваний:
17
Добавлен:
23.09.2019
Размер:
826.88 Кб
Скачать

Process Control Block и контекст процесса

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

  • состояние, в котором находится процесс;

  • программный счетчик процесса или, другими словами, адрес команды, которая должна быть выполнена для него следующей;

  • содержимое регистров процессора;

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

  • учетные данные (идентификационный номер процесса, какой пользователь инициировал его работу, общее время использования процессора данным процессом и т. д.);

  • сведения об устройствах ввода-вывода, связанных с процессом (например, какие устройства закреплены за процессом, таблицу открытых файлов).

Ее состав и строение зависят, конечно, от конкретной ОС. Во многих ОС информация, характеризующая процесс, хранится не в одной, а в нескольких связанных структурах данных. Эти структуры могут иметь различные наименования, содержать дополнительную информацию или, наоборот, лишь часть описанной информации. Для любого процесса, находящегося в вычислительной системе, вся информация, необходимая для совершения операций над ним, доступна ОС. Для простоты будем считать, что она хранится в одной структуре данных. Мы будем называть ее PCB (Process Control Block) или блоком управления процессом. Блок управления процессом является моделью процесса для ОС. Любая операция, производимая ОС над процессом, вызывает определенные изменения в PCB. В рамках принятой модели состояний процессов содержимое PCB между операциями остается постоянным.

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

Таким образом, контекст процесса содержит менее оперативную, но более объемную информацию о процессе, необходимую для возобновления выполнения процесса с прерванного места: содержимое регистров процессора, коды ошибок, информацию о всех открытых данным процессом файлов, и не завершенных операций ввода, а так же других данные, характеризующие состояние вычислительной среды в момент прерывания. Контекст, как и дескриптор, доступны только программе ядра.

Порождение процессов в системе Unix происходит в результате выполнения системного вызова «fork». ОС строит образ порожденного процесса, являющийся точной копией образа родительского процесса: т.е. дублируется дескриптор, контекст и образ процесса. После выполнения системного вызова «fork» оба процесса продолжают выполнение с одной и той же точки. Чтобы процесс мог опознать, является ли он родительским или процессом-потомком, системный вызов fork возвращает в родительский процесс идентификатор процесса-потомка, а в процесс-потомок - значение NULL. Типичное разветвление на языке С выглядит так:

if (fork())

{ действие родительского процесса}

else

{действие процесса-потомка}

С помощью системного вызова exec процесс может перейти к выполнению другой программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]