Page 70 - 4868
P. 70
Ошибка! Стиль не определен. 68
CSexit;
В даному випадку передбачається, що всі секції коду процесів, які
модифікують або посилаються на змінні, що змінюються в S (або
модифікують змінні, на які посилається S), захищені аналогічними вхідними
та вихідними протоколами.По суті, дужки < та > замінені процедурами
CSenterтаCSexit.
Наведений вище зразок коду можна використовувати в якості шаблону
для реалізації операторів < await (В) S; >.Коли починається виконання
операторів S, умова B повинна мати значення «істина».З метою забезпечення
неподільності всієї дії, можна використовувати протокол критичної секції,
приховуючи при цьому проміжні стани в S. Для циклічної перевірки умови B,
можна використати наступний цикл.
CSenter;
while (!B) { ...}
S;
CSexit;
В даному випадку передбачається, що критичні секції всіх процесівабо
змінюють змінні, що використовуються в BчиS, або використовують змінні,
змінювані в S, захищені такими ж протоколами входу і виходу.
Залишається з’ясувати, як реалізувати тіло циклуописаного вище
алгоритму.Якщо тіло циклу виконується, значить, умова B має значення
«хиба».Отже, єдиний спосіб зробити умову B істинною – змінити в іншому
процесі значення змінних, що входять в цю умову.Передбачається, що всі
оператори, які змінюють ці змінні, знаходяться в критичних секціях, тому,
під час очікування виконання умови B, потрібно виконати вихід з критичної
секції.Але для забезпечення неподільності процедури обчислення умови B і
виконанняS перед повторним обчисленням умови B необхідно знову увійти в
критичну секцію.Можливим уточненням зазначеного вище протоколу може
бути наступне рішення.
CSenter;
while (!В) {CSexit, CSenter; }
S;
CSexit;
Дана реалізація зберігає семантику умовних неподільних дій за умови,
що протоколи критичних секцій гарантують взаємне виключення.
Програма представлена вище правильна, але не ефективна, оскільки
процес, що виконує її, повторює «жорсткий» цикл, постійно виходячи з
критичної секції і входячи в неї, але не може просунутися далі, поки будь-
який інший процес не змінить змінні в умові В. Це призводить до конфлікту
звернення до пам’яті, оскільки кожен призупинений процес постійно
звертається до змінних, що використовуються в протоколах критичної секції
та в умові B.
Щоб зменшити кількість конфліктів звернення до пам’яті, процес перед