Page 148 - 6571
P. 148
в одне із вільних крісел і засинає. Після стрижки перукар відкри-
ває відвідувачу двері для виходу і закриває їх за ним. Якщо існу-
ють відвідувачі, що очікують на стрижку, то перукар будить од-
ного із них і очікує, поки той не сяде в крісло перукаря. Якщо ні-
кого немає, то він знову засинає до приходу наступного відвіду-
вача.
Відвідувачі і перукар є процесами, що взаємодіють між со-
бою в моніторі-перукарні (рис. 16.1). Відвідувачі – це клієнти, які
запитують сервіс (стрижку) у перукаря. Перукар – це сервер, який
постійно надає їм сервіс. Даний тип взаємодії являє собою прик-
лад відносин клієнт-сервер.
Для реалізації описаних взаємодій перукарню можна промо-
делювати монітором в якому наявно три процедури:
get_haircut (постригтися), get_next_customer (покликати
наступного) і finished_cut (закінчити стрижку). Відвідувачі
викликають процедуру get_haircut. Вихід з неї відбувається
після того, як перукар закінчить стрижку відвідувача, що викли-
кав процедуру. Перукар циклічно викликає процедуру g
t_next_customer, запрошуючи клієнта в своє крісло, стриже
його і випускає з перукарні за допомогою виклику процедури f
nished_cut. Глобальні змінні служать для зберігання стану про-
цесів та «подання крісел», в яких процеси «сплять».
Рисунок 16.1 – Ілюстрація задачі про сплячого перукаря
Дії перукаря та відвідувачів потребують синхронізації в мо-
ніторі. По-перше, перукарю і відвідувачу необхідна зустріч (ран-
деву), тобто перукар повинен дочекатися приходу відвідувача, а
відвідувач – звільнення перукаря. Рандеву аналогічно бар’єру для
двох процесів, оскільки для продовження роботи до нього повин-
ні підійти обидві сторони. Однак рандеву відрізняється від двох-
147