Page 84 - 6571
P. 84
ливим побудувати протокол входу, заснований на переході від
нуля до одиниці.
Хоча рішення в лістингу 5 вірне, експерименти на мультип-
роцесорних машинах показують його низьку продуктивність, як-
що декілька процесів «змагаються» за доступ до критичної секції.
Причина в тому, що кожен призупинений процес безперервно
звертається до спільної змінної lock. Ця «гаряча точка» поро-
джує конфлікт під час звернення до пам’яті, який знижує продук-
тивність модулів пам’яті і шин, що зв’язують процесор та
пам’ять.
До того ж інструкція TS при кожному виклику записує зна-
чення в змінну lock, навіть якщо воно не змінилось. Оскільки в
мультипроцесорних машинах із роздільною пам’яттю, для змен-
шення числа звернень до основної пам’яті використовуються ке-
ші, то інструкція TS виконується набагато довше, ніж просте зчи-
тування значення спільної змінної (коли змінна записується од-
ним із процесорів, її копії потрібно оновити або зробити недійс-
ними в кешах інших процесорів).
Витрати на оновлення вмісту кеш-пам’яті і конфлікти при
зверненні до пам’яті можна скоротити, змінивши протокол входу.
Замість того, щоб виконувати цикл, доки інструкція TS не повер-
не значення «істина», можна використати наступний протокол.
while (lock) skip;/* доки lock встановлена, повторювати
цикл */
while (TS(lock)) { /* спробувати захопити lock */
while (lock) skip; /* повторювати цикл, якщо не вда-
лося */
}
Дана інструкція входу називається «перевірити-перевірити-
встановити», оскільки процес просто перевіряє змінну lock до
тих пір, поки не з’явиться можливість виконання інструкції TS. У
двох додаткових циклах виконується проста перевірка змінної
lock без її модифікації, що дає можливість зчитати її значення з
кеш-пам’яті без впливу на інші процесори. Таким чином, конфлі-
кти при зверненні до пам’яті скорочуються, але не зникають. Як-
що прапорець блокування lock скинутий, то як мінімум один, а
можливо, і всі призупинені процеси можуть виконати інструкцію
83