Page 147 - 6571
P. 147
Лістинг 29 – Інтервальний таймер з пріоритетним очікуван-
ням
monitor Timer {
int tod = 0;
cond check; # отримує сигнал, коли minrank(check) <=
tod
procedure delay(int interval) {
int wake_time;
wake_time = tod + interval;
if (wake_time > tod) wait(check, wake_time);
}
procedure tick() {
tod = tod+1;
while (!empty(check) && minrank(check) <= tod)
signal(check);
}
}
16.3 Задача про сплячого перукаря
У якості останнього базового прикладу розглянемо ще одну
класичну задачу синхронізації, а саме задачу про сплячого перу-
каря. У неї досить колоритна умова, як і у задачі про філософів,
що обідають. Вона представляє собою практичну задачу, напри-
клад планування роботи голівки дискового накопичувача. Дана
задача ілюструє важливість взаємозв’язків клієнт-сервер, які час-
то існують між процесами. Для її вирішення необхідний особли-
вий тип синхронізації, що називається рандеву (рандеву – напе-
ред обумовлене побачення, призначене на певний час і в певному
місці). Нарешті, вона прекрасно демонструє необхідність систе-
матичного підходу до вирішення задач синхронізації.
Формулювання задачі про сплячого перукаря має наступний
вигляд: у тихому містечку існує перукарня з двома дверима і де-
кількома кріслами. Відвідувачі входять через одні двері і вихо-
дять через інші. Салон перукарні малий, і ходити по ньому може
тільки перукар та один відвідувач. Перукар все життя обслуговує
відвідувачів. Коли в салоні нікого немає, то він спить у своєму
кріслі. Коли відвідувач приходить і бачить сплячого перукаря, він
будить його, сідає в крісло і спить, поки той зайнятий стрижкою.
Якщо перукар зайнятий, коли приходить відвідувач, то той сідає
146