ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ
27
typedef int lock_t;
void init_lock(lock_t* lock_status) {
*lock_status = 0; ( void lock(volatile lock_t* lock_status) {
while ( test_and_set(lock_status) == 1);}
void unlock(lock_t* lock_status) {
*lock_status = 0; }
Семафоры
Семафор
— защищенная переменная, значение которой можно запрашивать и
менять только при помощи специальных операций. Концепция семафоров была
предложена Дейкстрой в начале 60-х годов XX века. Семафор – это целочисленная
неотрицательная переменная
S
– счетчик ресурса, которую можно менять и опраши-
вать при помощи операций
P
и
V
, и очередь процессов к ресурсу
Q(S)
. Над перемен-
ной определено три операции:
инициализация ресурса
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
буферов, каждый из которых может содержать одну
запись. Процесс "писатель" должен приостанавливаться, когда все буфера оказыва-
ются занятыми, и активизироваться при освобождении хотя бы одного буфера.
Напротив, процесс "читатель" приостанавливается, когда все буферы пусты, и акти-
визируется при появлении хотя бы одной записи.
1...,19,20,21,22,23,24,25,26,27,28 30,31,32,33,34,35,36,37,38,39,...180