Page 61 - 6571
P. 61
Як конкретний приклад уявімо, що база даних містить два
значення x та y, які завжди повинні бути однакові, тобто жоден
процес, що використовує базу даних, не повинен бачити стан, в
якому x та y мають різні значення. Отже, якщо процес змінює
значення x, то він повинен в тій же самій неподільній дії змінити
також і значення y.
Ще один приклад, нехай один процес додає елементи в чергу,
представлену зв’язаним списком. Інший процес видаляє елементи
із списку за умови, що вони там є. Одна змінна вказує на початок
списку, а інша – на його кінець. Вставка і видалення елементів
вимагають обробки двох значень. Наприклад, для вставки елеме-
нта потрібно змінити посилання на початок та кінець списку так,
щоб вони вказували на новий елемент. Якщо в списку міститься
тільки один елемент, одночасні вставка і видалення можуть приз-
вести до конфлікту і зробити список непридатним для викорис-
тання. Таким чином, вставка і видалення елемента повинні бути
неподільними діями. До того ж, якщо список порожній, необхід-
но відкласти виконання операції видалення до того часу, доки в
список буде додано елемент.
Неподільні дії задаються за допомогою кутових дужок « < » і
« > ». Наприклад, < e > вказує, що вираз e повинен бути обчис-
лений неподільним чином.
Процес синхронізації забезпечується за допомогою оператора
await:
<await (В) S;>
Булевий вираз B задає умову затримки (delay condition), a S –
це список послідовних операторів, завершення яких є гарантова-
ним (наприклад, послідовність операторів присвоєння). Оператор
await «вставлений» в кутові дужки, оскільки він має виконува-
тися як неподільна дія. Зокрема, вираз B гарантовано має значен-
ня «істина», коли починається виконання операторів S, і жодний
проміжний стан в S не є видимим для інших процесів. Напри-
клад, виконання коду
<await (s> 0) s = s-1;>
відкладається до моменту, коли значення S стане додатним, а по-
тім воно зменшується на 1. При цьому гарантується, що перед ві-
дніманням значення S є додатним.
60