Всегда предваряемое и всегда прерываемое

Цель предварительной, прерванной структуры операционной системы заключается в повышении производительности системы. Любой поток может быть прерван потоком с более высоким приоритетом, и любая подпрограмма службы прерываний драйвера (ISR) может быть прервана подпрограммой, которая выполняется на более высоком уровне запроса прерывания (IRQL).

Компонент ядра определяет, когда выполняется последовательность кода в соответствии с одним из следующих критериев приоритета:

  • Определяемая ядром схема приоритета времени выполнения для потоков.

    Каждый поток в системе имеет связанный атрибут приоритета. Как правило, большинство потоков имеют атрибуты приоритета переменной : они всегда являются предопределенными и планируются выполнять циклический перебор со всеми другими потоками, которые в настоящее время находятся на одном уровне приоритета. Некоторые потоки имеют атрибуты приоритета в режиме реального времени: эти времязависимые потоки выполняются до завершения, если они не прерваны потоком с более высоким атрибутом приоритета в режиме реального времени. Архитектура Microsoft Windows не предоставляет по сути систему в режиме реального времени.

    Независимо от атрибута приоритета любой поток в системе может быть прерван при прерываниях оборудования и определенных типах прерываний программного обеспечения.

  • Определяемый ядром уровень запроса прерывания (IRQL), которому назначается определенный вектор прерываний на данной платформе.

    Ядро приоритизирует аппаратные и программные прерывания так, чтобы некоторый код в режиме ядра, включая большинство драйверов, выполняется на более высоких IRQL, что даёт ему более высокий приоритет планирования по сравнению с другими потоками в системе. Определённый IRQL, на котором выполняется код драйвера в режиме ядра, определяется аппаратным приоритетом устройства, на котором он работает.

    Код в режиме ядра всегда прерывается: прерывание с более высоким значением IRQL может происходить в любое время, что приводит к тому, что другой фрагмент кода в режиме ядра, имеющий более высокий назначаемый системой IRQL, будет выполняться немедленно на этом процессоре. Однако если фрагмент кода выполняется в заданном IRQL, ядро маскирует все векторы прерываний с меньшим или равным значением IRQL на процессоре.

Самый низкий уровень IRQL называется PASSIVE_LEVEL. На этом уровне не маскируются векторы прерываний. Потоки обычно работают на уровне IRQL=PASSIVE_LEVEL. Следующие более высокие уровни IRQL предназначены для программных прерываний. Эти уровни включают APC_LEVEL, DISPATCH_LEVEL или для отладки ядра WAKE_LEVEL. Прерывания устройств по-прежнему имеют более высокие значения уровня IRQL. Ядро резервирует самые высокие значения IRQL для критически важных системных прерываний, таких как прерывания системных часов или шины из-за ошибок.

Некоторые поддерживающие процедуры системы выполняются на IRQL=PASSIVE_LEVEL, так как реализуются как страничный код или имеют доступ к страничным данным, или потому что некоторые компоненты режима ядра создают собственные потоки.

Аналогичным образом, некоторые стандартные подпрограммы драйверов обычно выполняются на уровне IRQL=PASSIVE_LEVEL. Однако несколько стандартных рутин драйвера выполняются либо на IRQL=DISPATCH_LEVEL, либо для драйвера низкого уровня на уровне устройства IRQL (также называемого DIRQL). Дополнительные сведения об IRQLs см. в разделе "Управление приоритетами оборудования".

Каждая подпрограмма в драйвере может быть прервана. Сюда входит любая подпрограмма, выполняющаяся на более высоком уровне IRQL, чем PASSIVE_LEVEL. Любая подпрограмма, выполняемая на определенном IRQL, сохраняет контроль над процессором только в том случае, если во время выполнения этой подпрограммы не происходит прерывания на более высоком уровне IRQL.

В отличие от драйверов в некоторых старых операционных системах персональных компьютеров, ISR драйвера Microsoft Windows никогда не представляет собой большую сложную процедуру, которая используется для обработки большей части ввода-вывода драйвера. Это связано с тем, что любая подпрограмма службы прерываний драйвера (ISR) может быть прервана другой подпрограммой (например, ISR другого драйвера), которая работает на более высоком уровне IRQL. Таким образом, ISR драйвера не обязательно сохраняет непрерывный контроль над ЦП на протяжении всего пути выполнения, от начала до конца.

В драйверах Windows ISR обычно сохраняет сведения о состоянии оборудования, ставит в очередь отложенный вызов процедуры (DPC), а затем быстро завершает работу. Позже система отменяет DPC драйвера, чтобы драйвер смог завершить операции ввода-вывода на более низком уровне IRQL (DISPATCH_LEVEL). Для хорошей общей производительности системы все подпрограммы, выполняемые на высоких уровнях IRQL, должны быстро передать управление процессором.

В Windows все потоки имеют контекст потока. Этот контекст состоит из сведений, определяющих процесс, принадлежащий потоку, а также другие характеристики, такие как права доступа потока.

Как правило, в контексте потока, запрашивающего текущую операцию ввода-вывода драйвера, вызывается только драйвер высокого уровня. Драйвер промежуточного или низкого уровня никогда не может предположить, что он выполняется в контексте потока, запрашивающего текущую операцию ввода-вывода.

Следовательно, подпрограммы драйверов обычно выполняются в произвольном контексте потока — контекст любого потока в текущий момент, когда вызывается стандартная подпрограмма драйвера. По соображениям производительности (чтобы избежать переключений контекста), очень мало драйверов настроили собственные потоки.