Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 12 лет назад пользователемgr3852.narod.ru
1 7. Монитор Сидельников В.В v Монитор Хоара 7.1. Общее описание monitor ; end. ::= ::= begin
2 7. Монитор Сидельников В.В v Пример monitor Буфер; сonstant ДлинаБуфера = 100; var СамБуфер: array[1..ДлинаБуфера] of Данное; var СчетчикЗаписей: integer; procedure Записать(d: Данное); begin... end; function Прочитать(): Данное; begin... end; begin СчетчикЗаписей:= 0; end Буфер.
3 7. Монитор Сидельников В.В v.01 3 Обеспечивается взаимное исключение доступа к ресурсам, описанным в мониторе ( Буфер.Записать(D) и Буфер.Прочитать()- не могут выполняться одновременно) Управление ОчередьДоступа (например, FIFO) обеспечивает очередность доступа процессов к монитороу 7.3. Процедура доступа Поставщик Буфер ОчередьДоступа procedure Записать function Прочитать Потребитель Записать(D) D:=Прочитать
4 7. Монитор Сидельников В.В v Процедура доступа monitor Буфер;... procedure Записать(d: Данное); begin... end; function Прочитать(): Данное; begin... end; begin СчетчикЗаписей:= 0; end Буфер. Поставщик: loop D:= Производство(); Буфер.Записать(D); endloop. Потребитель: loop D:= Буфер.Прочитать(); Обработка(D); endloop.
5 7. Монитор Сидельников В.В v Сигналы Операции над сигналами: Сигнал S = new Сигнал(); wait(S): поставить активный процесс в очередь, связанную с сигналом S send(S): первый процесс из очереди S ставится в очередь готовых; check(S):Integer: возвращает кол-во процессов, ждущих в очереди S Тип данных: type Сигнал
6 7. Монитор Сидельников В.В v Использование сигналов в мониторе var Полон, Пуст: Сигнал; procedure Записать(d: Данное); begin if(СчетчикЗаписей => ДлинаБуфера) then wait(Полон) endif ЗаписатьДанноеВБуфер(d); СчетчикЗаписей:= СчетчикЗаписей + 1; send(Пуст) end;
7 7. Монитор Сидельников В.В v.01 7 function Прочитать(): Данное begin if(СчетчикЗаписей = 0) then wait(Пуст) endif Прочитать:= ЧтениеЗаписиИзБуфера(); СчетчикЗаписей:= СчетчикЗаписей - 1; send(Полон) end; 7.5. Использование сигналов в мониторе
8 7. Монитор Сидельников В.В v.01 8 Поставщик Буфер ОчередьДоступа var Полон, Пуст: Сигнал; procedure Записать function Прочитать Потребитель Записать(D) D:=Прочитать ОчередьСигналаПолонОчередьСигналаПуст 7.6. Очереди, связанные с монитором
9 7. Монитор Сидельников В.В v Почему сигналы? Допустим, сигналов нет. Тогда просматриваются только два способа ожидания возможности доступа к монитору 1.Процесс «сам анилизирует» возможность доступа и «стучится» в монитор до тех пор, пока туда не попадет
10 7. Монитор Сидельников В.В v Почему сигналы? Процесс I Монитор ОчередьДоступа function Действие: boolean;... if(действиеВыполнено) return true; else return false; While(!Действие) Процесс J While(!Действие) Плохо – приложение берет на себя функции платформы по распределению ресурса между процессами; приложения пишут разные люди, у которых разные интересы
11 7. Монитор Сидельников В.В v Почему сигналы? 2.Процесс «сам анилизирует» возможность доступа и «засыпает» на некоторое время (платформа предоставляет возможность «заснуть» на время t - sleep(t): while(!Действие){ sleep(t); } Еще хуже a - Увеличивается latency b - Можно «потерять» момент освобождения монитора t Latency (a) Разрешение доступа Запрос от другого процесса (b)
12 7. Монитор Сидельников В.В v Пример 1 - задача «Читатели-Писатели» Информационный фонд П1П1 П2П2 ПNПN Ч1Ч1 Ч2Ч2 ЧMЧM M Читателей и N Писателей получают доступ к Информационному Фонду Реализовать механизм, позволяющий обеспечить следующее условие: в каждый момент времени могут работать не более одного Писателя или не более M Читателей
13 7. Монитор Сидельников В.В v Схема реализации monitor ЧП; var МожноЧитать, МожноПисать: Сигнал; КтоТоПишет: boolean; Читатели: 0..M; procedure НачалоЧтения; procedure КонецЧтения; procedure НачалоЗаписи; procedure КонецЗаписи; begin КтоТоПишет:= false; Читатели:= 0; end ЧП. Читатель: loop ЧП.НачалоЧтения(); РаботаСФондомЧ(); ЧП.КонецЧтения(); РазноеЧ; endloop. Писатель: loop ЧП.НачалоЗаписи(); РаботаСФондомП(); ЧП.КонецЗаписи(); РазноеП; endloop.
14 7. Монитор Сидельников В.В v Начало чтения procedure НачалоЧтения(); begin if(КтоТоПишет)or(check(МожноПисать)>0) then wait(МожноЧитать) endif Читатели:= Читатели + 1; send(МожноЧитать) end;
15 7. Монитор Сидельников В.В v Конец чтения procedure КонецЧтения(); begin Читатели:= Читатели - 1; if(Читатели = 0) then send(МожноПисать) endif end;
16 7. Монитор Сидельников В.В v Начало записи procedure НачалоЗаписи(); begin if(Читатели > 0)or(КтоТоПишет) then wait(МожноПисать) endif; КтоТоПишет:= true; end;
17 7. Монитор Сидельников В.В v Конец записи procedure КонецЗаписи(); begin КтоТоПишет:= false; if(check(МожноЧитать) > 0) then send(МожноЧитать) else send(МожноПисать) endif; end;
18 7. Монитор Сидельников В.В v Пример 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 Семафор.
19 7. Монитор Сидельников В.В v Задача Ri: loop... Семафор.Р(); КритическаяСекция_i Семафор.V();... endloop. Parbegin R1; R2;... Rn Parend Пример 2 - реализация механизма семафоров через монитор
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.