Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Операционная система на основе Microsoft Windows NT предназначена для равномерного выполнения на платформах юнипроцессора и симметричного многопроцессора (SMP), а драйверы в режиме ядра должны быть разработаны так же.
В любой многопроцессорной платформе Windows существуют следующие условия:
Все ЦП идентичны, и все или ни один из процессоров не должны иметь одинаковые сопроцессоры.
Все ЦП совместно используют память и имеют универсальный доступ к памяти.
На симметричной платформе каждый ЦП может получать доступ к памяти, принимать прерывания и получать доступ к регистрам управления ввода-вывода. (В отличие от этого, в асимметричной многопроцессорной машине один ЦП принимает все прерывания для набора подчинённых ЦП.)
Чтобы безопасно работать на платформе SMP, операционная система должна гарантировать, что код, который выполняется на одном процессоре, одновременно не обращается к данным, к которым обращается и изменяет другой процессор. Например, если ISR драйвера низкого уровня обрабатывает прерывание устройства на одном процессоре, он должен иметь эксклюзивный доступ к регистрам устройств или критически важным данным, определяемым драйвером, в случае прерывания устройства одновременно на другом процессоре.
Кроме того, операции ввода-вывода драйверов, сериализованные на однопроцессорной машине, могут перекрываться в системе SMP. То есть подпрограмма драйвера, обрабатывающая входящие запросы ввода-вывода, может выполняться на одном процессоре, а другая подпрограмма, которая взаимодействует с устройством одновременно на другом процессоре. Независимо от того, выполняются ли драйверы в режиме ядра на однопроцессорном или симметричном многопроцессорном компьютере, они должны синхронизировать доступ к любым данным, определенным драйвером или системным ресурсам, которые совместно используются в подпрограммах драйверов, и синхронизировать доступ к физическому устройству, если таковые имеются.
Компонент ядра Windows NT экспортирует механизм синхронизации, называемый спин-блокировкой, который драйверы могут использовать для защиты общих данных (или регистров устройств) от одновременного доступа к одной или нескольким подпрограммам, которые выполняются параллельно на симметричной многопроцессорной платформе. Ядро применяет две политики в отношении использования спин-блокировок:
Только одна рутина может держать определённый спинлок в любой момент времени. Перед доступом к общим данным каждая подпрограмма, которая должна ссылаться на данные, должна сначала попытаться получить спиновую блокировку данных. Чтобы получить доступ к тем же данным, другой процесс должен получить спинлок, но спинлок не может быть получен до тех пор, пока текущий владелец его не отпустит.
Ядро назначает значение IRQL каждой блокировке спина в системе. Подпрограмма режима ядра может получить определенную спин-блокировку, только если она выполняется на назначенном для этой блокировки уровне IRQL.
Эти политики предотвращают прерывание выполнения подпрограммы драйвера, которая обычно работает при более низком уровне IRQL, но в данный момент удерживает спин-блокировку, более приоритетной подпрограммой драйвера, пытающейся получить ту же спин-блокировку. Таким образом, взаимоблокировка избегается.
IRQL, назначенный спин-блокировке, обычно соответствует уровню наиболее приоритетной процедуры IRQL, которая может захватывать спин-блокировку.
Например, ISR драйвера самого низшего уровня часто разделяет область состояния с подпрограммой DPC этого же драйвера. Процедура DPC вызывает предоставленную драйвером процедуру критического раздела для доступа к общей области. Спиновая блокировка, которая защищает общую область, имеет IRQL, равный DIRQL, на котором устройство прерывает работу. Если подпрограмма критического раздела удерживает спин-блокировку и обращается к общей области на уровне DIRQL, ISR не выполняется ни на компьютере с юнипроцессором, ни на компьютере с многопроцессорной (SMP) архитектурой.
Не удается запустить ISR на компьютере с однопроцессором, так как прерывание устройства маскируется, как описано в разделе Always Preemptible и Always Interruptible.
На SMP машине ISR не может получить spinlock, который защищает общие данные, в то время как критическая секция удерживает spinlock и осуществляет доступ к общим данным на DIRQL.
Набор потоков в режиме ядра может синхронизировать доступ к общим данным или ресурсам, ожидая одного из объектов диспетчера ядра: события, мьютекса, семафора, таймера или другого потока. Однако большинство драйверов не настраивают собственные потоки, так как им удается достичь лучшей производительности, избегая переключения контекста потоков. Всякий раз, когда критически важные подпрограммы и драйверы режима ядра выполняются на уровнях IRQL = DISPATCH_LEVEL или DIRQL, они должны использовать спинлоки ядра для синхронизации доступа к общим данным или ресурсам.
Дополнительные сведения см. в разделе "Блокировки спинов", "Управление приоритетами оборудования" и "Объекты диспетчера ядра".