Page 69 - 4868
P. 69
67 Ошибка! Стиль не определен.
пам’яті можна скоротити, змінивши протокол входу.Замість того, щоб
виконувати цикл, доки інструкція TS не поверне значення «істина», можна
використати наступний протокол.
while (lock) skip;/* доки lock встановлена, повторювати цикл
*/
while (TS(lock)) { /* спробувати захопити lock */
while (lock) skip; /* повторювати цикл, якщо не вдалося */
}
Дана інструкція входу називається «перевірити-перевірити-
встановити», оскільки процес просто перевіряє змінну lock до тих пір, поки
не з’явиться можливість виконання інструкції TS.У двох додаткових циклах
виконується проста перевірка змінної lock без її модифікації, що дає
можливість зчитати її значення з кеш-пам’яті без впливу на інші
процесори.Таким чином, конфлікти при зверненні до пам’яті скорочуються,
але не зникають.Якщо прапорець блокування lock скинутий, то як мінімум
один, а можливо, і всі призупинені процеси можуть виконати інструкцію
TS.Опишемо способи подальшого усунення конфліктів звернення до пам’яті.
У лістингу 1.6 представлено повне рішення задачі критичної секції, що
використовує вхідний протокол «перевірити-перевірити-встановити».Як і
раніше, протокол виходу скидає змінну lock в початкове значення.
Лістинг 1.6– Критичні секції на основі інструкції «перевірити-
перевірити-встановити»
bool lock = false;/* спільна змінна блокування */
process CS[i = 1 to n] {
while (true) {
while (lock) skip;/* протокол входу */
while (TS(lock)) {
while (lock) skip;
}
критична секція;
lock = false;/* протокол виходу */
некритична секція;
}
}
10.4. Способи реалізації операторів await
Будь-яке рішення задачі критичної секції можна використовувати для
реалізації безумовної неподільної дії < S; >, приховуючи при цьому
внутрішні контрольні точки від інших процесів.Нехай CSenter – вхідний
протокол критичної секції, a CSexit – вихідний протокол.Тоді дію < S; >
можна реалізувати наступним чином:
CSenter;
S;