115
"високий IRQL". Це означає, що традиційні засоби синхронізації,
пов’язані з припиненням потоку, не можуть бути використані,
оскільки процедура планування і запуску іншого потоку має ни-
жчий пріоритет. Водночас існує небезпека виникнення події, чий
IRQL вище, ніж IRQL критичної ділянки, яка буде в цьому випа-
дку витіснена. Тому в подібних ситуаціях вдаються до прийому,
який називається "заборона переривань". У випадку Windows
цього добиваються, штучно підвищуючи IRQL критичної ділянки
до найвищого рівня, використовуваного будь-яким можливим
джерелом переривань. У результаті критична ділянка може без-
перешкодно виконати свою роботу.
На жаль, для мультипроцесорних систем подібна стратегія не
годиться. Заборона переривань на одному з процесорів не виклю-
чає переривань на іншому процесорі, який може продовжити
свою роботу і дістати доступ до критичних даних. У цьому випа-
дку потрібен спеціальний протокол установки взаємовиключення.
Основою цього протоколу є установка блокуючої змінної (змін-
ної-замка), зіставленої з кожною глобальною структурою даних,
за допомогою TSL команди. Оскільки установка замка відбува-
ється в результаті активного очікування, то кажуть, що код ядра
встановлює (захоплює) спін-блокування. Установка спін-
блокування відбувається при високих IRQL рівнях, тому код яд-
ра, який захоплює спін-блокування та утримує його для виконан-
ня критичної секції коду, ніколи не витісняється. Встановлення та
звільнення спін-блокувань здійснюється функціями ядра
KeAcquireSpinlock і KeReleaseSpinlock, які активно використову-
ються в ядрі та драйверах пристроїв. На однопроцесорних систе-
мах установка і зняття спін-блокувань реалізується простим під-
вищенням і пониженням IRQL.
Нарешті, маючи набір глобальних ресурсів, в даному випа-
дку – спін-блокувань, необхідно розв’язати проблему виникнення
потенційної безвиході (тупикової ситуації). Наприклад, потік 1
захоплює блокування 1, а потік 2 – блокування 2. Потім потік 1
намагається захопити блокування 2, а потік 2 – блокування 1. В
результаті обидва потоки ядра виснуть. Одним із розв’язків даної
проблеми є нумерація всіх ресурсів і виділення їх тільки у поряд-