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
   56   57   58   59   60   61   62   63   64   65   66