7. Монитор Хоара7.1. Общее описание

Содержание

Слайд 2

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.2. Пример

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

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.2. Пример monitor Буфер; сonstant
var СамБуфер: array[1..ДлинаБуфера] of Данное;
var СчетчикЗаписей: integer;
procedure Записать(d: Данное);
begin
...
end;
function Прочитать(): Данное;
begin
...
end;
begin
СчетчикЗаписей:= 0;
end Буфер.

Слайд 3

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

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

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 Обеспечивается взаимное исключение доступа к
в мониторе (Буфер.Записать(D) и Буфер.Прочитать()- не могут выполняться одновременно)
Управление ОчередьДоступа (например, FIFO) обеспечивает очередность доступа процессов к монитороу

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

Поставщик

Буфер

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

Потребитель

Записать(D)

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

Слайд 4

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

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

monitor Буфер;
. .

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.4. Процедура доступа monitor Буфер;
.
procedure Записать(d: Данное);
begin
...
end;
function Прочитать(): Данное;
begin
...
end;
begin
СчетчикЗаписей:= 0;
end Буфер.

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

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

Слайд 5

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.4. Сигналы

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

Сигнал S = new

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.4. Сигналы Операции над сигналами:
Сигнал();
wait(S):
поставить активный процесс в очередь, связанную с сигналом S
send(S):
первый процесс из очереди S ставится в очередь готовых;
check(S):Integer:
возвращает кол-во процессов, ждущих в очереди S

Тип данных: type Сигнал

Слайд 6

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.5. Использование сигналов в мониторе
var Полон, Пуст:

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.5. Использование сигналов в мониторе
Сигнал;
procedure Записать(d: Данное);
begin
if(СчетчикЗаписей => ДлинаБуфера) then
wait(Полон)
endif
ЗаписатьДанноеВБуфер(d);
СчетчикЗаписей:= СчетчикЗаписей + 1;
send(Пуст)
end;

Слайд 7

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01
function Прочитать(): Данное
begin
if(СчетчикЗаписей = 0)

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 function Прочитать(): Данное begin if(СчетчикЗаписей
then
wait(Пуст)
endif
Прочитать:= ЧтениеЗаписиИзБуфера();
СчетчикЗаписей:= СчетчикЗаписей - 1;
send(Полон)
end;

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

Слайд 8

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

Поставщик

Буфер

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

Потребитель

Записать(D)

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

7.6. Очереди,

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 Поставщик Буфер var Полон, Пуст:
связанные с монитором

Слайд 9

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.6.1. Почему сигналы?

Допустим, сигналов нет. Тогда просматриваются

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.6.1. Почему сигналы? Допустим, сигналов
только два способа ожидания возможности доступа к монитору
Процесс «сам анилизирует» возможность доступа и «стучится» в монитор до тех пор, пока туда не попадет

Слайд 10

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.6.1.1. Почему сигналы?

Процесс I

Монитор

function Действие: boolean;
.

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.6.1.1. Почему сигналы? Процесс I
. .
if(действиеВыполнено)
return true;
else
return false;

While(!Действие)

Процесс J

While(!Действие)

Плохо – приложение берет на себя функции платформы по распределению ресурса между процессами; приложения пишут разные люди, у которых разные интересы

Слайд 11

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.6.1.2. Почему сигналы?

2.Процесс «сам анилизирует» возможность доступа

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.6.1.2. Почему сигналы? 2.Процесс «сам
и «засыпает» на некоторое время (платформа предоставляет возможность «заснуть» на время t - sleep(t):
while(!Действие){
sleep(t);
}
Еще хуже
a - Увеличивается latency
b - Можно «потерять» момент
освобождения монитора

t

Latency (a)

Разрешение доступа

Запрос от другого процесса (b)

Слайд 12

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.7. Пример 1 - задача «Читатели-Писатели»

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

П1

П2

ПN

Ч1

Ч2

ЧM

M Читателей

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.7. Пример 1 - задача
и N Писателей получают доступ к Информационному Фонду
Реализовать механизм, позволяющий обеспечить следующее условие:
в каждый момент времени могут работать
не более одного Писателя или не более M
Читателей

Слайд 13

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

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

monitor ЧП;
var МожноЧитать,
МожноПисать: Сигнал;

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.7.1. Схема реализации monitor ЧП;
КтоТоПишет: boolean;
Читатели: 0..M;
procedure НачалоЧтения;
procedure КонецЧтения;
procedure НачалоЗаписи;
procedure КонецЗаписи;
begin
КтоТоПишет:= false;
Читатели:= 0;
end ЧП.

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

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

Слайд 14

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

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

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.7.2. Начало чтения procedure НачалоЧтения();
wait(МожноЧитать)
endif
Читатели:= Читатели + 1;
send(МожноЧитать)
end;

Слайд 15

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.7.3. Конец чтения
procedure КонецЧтения();
begin
Читатели:= Читатели

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.7.3. Конец чтения procedure КонецЧтения();
- 1;
if(Читатели = 0) then
send(МожноПисать)
endif
end;

Слайд 16

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.7.4. Начало записи
procedure НачалоЗаписи();
begin
if(Читатели >

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.7.4. Начало записи procedure НачалоЗаписи();
0)or(КтоТоПишет) then
wait(МожноПисать)
endif;
КтоТоПишет:= true;
end;

Слайд 17

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.7.5. Конец записи
procedure КонецЗаписи();
begin
КтоТоПишет:= false;

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.7.5. Конец записи procedure КонецЗаписи();
if(check(МожноЧитать) > 0) then
send(МожноЧитать)
else
send(МожноПисать)
endif;
end;

Слайд 18

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01

7.8. Пример 2 - реализация механизма семафоров

7. Монитор Сидельников В.В. vvs_home@list.ru 2005 v.01 7.8. Пример 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 Семафор.

Имя файла: 7.-Монитор-Хоара7.1.-Общее-описание.pptx
Количество просмотров: 124
Количество скачиваний: 0