Разделы презентаций


Монитор Хоара

10. Монитор Хоара 2015 v.01Процедура доступа monitor Буфер;var СамБуфер:array[1..ДлинаБуфера] of Данное;var СчетчикЗаписей: integer;procedure Записать(d: Данное); begin ...

Слайды и текст этой презентации

Слайд 110. Монитор Хоара

2015 v.01
Монитор Хоара
Хоар Чарлз Энтони Ричард 1934
::=

<описание типов, констант,
переменных, процедур, функций>
<секция_инициализации>::=
begin
<инициализация переменных>
end <имя_монитора>.

monitor <имя_монитора>;
<секция_описания>
<секция_инициализации>

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

10. Монитор Хоара         2015 v.01 Монитор ХоараХоар Чарлз Энтони

Слайд 210. Монитор Хоара

2015 v.01



Процедура доступа
monitor Буфер;
var СамБуфер:
array[1..ДлинаБуфера] of Данное;
var СчетчикЗаписей:

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

Поставщик:

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

Потребитель:

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

10. Монитор Хоара         2015 v.01Процедура доступа monitor Буфер;var СамБуфер:array[1..ДлинаБуфера]

Слайд 310. Монитор Хоара

2015 v.01
Механизм сигналов

Желательна возможность «нотификации» изменений состояния ресурсов монитора.

Пример: «Поставщик потребитель» - требуется оценивать состояние буфера (полон/пуст).
Решение 1 Плохое.
Задача «берет на себя»
функции диспетчера и
сама «стучится» в
монитор, занимая ресурс

Монитор


function БуферПолон: boolean;
if(СчетчикЗаписей < ДлинаБуфера)
return false;
else
return true;

function БуферПуст: boolean;
if(СчетчикЗаписей > 0)
return false;
else
return true;

Поставщик

While(БуферПолон)

Потребитель

While(БуферПуст)

10. Монитор Хоара         2015 v.01Механизм сигналовЖелательна возможность «нотификации» изменений

Слайд 410. Монитор Хоара

2015 v.01
Решение 2 (совсем плохое)

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

и «засыпает» на некоторое
время (ОС предоставляет возможность «заснуть» на время
t - sleep(t), с передачей управления):

while(Условие){
sleep(t);
}

a - Увеличивается latency
b - Можно «потерять» момент освобождения монитора




t

Latency (a)

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

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

10. Монитор Хоара         2015 v.01Решение 2 (совсем плохое) Процесс

Слайд 510. Монитор Хоара

2015 v.01
Сигналы - определение
Операции над сигналами:
Сигнал S = new

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

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

10. Монитор Хоара         2015 v.01Сигналы - определениеОперации над сигналами:Сигнал

Слайд 610. Монитор Хоара

2015 v.01

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

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


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

Пример – ресурсы монитора «Буфер»

10. Монитор Хоара         2015 v.01var Полон, Пуст: Сигнал;procedure Записать(d:

Слайд 710. Монитор Хоара

2015 v.01
Еще одна «тонкость» ...

if(СчетчикЗаписей == 0) then

wait(Пуст)
endif


Но до выполнения wait(Пуст) условие СчетчикЗаписей == 0 может поменяться несколько раз («На время выполнения процессов не накладывается ниткаких ограничений»)


while(СчетчикЗаписей == 0) do
wait(Пуст)
endwhile

Так что многое, представленное ранее – не совсем корректно

10. Монитор Хоара         2015 v.01Еще одна «тонкость» ...if(СчетчикЗаписей ==

Слайд 810. Монитор Хоара

2015 v.01
class Buffer {
int[] buf;
public synchronized void put (int

s) {
if (counter < CAPACITY) {
counter ++; write_to_buf;
this.notify();
} else {
this.wait();
};
};
public synchronized int get () {
if (counter > 0) {
counter--; read_from_buf;
this.notify();
} else {
this.wait();
};
return buf[counter];
}
}

Монитор в Java

10. Монитор Хоара         2015 v.01class Buffer {	int[] buf;	public synchronized

Слайд 910. Монитор Хоара

2015 v.01
Пример - задача «Читатели-Писатели»
Информационный
фонд
П1
П2
ПN
Ч1
Ч2
ЧM
M Читателей и N Писателей

получают доступ к Информационному Фонду
Реализовать механизм, позволяющий обеспечить следующее условие:
в каждый момент времени могут работать
не более одного Писателя или не более M
Читателей
10. Монитор Хоара         2015 v.01Пример - задача «Читатели-Писатели»ИнформационныйфондП1П2ПNЧ1Ч2ЧMM Читателей

Слайд 1010. Монитор Хоара

2015 v.01
Схема реализации



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

КтоТоПишет: boolean;
Читатели: 0..M;

procedure НачалоЧтения;
procedure КонецЧтения;
procedure НачалоЗаписи;
procedure КонецЗаписи;

begin
КтоТоПишет:= false;
Читатели:= 0;
end ЧП.

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

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

10. Монитор Хоара         2015 v.01Схема реализацииmonitor ЧП;var МожноЧитать,

Слайд 1110. Монитор Хоара

2015 v.01
Начало и окончание чтения

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


wait(МожноЧитать);
Читатели:= Читатели + 1;
notify (МожноЧитать)
end;


procedure КонецЧтения();
begin
Читатели:= Читатели - 1;
if(Читатели = 0) then
notify (МожноПисать)
endif
end;

10. Монитор Хоара         2015 v.01Начало и окончание чтенияprocedure НачалоЧтения();

Слайд 1210. Монитор Хоара

2015 v.01
Начало и окончание записи

procedure НачалоЗаписи();
begin
while(Читатели

> 0)or(КтоТоПишет)
wait(МожноПисать);
КтоТоПишет:= true;
end;


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

10. Монитор Хоара         2015 v.01Начало и окончание записиprocedure НачалоЗаписи();

Слайд 1310. Монитор Хоара

2015 v.01
Пример – монитор и семафоры
monitor Семафор;
var Счетчик: 0..1;

S: Сигнал;
procedure P;

begin
while(Счетчик = 0) do
wait(S)
endwhile;
Счетчик = 0;
end;

procedure V;
begin
Счетчик:= 1;
notify (S);
end;

begin
Счетчик:= 1;
end Семафор.

Задача Ri:

loop
. . .
Семафор.Р();
КритическаяСекция_i
Семафор.V();
. . .
endloop.

Parbegin R1; R2;. . . Rn Parend.

10. Монитор Хоара         2015 v.01Пример – монитор и семафорыmonitor

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика