Page 118 - 4868
P. 118
Ошибка! Стиль не определен. 116
get_next_customer, запрошуючи клієнта в своє крісло, стриже його і
випускає з перукарні за допомогою виклику процедури finished_cut.
Глобальні змінні служать для зберігання стану процесів та «подання крісел»,
в яких процеси «сплять».
Рисунок 1.19 –Ілюстрація задачі про сплячого перукаря
Дії перукаря та відвідувачів потребують синхронізації в моніторі. По-
перше, перукарю і відвідувачу необхідна зустріч (рандеву), тобто перукар
повинен дочекатися приходу відвідувача, а відвідувач – звільнення перукаря.
Рандеву аналогічно бар’єру для двох процесів, оскільки для продовження
роботи до нього повинні підійти обидві сторони. Однак рандеву відрізняється
від двохпроцесного бар’єру тим, що перукар може зустрітися з будь-яким із
відвідувачів.
По-друге, відвідувачеві необхідно очікувати, поки перукар закінчить
його стригти, що визначається відкриттям дверей для виходу. Нарешті, перед
тим, як закрити двері для виходу, перукар повинен дочекатися, поки піде
відвідувач. Таким чином, перукар і відвідувач проходять через послідовність
синхронізованих етапів, що починаються з рандеву.
Найпростіший спосіб для реалізації подібних етапів синхронізації – це
використання лічильників з метою запам’ятовування числа процесів, що
досягли кожного з етапів. У відвідувачів є два важливі етапи: перебування в
кріслі перукаря і вихід з перукарні. Для даних етапів будемо
використовувати лічильники з назвами cinchairтаcleave. Перукар
циклічно проходить через три етапи: звільнення від роботи, стрижка і
завершення стрижки. Використаємо для нихзмінні-лічильники bavail,
bbusyтаbdone. Всі лічильники в початковому стані мають значення 0.
Оскільки процеси проходять свої етапи послідовно, то для лічильників
задовольняється наступний інваріант:
C1: cinchair >= cleave bavail >= bbusy >= bdone
Щоб забезпечити рандеву відвідувача і перукаря перед початком
стрижки, необхідно накласти умову, що відвідувач не може сісти в крісло
перукаря раніше, ніж перукар звільниться від роботи. Крім того, перукар не
може почати стрижку раніше, ніж відвідувачі сядуть у його крісло. Отже,
виконується умова:
С2: cinchair <= bavail bbusy <= cinchair