Семафори і переривання
Більшість сучасних ОС надають сервіси, що дозволяють без шкоди для останньої
системи припинити і відновити виконання призначеної для користувача
нитки. Проте мало яка ОС надає такий же сервіс для обробників
переривань. Тому якщо ОС і вирішує використання примітивів синхронізації
з переривань, то завжди при умові, що таке використання не може
наводити до блокування обробника.
Наприклад,
якщо для синхронізації
використовується мутекс, обробник переривання не може його встановлювати,
а може лише знімати. Ця вимога накладає певні обмеження на стиль
використання семафорів. Якщо при синхронізації рівноправних ниток кожна з
них встановлює семафор на початку критичної секції і знімає його
в кінці, використовуючи його і для того, що взаємовиключає, і для синхронізації,
то при взаємодії нитки з обробником переривання для реалізації
того, що взаємовиключає доводиться використовувати заборону переривань,
а мутекс — лише для синхронізації.
Стандартна техніка використання мутекса в обробнику
переривання полягає в наступному (порядок операцій важливий!): процес
захоплює мутекс, ініціює операцію на пристрої, яка повинна завершитися
перериванням, і захоплює мутекс ще раз. Якщо до цього моменту переривання
вже сталося, мутекс буде вільний і процес нічого не чекатиме. Якщо ж
переривання ще не відбувалося, процес засне, чекаючи його. Обробник же
переривання лише знімає мутекс.
|