Page 72 - 4868
P. 72

Ошибка! Стиль не определен.                                                                70

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

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

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

                     Лістинг      1.7–    Алгоритм        розриву      вузла     для     двох     процесів
               (крупномодульне рішення)
                     bool in1 = false, in2 = false;
                     in1 last = 1;
                     process CS1 {
                       while (true) {
                         last = 1;
                         in1 = true; /* протокол входу */
                         <await (!in2 or last == 2);>
                           критична секція;
                         in1 = false; /* протокол виходу */
                         некритична секція;
                       }
                     }
                     process CS2 {
                       while (true) {
                         last = 2; in2 = true; /* протокол входу */
                         <await (!in1 or last == 1);>
                           критична секція;
                         in2 = false; /* протокол виходу */
                         некритична секція;
                       }
                     }

                     Оскільки  умову  закінчення  затримки  не  обов’язково  обчислювати
   67   68   69   70   71   72   73   74   75   76   77