Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы и ответы к экзамену.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.25 Mб
Скачать

Синхронизация при низком irql

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

  • требуется непродолжительное обращение к защищенным ресурсам без сложного взаимодействия с другим кодом;

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

Эти противоречащие друг другу ограничения нельзя соблюсти одновременно ни при каких обстоятельствах. Более того, кроме взаимоисключения, исполнительная система должна выполнять и другие алгоритмы синхронизации, а также предоставлять механизмы синхронизации пользовательскому режиму. Существует несколько дополнительных механизмов синхронизации, применяемых, когда спин-блокировки не годятся:

  • объекты диспетчера ядра (kernel dispatcher objects);

  • быстрые мьютексы (fast mutexes) и защищенные мьютексы (guarded mu-texes);

  • блокировки с заталкиванием указателя (push locks);

  • ресурсы исполнительной системы (executive resources).

Механизмы синхронизации режима ядра

Объекты ядра предоставляют куда больше возможностей, чем механизмы синхронизации в пользовательском режиме. Тем не менее, у них есть один существенный недостаток — меньшее быстродействие. Дело в том, что при вызове любой из функций, использующей объект ядра, поток должен перейти из пользовательского режима в режим ядра. А такой переход обходится очень дорого — в тысячи процессорных тактов на платформе x86. К этому нужно прибавить еще и время, которое необходимо на выполнение кода этих функций в режиме ядра. Объект ядра «процесс» пребывает в занятом состоянии, пока выполняется сопоставленный с ним процесс, и переходит в свободное состояние, когда процесс завершается. Внутри этого объекта поддерживается булева переменная, которая при создании объекта инициализируется как FALSE («занято»). По окончании работы процесса операционная система меняет значение этой переменной на TRUE, сообщая тем самым, что объект свободен. Следующие объекты ядра бывают в свободном или занятом состоянии:

  • процессы

  • потоки

  • задания

  • файлы

  • консольный ввод

  • уведомления об изменении файлов

  • события

  • ожидаемые таймеры

  • семафоры

  • мьютексы

Потоки могут засыпать и в таком состоянии ждать освобождения какого-либо объекта. Правила, по которым объект переходит в свободное или занятое состояние, зависят от типа этого объекта.