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