Page 86 - 6571
P. 86

Наведений вище зразок коду можна використовувати в якості
                  шаблону для реалізації операторів < await (В) S; >. Коли по-
                  чинається виконання операторів S, умова B повинна мати значен-

                  ня «істина». З метою забезпечення неподільності всієї дії, можна
                  використовувати  протокол  критичної  секції,  приховуючи  при
                  цьому проміжні стани в S. Для циклічної перевірки умови B, мо-

                  жна використати наступний цикл.


                        CSenter;
                          while (!B) { ...}
                          S;
                        CSexit;

                        В  даному  випадку  передбачається,  що  критичні  секції  всіх
                  процесів  або  змінюють  змінні,  що  використовуються  в  B  чи  S,
                  або  використовують  змінні,  змінювані  в  S,  захищені  такими  ж

                  протоколами входу і виходу.
                        Залишається з’ясувати, як реалізувати тіло циклу описаного

                  вище алгоритму. Якщо тіло циклу виконується, значить, умова B
                  має  значення  «хиба».  Отже,  єдиний  спосіб  зробити  умову  B  іс-
                  тинною  –  змінити  в  іншому  процесі  значення  змінних,  що  вхо-
                  дять в цю умову. Передбачається, що всі оператори, які змінюють

                  ці змінні, знаходяться в критичних секціях, тому, під час очіку-
                  вання  виконання  умови  B,  потрібно  виконати  вихід  з  критичної

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

                        CSenter;
                          while (!В) {CSexit, CSenter; }
                          S;
                        CSexit;

                        Дана реалізація зберігає семантику умовних неподільних дій

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

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

                                                              85
   81   82   83   84   85   86   87   88   89   90   91