Page 88 - 6571
P. 88
9. Які існують способи реалізації операторів await?
10. Яке призначення процедури Delay в операторі await?
ЛЕКЦІЯ 11
СПРАВЕДЛИВА СТРАТЕГІЯ РІШЕННЯ
ЗАДАЧІ КРИТИЧНОЇ СЕКЦІЇ
11.1 Алгоритм розриву вузла
Рішення задачі критичної секції з циклічним блокуванням за-
безпечує взаємне виключення, відсутність взаємних блокувань,
активних тупиків і небажаних пауз. Однак для забезпечення влас-
тивості можливості входу їм необхідна справедлива стратегія
планування. Малоймовірно, що процес, який намагається увійти
в критичну секцію, ніколи цього не зробить, однак може виник-
нути ситуація, коли декілька процесів будуть «вічно змагатися»
за вхід у критичну секцію. Зокрема, рішення з циклічним блоку-
ванням не керують порядком, в якому декілька призупинених
процесів намагаються увійти в критичну секцію.
Розглянемо рішення задачі критичної секції для двох проце-
сів (лістинг 3). Його недолік полягає в тому, що воно не визначає,
який із процесів, що намагаються увійти в критичну секцію, туди
дійсно потраплять. Наприклад, один процес може увійти в крити-
чну секцію, виконати її, потім повернутися до протоколу входу і
знову успішно увійти в критичну секцію. Щоб рішення було
справедливим, повинна дотримуватися черговість входу в крити-
чну секцію, якщо декілька процесів намагаються туди увійти.
Алгоритм розриву вузла (алгоритм Пітерсона) – це варіант
протоколу критичної секції (лістинг 3), який «розриває вузол»,
коли два процеси одночасно намагаються увійти в критичну сек-
цію. Для цього використовується додаткова змінна, яка фіксує,
який із процесів увійшов в критичну секцію останнім.
Алгоритм програми в лістингу 7 дуже близький до дрібномо-
дульного рішення, для якого не потрібні оператори await. Зок-
рема, якщо всі оператори await задовольняють умові «не більше
одного», то їх можна реалізувати у вигляді циклів активного очі-
кування. Нажаль, оператори await в лістингу 7 звертаються до
двох змінних, кожну з яких змінює інший процес. Проте в даному
87