Page 76 - 6571
P. 76
дження можна представити у формі I Ù L, то доведення правиль-
ності процесів будуть вільні від взаємного втручання. Справа в
тому, що: 1) предикат I інваріантний щодо кожної дії присвоєння
a ; 2) жодна дія присвоєння в одному процесі не може вплинути
на локальний предикат L в іншому процесі, оскільки ліва частина
присвоєння a відрізняється від змінних в предикаті L.
Якщо всі твердження використовують глобальний інваріант і
локальний предикат так, як це описано вище, то вимога взаємно-
го невтручання (1) виконується для кожної пари дій присвоєння
та критичних тверджень. Крім того, необхідно перевірити тільки
трійки в кожному процесі, щоб впевнитися в тому, що кожне
критичне твердження має вищеописаний вигляд, а предикат I є
глобальним інваріантом. При цьому немає жодної необхідності
переглядати твердження або оператори в інших процесах. Факти-
чно з масиву ідентичних процесів досить перевірити тільки один.
У будь-якому випадку необхідно перевірити лише лінійне число
операторів і тверджень у порівнянні із перевіркою експоненціаль-
ної кількості історій програми.
9.3 Синхронізація процесів
Послідовність операторів всередині оператора await для ін-
ших процесів виступає як неподільна одиниця. Це означає, що
під час визначення того, чи втручаються процеси в роботу один
одного, можна не звертати увагу на результати виконання окре-
мих операторів. Достатньо з’ясувати, чи може вся послідовність
операторів зумовити втручання. Наприклад, розглянемо наступну
неподільну дію:
<x = x+1; y = y+1;>
Жодне присвоєння саме по собі не може викликати втручан-
ня, оскільки жодний інший процес не може побачити стан, при
якому змінна x уже була збільшена на 1, а змінна y ще ні. Причи-
ною втручання може стати тільки пара присвоєнь.
Внутрішні стани сегментів програми всередині кутових ду-
жок також неподільні. Отже, жодне твердження про внутрішній
стан програми не може зазнавати втручання з боку іншого проце-
су. Наприклад, твердження в середині наступної неподільної дії
не є критичним.
75