Синхронизация ядра при высоком IRQL
Ядро должно гарантировать, что в каждый момент только один процессор выполняет код в критической секции. Критическими секциями ядра являются разделы кода, модифицирующие глобальные структуры данных, например базу данных диспетчера ядра или его очередь DPC Операционная система не смогла бы корректно работать, если бы ядро не гарантировало взаимоисключающий доступ потоков к этим структурам данных.
Синхронизация при низком IRQL Компоненты исполнительной системы вне ядра также нуждаются в синхронизации доступа к глобальным структурам данных в многопроцессорной среде. Например, у диспетчера памяти есть только одна база данных блоков страниц. Обращение к ней осуществляется как к глобальной структуре данных, и драйверам устройств необходима гарантия получения монопольного доступа к своим устройствам. Вызывая функции ядра, исполнительная система может создать спин-блокировку, установить ее и снять. · требуется непродолжительное обращение к защищенным ресурсам без сложного взаимодействия с другим кодом; · код критической секции нельзя выгрузить в страничный файл, он не ссылается на данные в подкачиваемой памяти, не вызывает внешние процедуры (включая системные сервисы) и не генерирует прерывания или исключения. Эти противоречащие друг другу ограничения нельзя соблюсти одновременно ни при каких обстоятельствах. Более того, кроме взаимоисключения, исполнительная система должна выполнять и другие алгоритмы синхронизации, а также предоставлять механизмы синхронизации пользовательскому режиму. · объекты диспетчера ядра (kernel dispatcher objects); · быстрые мьютексы (fast mutexes) и защищенные мьютексы (guarded mu-texes); · блокировки с заталкиванием указателя (push locks); · ресурсы исполнительной системы (executive resources).
Механизмы синхронизации режима ядра Объекты ядра предоставляют куда больше возможностей, чем механизмы синхронизации в пользовательском режиме. Тем не менее, у них есть один существенный недостаток — меньшее быстродействие. Дело в том, что при вызове любой из функций, использующей объект ядра, поток должен перейти из пользовательского режима в режим ядра. А такой переход обходится очень дорого — в тысячи процессорных тактов на платформе x86. К этому нужно прибавить еще и время, которое необходимо на выполнение кода этих функций в режиме ядра. Объект ядра «процесс» пребывает в занятом состоянии, пока выполняется сопоставленный с ним процесс, и переходит в свободное состояние, когда процесс завершается. Внутри этого объекта поддерживается булева переменная, которая при создании объекта инициализируется как FALSE («занято»). По окончании работы процесса операционная система меняет значение этой переменной на TRUE, сообщая тем самым, что объект свободен. Следующие объекты ядра бывают в свободном или занятом состоянии: · процессы · потоки · задания · файлы · консольный ввод · уведомления об изменении файлов · события · ожидаемые таймеры · семафоры · мьютексы Потоки могут засыпать и в таком состоянии ждать освобождения какого-либо объекта. Правила, по которым объект переходит в свободное или занятое состояние, зависят от типа этого объекта.
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Почему стероиды повышают давление?: Основных причин три... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (710)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |