Page 88 - 6571
P. 88

9. Які існують способи реалізації операторів await?
                        10. Яке призначення процедури Delay в операторі await?



                                                       ЛЕКЦІЯ 11

                                    СПРАВЕДЛИВА СТРАТЕГІЯ РІШЕННЯ

                                           ЗАДАЧІ КРИТИЧНОЇ СЕКЦІЇ



                        11.1 Алгоритм розриву вузла


                        Рішення задачі критичної секції з циклічним блокуванням за-
                  безпечує  взаємне  виключення,  відсутність  взаємних  блокувань,
                  активних тупиків і небажаних пауз. Однак для забезпечення влас-

                  тивості  можливості  входу  їм  необхідна  справедлива  стратегія
                  планування. Малоймовірно, що процес, який намагається увійти
                  в критичну секцію, ніколи цього не зробить, однак може виник-

                  нути ситуація, коли декілька процесів будуть «вічно змагатися»
                  за вхід у критичну секцію. Зокрема, рішення з циклічним блоку-
                  ванням  не  керують  порядком,  в  якому  декілька  призупинених
                  процесів намагаються увійти в критичну секцію.

                        Розглянемо рішення задачі критичної секції для двох проце-
                  сів (лістинг 3). Його недолік полягає в тому, що воно не визначає,
                  який із процесів, що намагаються увійти в критичну секцію, туди

                  дійсно потраплять. Наприклад, один процес може увійти в крити-
                  чну секцію, виконати її, потім повернутися до протоколу входу і
                  знову  успішно  увійти  в  критичну  секцію.  Щоб  рішення  було
                  справедливим, повинна дотримуватися черговість входу в крити-

                  чну секцію, якщо декілька процесів намагаються туди увійти.
                        Алгоритм  розриву  вузла  (алгоритм  Пітерсона)  –  це  варіант
                  протоколу  критичної  секції  (лістинг  3),  який  «розриває  вузол»,

                  коли два процеси одночасно намагаються увійти в критичну сек-
                  цію.  Для  цього  використовується  додаткова  змінна,  яка  фіксує,
                  який із процесів увійшов в критичну секцію останнім.

                        Алгоритм програми в лістингу 7 дуже близький до дрібномо-
                  дульного рішення, для якого не потрібні оператори await. Зок-
                  рема, якщо всі оператори await задовольняють умові «не більше

                  одного», то їх можна реалізувати у вигляді циклів активного очі-
                  кування. Нажаль, оператори await в лістингу 7 звертаються до
                  двох змінних, кожну з яких змінює інший процес. Проте в даному

                                                              87
   83   84   85   86   87   88   89   90   91   92   93