Ответы на критику
- 1 year ago
- 0
- 0
IRQL ( англ. Interrupt Request Level ) — букв. «уровень запроса прерывания ». Механизм программно-аппаратной приоритизации , применяемый для синхронизации в операционных системах семейства Windows NT .
IRQL является программным атрибутом (из-за того, что не поддерживается аппаратно) процессора и указывает приоритет кода, исполняющегося на этом процессоре по отношению к прерываниям и другим асинхронным событиям. Для аппаратных прерываний в большинстве случаев IRQL реализуется аппаратно (пример: понятие приоритета прерывания в контроллере i8259A или приоритет задачи, указываемый в регистре TPR в APIC), однако код операционной системы сам может логически находиться на разных приоритетах, в таком случае дополнительные уровни IRQL реализуются программно. Например, приоритет планировщика потоков или DPC выше, чем приоритет пользовательских потоков. Если бы это было не так, тогда потоки могли бы вытеснить планировщик и тем самым «отключить» вытесняющую многозадачность , в свою очередь планировщик может быть сделан прерываемым аппаратными прерываниями. В Windows NT применяется 32 уровня IRQL (в скобках указано числовое значение):
Это означает, например, что планировщик (работающий на уровне DPC/DISPATCH) может быть прерван аппаратными прерываниями, межпроцессорными прерываниями (IPI) и т. д., но не может быть прерван асинхронными процедурами (APC) и обычными потоками, работающими на уровне PASSIVE. Межпроцессорные прерывания IPI могут быть прерваны сбоем электропитания (прерывание на уровне Power fail), но не могут быть прерваны обычными аппаратными прерываниями от устройств и т. д.
Также IRQL помогает отслеживать и выявлять логические ошибки при проектировании ОС. Легендарная ошибка с сообщением IRQL_NOT_LESS_OR_EQUAL означает следующую ситуацию: драйвер или другой привилегированный код с IRQL >= DPC/DISPATCH обратился к отсутствующей в памяти странице, требуется вызов подсистемы, подгружающей страницы с диска , однако эта подсистема в соответствии с архитектурой Windows NT имеет IRQL меньше, чем DPC/DISPATCH. Следовательно, она не имеет права прерывать тот код, который вызвал ошибку страницы. В то же время привилегированный код не может продолжить выполнение, пока страница не будет загружена. Возникает логический тупик, который, собственно, и приводит к краху ОС.
При выполнении кода с IRQL >= DPC/DISPATCH, любое состояние ожидания от ( мьютекса , семафора ), приводит к краху ОС; Когда нынешний поток входит в это состояние, планировщик потоков должен запланировать другой поток на текущем ядре процессора. Но, поскольку приоритет планировщика равен DPC/DISPATCH, он не сможет прервать работу нынешнего потока .
В Linux применяются сходные механизмы. К примеру, код обработчика прерывания может быть разделен на две «половины»: top half и bottom half, «верхняя» часть эквивалентна собственно обработчику, «нижняя» — отложенной процедуре (аналог в Windows — DPC ). Bottom-half-процедура может быть прервана Top-half-процедурой, но не наоборот. Таким образом, top-half и bottom-half логически эквивалентны уровням IRQL Device IRQL и DPC/DISPATCH, соответственно.
Техническая документация Windows NT ( библиотека MSDN ) ограничивает непрерывное время работы кода на повышенных IRQL. Для уровней аппаратных прерываний (DIRQL) ограничение составляет 10-20 мкс . Для программного уровня DISPATCH_LEVEL даются противоречивые значения в 25 и 100 мкс .
Тем не менее, эти ограничения часто нарушаются даже собственным кодом ядра и драйверов Windows, не говоря уже о драйверах сторонних производителей, создавая скрытые задержки . Это не оказывает заметного влияния на обычную работу системы, однако может сильно ухудшать работу в реальном времени - например, в потоковом мультимедиа (особенно это заметно на звуке ). Для выявления подобных нарушений разработаны программы (недоступная ссылка) (англ.) и (англ.) . Анализ работы различных версий Windows при помощи подобных программ показывает, что указанные нарушения постепенно исправляются.