Page 51 - 4868
P. 51

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

               кінець  списку  так,  щоб  вони  вказували  на  новий  елемент.  Якщо  в  списку
               міститься  тільки  один  елемент,  одночасні  вставка  і  видалення  можуть
               призвести  до  конфлікту  і  зробити  список  непридатним  для  використання.
               Таким  чином,  вставка  і  видалення  елемента  повинні  бути  неподільними
               діями.  До  того  ж,  якщо  список  порожній,  необхідно  відкласти  виконання
               операції видалення до того часу, доки в список буде додано елемент.
                     Неподільні  дії  задаються  за  допомогою  кутових  дужок  « < »  і  « > ».
               Наприклад, < e > вказує, що вираз e повинен бути обчислений неподільним

               чином.
                     Процес синхронізації забезпечується за допомогою оператора await:
                     <await (В) S;>

                     Булевий вираз B задає умову затримки (delay condition), a S – це список
               послідовних  операторів,  завершення  яких  є  гарантованим  (наприклад,
               послідовність  операторів  присвоєння).  Оператор  await  «вставлений»  в
               кутові  дужки,  оскільки  він  має  виконуватися  як  неподільна  дія.  Зокрема,
               вираз  B  гарантовано  має  значення  «істина»,  коли  починається  виконання
               операторів S, і жодний проміжний стан в S не є видимим для інших процесів.
               Наприклад, виконання коду

                     <await (s> 0) s = s-1;>

               відкладається  до  моменту,  коли  значення  S  стане  додатним,  а  потім  воно
               зменшується на 1. При цьому гарантується, що перед відніманням значення S
               є додатним.
                     Оператор await є досить потужним, оскільки може бути використаний
               для визначення будь-яких крупномодульних неподільних дій. Це робить його
               дуже зручним для забезпечення процесу синхронізації. Разом з тим, виразна
               потужність  оператора  await  робить  дуже  «дорогою»  його  реалізацію  в
               загальній формі. Проте існує досить багато прикладів оператора await, що
               допускають його ефективну реалізацію.Наприклад, останній наведений вище
               оператор await є окремим випадком операції P над семафором S.
                     Загальна форма оператора await визначає як взаємне виключення, так і
               синхронізацію  за  умовою.  Для  визначення  тільки  взаємного  виключення

               можна використовувати скорочену форму оператора await:
                     < S;>

                     Наприклад,  в  наступному  операторі  значення  x  та  y  збільшуються  в
               неподільній дії:

                     <x = x+1; y = y+1;>
                     Проміжний стан, в якому змінна x була збільшена на одиницю, а y – ще
               ні, за визначенням не буде видимим для інших процесів, що посилаються на
               змінні x або y. Якщо послідовність S – це одиничний оператор присвоєння,
               що  задовольняє  умові  «не  більше  одного»,  або  якщо  послідовність  S
               реалізована  однією  машинної  інструкцією,  то  вонабуде  виконана  як
   46   47   48   49   50   51   52   53   54   55   56