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
реалізована однією машинної інструкцією, то вонабуде виконана як