Содержание

Слайд 2

7. Монитор 2002 v.0.2 Монитор (2) monitor Буфер; сonstant ДлинаБуфера =

7. Монитор 2002 v.0.2

Монитор (2)

monitor Буфер;
сonstant ДлинаБуфера = 100;
var СамБуфер:

array[1..ДлинаБуфера] of Данное;
var СчетчикЗаписей: integer;
procedure Записать(d: Данное);
begin
...
end;
function Прочитать(): Данное;
begin
...
end;
begin
СчетчикЗаписей:= 0;
end Буфер.

Пример:

Слайд 3

7. Монитор 2002 v.0.2 Процедура доступа monitor Буфер; . . .

7. Монитор 2002 v.0.2

Процедура доступа

monitor Буфер;
. . .
procedure Записать(d: Данное);

begin
...
end;
function Прочитать(): Данное;
begin
...
end;
begin
СчетчикЗаписей:= 0;
end Буфер.

Поставщик:
loop
D:= Производство();
Буфер.Записать(D);
endloop.

Потребитель:
loop
D:= Буфер.Прочитать();
Обработка(D);
endloop.

Слайд 4

7. Монитор 2002 v.0.2 Обеспечивается взаимное исключение доступа к ресурсам, описанным

7. Монитор 2002 v.0.2

Обеспечивается взаимное исключение доступа к ресурсам, описанным в мониторе

(Буфер.Записать(D) и Буфер.Прочитать()- не могут выполняться одновременно)
Управление ОчередьДоступа (например, FIFO) обеспечивает очередность доступа процессов к монитороу

Процедура доступа (2)

Поставщик

Буфер

procedure Записать
function Прочитать

Потребитель

Записать(D)

D:=Прочитать

Слайд 5

7. Монитор 2002 v.0.2 Механизм синхронизации - сигналы type Сигнал; Операции

7. Монитор 2002 v.0.2

Механизм синхронизации - сигналы

type Сигнал;

Операции над сигналами:

var S:

Сигнал;
wait(S):
поставить активный процесс в очередь, связанную с сигналом S
send(S):
первый процесс из очереди S ставится в очередь готовых;
check(S):
возвращает кол-во процессов, ждущих
в очереди S
Слайд 6

7. Монитор 2002 v.0.2 Использование сигналов в мониторе var Полон, Пуст:

7. Монитор 2002 v.0.2

Использование сигналов в мониторе

var Полон, Пуст: Сигнал;
procedure Записать(d: Данное);

begin
if(СчетчикЗаписей => ДлинаБуфера) then
wait(Полон)
endif
ЗаписатьДанноеВБуфер(d);
СчетчикЗаписей:= СчетчикЗаписей + 1;
send(Пуст)
end;
Слайд 7

7. Монитор 2002 v.0.2 Использование сигналов в мониторе (2) function Прочитать():

7. Монитор 2002 v.0.2

Использование сигналов в мониторе (2)
function Прочитать(): Данное
begin
if(СчетчикЗаписей

= 0) then
wait(Пуст)
endif
Прочитать:= ЧтениеЗаписиИзБуфера();
СчетчикЗаписей:= СчетчикЗаписей - 1;
send(Полон)
end;
Слайд 8

7. Монитор 2002 v.0.2 Поставщик Буфер var Полон, Пуст: Сигнал; procedure

7. Монитор 2002 v.0.2

Поставщик

Буфер

var Полон,
Пуст: Сигнал;
procedure Записать
function Прочитать

Потребитель

Записать(D)

D:=Прочитать

Очереди, связанные с монитором

Слайд 9

7. Монитор 2002 v.0.2 Задача «Читатели-Писатели» Информационный фонд П1 П2 ПN

7. Монитор 2002 v.0.2

Задача «Читатели-Писатели»

Информационный
фонд

П1

П2

ПN

Ч1

Ч2

ЧM

M Читателей и N Писателей получают доступ к

Информационному Фонду
Реализовать механизм, позволяющий обеспечить следующее условие:
в каждый момент времени могут работать не более
одного Писателя или не более M Читателей
Слайд 10

7. Монитор 2002 v.0.2 Схема реализации monitor ЧП; var МожноЧитать, МожноПисать:

7. Монитор 2002 v.0.2

Схема реализации

monitor ЧП;
var МожноЧитать,
МожноПисать: Сигнал;
КтоТоПишет: boolean;
Читатели:

0..M;
procedure НачалоЧтения;
procedure КонецЧтения;
procedure НачалоЗаписи;
procedure КонецЗаписи;
begin
КтоТоПишет:= false;
Читатели:= 0;
end ЧП.

Читатель:
loop
ЧП.НачалоЧтения();
РаботаСФондомЧ();
ЧП.КонецЧтения();
РазноеЧ;
endloop.

Писатель:
loop
ЧП.НачалоЗаписи();
РаботаСФондомП();
ЧП.КонецЗаписи();
РазноеП;
endloop.

Слайд 11

7. Монитор 2002 v.0.2 Начало чтения procedure НачалоЧтения(); begin if(КтоТоПишет)or(check(МожноПисать)>0) then

7. Монитор 2002 v.0.2

Начало чтения
procedure НачалоЧтения();
begin
if(КтоТоПишет)or(check(МожноПисать)>0) then
wait(МожноЧитать)
endif
Читатели:=

Читатели + 1;
send(МожноЧитать)
end;
Слайд 12

7. Монитор 2002 v.0.2 Конец чтения procedure КонецЧтения(); begin Читатели:= Читатели

7. Монитор 2002 v.0.2

Конец чтения
procedure КонецЧтения();
begin
Читатели:= Читатели - 1;
if(Читатели

= 0) then
send(МожноПисать)
endif
end;
Слайд 13

7. Монитор 2002 v.0.2 Начало записи procedure НачалоЗаписи(); begin if(Читатели >

7. Монитор 2002 v.0.2

Начало записи
procedure НачалоЗаписи();
begin
if(Читатели > 0)or(КтоТоПишет) then
wait(МожноПисать)

endif;
КтоТоПишет:= true;
end;
Слайд 14

7. Монитор 2002 v.0.2 Конец записи procedure КонецЗаписи(); begin КтоТоПишет:= false;

7. Монитор 2002 v.0.2

Конец записи
procedure КонецЗаписи();
begin
КтоТоПишет:= false;
if(check(МожноЧитать) > 0)

then
send(МожноЧитать)
else
send(МожноПисать)
endif;
end;
Слайд 15

7. Монитор 2002 v.0.2 Реализация механизма семафоров через монитор monitor Семафор;

7. Монитор 2002 v.0.2

Реализация механизма семафоров через монитор

monitor Семафор;
var Счетчик: 0..1;
S:

Сигнал;
procedure P;
begin
if(Счетчик = 0) then
wait(S)
endif;
Счетчик = 0;
end;

procedure V;
begin
Счетчик:= 1;
send(S);
end;
begin
Счетчик:= 1;
end Семафор.