Page 49 - 4868
P. 49
47 Ошибка! Стиль не определен.
до виконуваного процесу, наприклад, в його стеку.
У такій моделі обчислювальної машини, якщо вираз e в одному процесі
не звертається до змінної, зміненої іншим процесом, обчислення виразу
завжди буде неподільної операцією, навіть якщо для цього необхідно
виконати декілька дрібномодульних дій. Це відбувається тому, що при
обчисленні виразу e жодна змінна, від якої залежить значення e, не змінює
свого значення, і жоден процес не може бачити тимчасові значення змінної,
що створюються при обчисленні виразу. Аналогічно, якщо операція
присвоєння x = e в одному процесі не посилається на змінні, з якими
працює інший процес, то виконання операції присвоєння буде неподільною
операцією.
На жаль, багато операторів в паралельному програмуванні, що
посилаються на спільні змінні, не задовольняють цим умовам. Однак часто
виконуються більш м’які умови.
Критичним посиланням у виразі називається посилання на змінну, що
змінюється іншим процесом. Припустимо, що будь-яке критичне посилання
– це посилання на просту змінну, яка зберігається в комірці пам’яті і може
бути зчитана і записана автоматично. Оператор присвоєння
x = eзадовольняє умові «не більше одного», якщо або вираз e містить не
більше одного критичного посилання, а змінна x не зчитується іншим
процесом, або вираз e не містить критичних посилань, а інші процеси
можуть зчитувати змінну x.
Дана умова називається «не більше одного», оскільки в такому випадку
можлива тільки одна спільна змінна, і на неї посилаються не більше одного
разу. Аналогічне визначення застосовується і до виразів, які не включають в
себе оператори присвоєння. Такий вираз задовольняє умові «не більше
одного», якщо містить не більше одного критичного посилання.
Якщо оператор присвоєння задовольняє вимогам умови «не більше
одного», то виконання цього оператора буде «здаватися» неподільною
операцією, оскільки одна-єдина спільна змінна у виразі буде записуватися
або зчитуватися тільки один раз. Наприклад, якщо вираз e не містить
критичних посилань, а змінна x – проста змінна, що зчитується іншими
процесами, то вони не можуть розпізнати, чи обчислюється вираз
неподільним чином. Аналогічно, якщо e містить одне критичне посилання,
то процес, що виконує присвоєння, не зможе зафіксувати моменту зміни
значення змінної. Йому стане доступним тільки деяке кінцеве значення цієї
змінної.
Наведемо декілька прикладів у яких задовольняється умова «не більше
одного». У наступній програмі обидва присвоєння задовольняють умові «не
більше одного».
int x = 0, y = 0;
cox = x+1;// y = y+1;oc;
У даному випадку не існує критичних посилань в жоден процес, тому
кінцевим значенням змінних x та y буде 1.