Диспетчеризация и приоретизация прерываний
ОС не может терять контроль за ходом выполнения системных процедур, вызываемых по прерываниям. Она должна упорядочивать их во времени так же, как планировщик упорядочивает многочисленные пользовательские потоки.
Сам планировщик потоков является системной процедурой, вызываемой по прерыванию. Поэтому правильное планирование процедур, вызываемых по прерываниям, является необходимым условием правильного планирования пользовательских потоков.
Для упорядочивания работы обработчиков прерываний в ОС применяется механизм приоритетных очередей. Все источники прерываний делятся на несколько классов, каждому из которых присваивается приоритет.
В ОС выделяется программный модуль, который занимается диспетчеризацией обработчиков прерываний.
При возникновении прерывания, диспетчер прерывания вызывается первым. Он запрещает ненадолго все прерывания, а затем выясняет причину прерывания. После этого диспетчер сравнивает назначенный данному источнику прерывания приоритет с текущим приоритетом потока команд, выполняемого процессором. В этот момент времени процессор уже может выполнять инструкции другого обработчика прерываний.
Если приоритет нового запроса выше текущего, то выполнение текущего обработчика приостанавливается и он помещается в соответствующую очередь обработчиков прерываний. В противном случае, в очередь помещается обработчик нового запроса. Приоритет обработчиков прерываний в общем случае не совпадает с приоритетом потоков, выполняемых в обычной последовательности, определяемой планировщиком потоков.
По отношению к обработчикам прерываний любой поток, который назначен на выполнение планировщиком, имеет низкий приоритет, так что любой запрос на прерывание всегда может прервать выполнение этого потока.
Диспетчер прерываний в Windows NT работает с программной моделью прерываний, единой для всех аппаратных платформ. Все источники прерываний делятся на несколько классов, и каждому классу присваивается уровень запросов прерывания IRQL. Этот уровень представляет приоритет данного класса.
ОС программным способом поддерживает внутреннюю переменную выполняемого процессором кода, которая по назначению соответствует уровню привилегий процессора. Запрос на прерывание принимается диспетчером прерываний всегда независимо от текущего уровня IRQL. Но диспетчер прерываний не передает его на обработку соответствующей процедуре, а помещает в программную очередь запросов, если в данный момент выполняется более приоритетная процедура обработки прерываний.
ОС имеет полный контроль над ситуацией, не позволяя контроллерам устройств ввода-вывода принимать решения о ходе вычислительного процесса.
Таблица прерываний Windows NT
Уровни IRQL |
высший приоритет (ошибка шины) питание межпроцессорное прерывание таймер |
устройство n … устройство 1 |
диспетчерский (DPC) (от ОС) |
APC уровень системных вызовов от приложений |
низший (само приложение) |
|
|||
|
|||
Основные виды ресурсов
Реентирабельные – при прерывании модуля, его состояние сохраняется для последующего восстановления.
Повторно используемые – модуль делиться на секции, которые выполняются в привилегированном режиме.