Операционные системы



УПРАВЛЕНИЕ АСИНХРОННЫМИ ПАРАЛЛЕЛЬНЫМИ - часть 5


Над переменной определено три операции:

-         инициализация ресурса I(S) - задает число доступных ресурсов;

-         P(S) - захват ресурса;

-         V(S)

- освобождение ресурса.

Операция P(S) выполняется следующим образом:

IF S>0                                       есть ресурс?

THEN S:=S-1                            выдать ресурс

ELSE Q(S)                       ожидать очереди);

Операция V(S):

IF Q(S)¹0                                  очередь не пуста?

THEN вывести процесс из очереди   выдать ресурс

ELSE S:=S+1                            освободить ресурс;

Если семафор управляет одним ресурсом, то это двоичный семафор, и S принимает значение {0,1}. Если он управляет группой ресурсов, то в переменной S устанавливается число ресурсов. Для работы семафора необходимо один раз инициировать процесс и обрабатывать критические участки операциями P(S) и V(S).

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

буферов, каждый из которых может содержать одну запись. Процесс "писатель" должен приостанавливаться, когда все буфера оказываются занятыми, и активизироваться при освобождении хотя бы одного буфера. Напротив, процесс "читатель" приостанавливается, когда все буферы пусты, и активизируется при появлении хотя бы одной записи.

Введем два семафора: e

- число пустых буферов и f - число заполненных буферов. Предположим, что запись в буфер и считывание из буфера являются критическими секциями (как в примере с принт-сервером в начале данного раздела). Введем также двоичный семафор b, используемый для обеспечения взаимного исключения. Тогда процессы могут быть описаны следующим образом:

// Глобальные переменные




Содержание  Назад  Вперед