![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Монитор – набор управляющих структур и процедуры доступа к ним. Эти процедуры неделимы для прикладных процессов и реализованы в ядре/супервизоре.
Монитор позволяет организовать сложные ожидания и взаимодействия процессов.
Ожидания:
· 1 из ресурсов из списка
· 1 из событий из списка
· ограничения ожидания по времени
Монитор, основанный на таблице синхронизации.
Таблица синхронизации
Проц | Обл. сохр | Готовн | Тай | Ресур | Соб1 | Соб2 | … | СобN |
P1 | Обл1 | Не гот | Спис1 | |||||
P2 | Обл2 | Готов | ||||||
P3 | Обл3 | Не гот | Спис3 | |||||
… | ||||||||
PM | ОблM | Готов |
PM – системный процесс
Процедуры работы с ТС:
1) TP(указатель на список ресурсов, указатель на список событий, таймаут) – запрос всего
2) TV(ресурс) – возврат ресурсов
3) TWAIT(указатель на список событий, таймаут) – запрос событий
4) TPOST(событие) – извещение о наступлении события
Процесс CLOCK
TP (указатель на список ресурсов, указатель на список событий, таймаут)
begin <задержать текущий процесс>
for i=1 to <число семафоров в процессе> do
if семафор(i)>0 then
<взять ресурс из списка ресурсов>
<передать семафор и экземпляр ресурса в область сохранения процесса>
<активизировать задержанный процесс>
end
end
табл[текущий, готовность]="не готов"
табл[текущий, таймер]=Tout
табл[текущий, ресурсы]=указатель на список ресурсов
<отметить в столбцах заказанные события>
<активизировать наиболее приоритетный процесс>
end
TV (семафор, ресурс)
begin <задержать текущий процесс>
for i=1 to <число строк в таблице> do
if <список ожидающих ресурсов содержит возвращаемый ресурс> then
<передать в область сохранения Pi адрес семафора и адрес ресурса>
for j=3 to <количество столбцов в таблице> do
табл[i, j]=0
end
табл[i, готов]=да
if i<текущий then
<активизировать Pi>
else
<активизировать текущий>
end
end
end
<возвратить ресурс в систему>
<активизировать текущий процесс>
end
TWAIT (указатель на список событий, Tout)
begin <задержать текущий процесс>
табл[текущий, готовность]= не готов
табл[текущий, таймер] = Tout
<отметить в таблице события, указанные в запросе>
<активизировать наиболее приоритетный процесс>
end
TPOST (событие)
begin <задержать текущий процесс>
for i = 1 to <количество строк в таблице> do
if табл[i, событие] <> 0 then
for j = 3 to <количество столбцов в таблице> do
табл[i, j] = 0
end
<отметить в области сохранения Pi наступление события>
табл[i, готовность] = готов
if i < текущий then
<активизировать Pi>
else
<активизировать текущий процесс>
end
end
end
<активизировать текущий процесс>
end
Процесс CLOCK
begin
do while (true)
<запустить на один цикл работы таймера текущий процесс>
for i = 1 to <количество строк в таблице> do
if табл[i, таймер] then
табл[i, таймер]--
if табл[i, таймер] = 0 then
for i = 3 to <количество столбцов в таблице> do
табл[i, j] = 0
end
табл[i, готов] = да
end
end
текущий = <самый приоритетный готовый процесс>
end
end
Дата публикования: 2015-10-09; Прочитано: 222 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!