Page 114 - 6571
P. 114
досягли критичних точок виконання, або для відображення стану
спільних змінних. Критичні точки виконання – це початок і
закінчення операцій deposit та fetch. Відповідні зміни у
спільному буфері пов’язані із його заповненням або очищенням.
Оскільки кількість виробників і споживачів не обмежена, то
простіше виконати зв’язування семафора із кожним з двох
можливих станів буфера, а не з точками виконання процесів.
Нехай empty (порожній) і full (повний) – два семафора, що
відображають стан буфера. У початковому стані буфер порожній,
тому семафор empty має значення 1 (тобто відбулася подія
«спустошити буфер»), a full – значення 0. Перед виконанням
операції deposit виробник спочатку очікує очищення буфера.
Коли виробник поміщає в буфер повідомлення, буфер стає
заповненим. І, навпаки, перед виконанням операції fetch
споживач спочатку очікує заповнення буфера, а потім очищує
його. Процес очікує на подію, виконуючи операцію P для
відповідного семафора, і повідомляє про подію, виконуючи
операцію V. Отримане рішення показано в лістингу 18.
Змінні empty та full в лістингу 18 є двійковими
семафорами. Разом вони утворюють так званий спільний
двійковий семафор, оскільки в будь-який момент часу тільки
один з них може мати значення 1. Термін «спільний двійковий
семафор» зумовлений тим, що змінні empty та full можуть
розглядатися як єдиний двійковий семафор, розділений на дві
частини. У загальному випадку спільний двійковий семафор
може бути утворений будь-яким числом двійкових семафорів.
Роль спільних двійкових семафорів особливо важлива під час
реалізації взаємного виключення. Припустимо, що один з
двійкових семафорів ініціалізований значенням 1 (відповідно,
інші мають значення 0). Припустимо, що в процесах, які
використовують семафори, кожна виконувана гілка починається
операцією P для одного із семафорів і закінчується операцією V
для будь-якого іншого семафора. Тоді всі оператори між P і
найближчою операцією V виконуються із взаємним винятком,
тобто якщо процес знаходиться між операціями P та V, то всі
семафори рівні 0, і, отже, жоден процес не зможе завершити
операцію P, поки перший процес не виконає операцію V.
113