Синхронизация блокирования/возобновления процессов при помощи семафоров
Рассмотрим алгоритм, показывающий каким образом при помощи семафора можно реализовать простой механизм синхронизации (блокирования/возобновления) для двух процессов.
var S : семафор;
procedure процесс_Х;
begin
{Предшествующие операторы }
P(S);{семафор 0, ожидать на S, иначе S:=S-1}
{Остальная часть процесса_Х}
end;
procedure процесс_Y;
begin
{Предшествующие операторы }
V(S);{если процесс Х ожидает на S, разрешить работу, иначе S:=S+1}
{Остальная часть процесса_Y}
end;
begin
Инициализация_S(S,0);
Parbegin
процесс_Х;
процесс_Y;
Parend
end.
Реализация взаимодействия в паре “производитель-потребитель” при помощи семафоров
Между процессами может возникать ситуация, при которой один процесс
генерирует информацию, т.е. является “производителем”, а другой ее использует, являясь “потребителем”. эти процессы взаимодействуют через некую разделяемую переменную Буфер.
Рассмотрим алгоритм, в котором для реализации взаимодействия в паре “производитель”- “потребитель” применяются операции над смафорами.
var S1, S2: семафор;{S1 используется для обеспечения доступа к разделяемой переменной буфер в режиме взаимоисключения, S2 используется для обеспечения синхронизации процессов}
буфер : integer;
procedure_производитель;
var результат : integer;
begin
while (true) do
begin
{Вычисление Результата}
P(S1);
буфер:= результат;
V(S1);
V(S2);
end
end;
procedure_потребитель;
var результат : integer;
begin
while (true) do
begin
P(S2);
P(S1);
Результат:=Буфер;
V(S1);
{Запись Результата}
end
end;
begin
инициализация_S1(S1,1);
инициализация_S2(S2,0);
Parbegin
производитель;
потребитель
Parend
end.
Мониторы
Рассмотренные нами выше средства реализации примитивов взаимоисключения элементарны, а решение с их помощью достаточно сложных проблем параллельных вычислений затруднительно.
Монитор (monitor) - это набор процедур и информационных структур, которым процессы пользуются в режиме разделения, причем в каждый момент им может пользоваться только один процесс.
Вход в монитор находится под жестким контролем - здесь осуществляется взаимоисключение процессов, так что в каждый момент времени только одному процессу разрешается войти в монитор. Процессам, которые хотят войти в монитор, когда он уже занят, приходится ждать, причем режимом ожидания управляет сам монитор.
Внутренние данные монитора могут быть либо глобальными, относящимися ко всем процедурам монитора, либо локальными, относящимися только к одной процедуре монитора. Ко всем этим данным можно обращаться только изнутри монитора; процессы, находящиеся вне монитора просто не могут получить доступа к данным монитора.
Дата добавления: 2017-01-29; просмотров: 623;