Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

2.3.3. Реализация диспетчера объектов

Диспетчер объектов предоставляет унифицированный интерфейс для управления ресурсами системы и структурами данных, такими как открытые файлы, процессы, потоки, сегменты памяти, таймеры, устройства и семафоры. Даже более специализированные объекты (такие, как транзакции ядра, профили, маркеры безопасности и рабочие столы Win32) управляются диспетчером объектов. Объекты устройств связывают описания системы ввода-вывода (включая связь между пространством имен NT и томами файловой системы). Диспетчер конфигурации использует объект типа Key для связи с разделами реестра. Сам диспетчер объектов имеет такие объекты, которые он использует для управления пространством имен NT и реализации объектов при помощи обычных средств. Это каталоги, символические ссылки, а также объекты «объект — тип».

Обеспечиваемое диспетчером объектов единообразие имеет различные аспекты. Все эти объекты используют один и тот же механизм для создания, уничтожения и учета в системе квот. Ко всем этим объектам можно обращаться из процессов пользовательского режима при помощи описателей. Существует унифицированное соглашение для управления указателями, ссылающимися на объекты из ядра. Объектам можно давать имена в пространстве имен NT (которое управляется диспетчером объектов). Объекты диспетчеризации (которые начинаются с обычной структуры данных для сигнализации событий) могут использовать обычные интерфейсы синхронизации и уведомления (вроде WaitForMultipleObjects). Существует обычная система безопасности с использованием списков управления доступом (ACL), обязательная для открываемых по имени объектов, а также проверки доступа при каждом использовании описателя. Есть даже средства (для трассировки использования объектов) для помощи разработчикам режима ядра при отладке программ.

Следствием того факта, что объекты являются всего лишь структурами данных ядра, является то, что при перезагрузке (или сбое) системы все объекты теряются. Когда система загружается, в ней совсем нет объектов (даже дескрипторов типов объектов). Все типы объектов (и сами объекты) должны создаваться динамически другими компонентами исполнительного уровня (путем вызова предоставляемых диспетчером объектов интерфейсов). После создания объектов и указания имени на них можно ссылаться через пространство имен NT.

Рис

Рис. 2.7. Структура исполнительного объекта,
управляемого диспетчером объектов

Объекты имеют структуру (рис. 2.7). Каждый объект содержит заголовок с определенной информацией, общей для всех объектов всех типов. Поля этого заголовка включают имя объекта, каталог объекта (в котором он находится в пространстве имен NT), а также указатель на дескриптор безопасности, представляющий список управления доступом (ACL) для объекта.

Выделенная для объектов память берется из одной из двух куч (или пулов) памяти, поддерживаемых исполнительным уровнем. Это служебные функции (типа malloc) исполнительного уровня, которые позволяют компонентам режима ядра выделять либо страничную память ядра, либо беcстраничную память ядра. Бесстраничная память требуется для любой структуры данных или объекта режима ядра, к которому необходимо обратиться с уровня приоритета процессора номер 2 (или более высокого).

Большая часть выделений памяти диспетчером кучи ядра производится при помощи справочных списков, которые содержат списки (типа LIFO — стек) выделенных блоков одинакового размера. Эти списки оптимизируются для операций без блокировок, что улучшает производительность и масштабируемость системы.

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

Во избежание преждевременного освобождения объектов вследствие состояния гонки диспетчер объектов реализует механизм подсчета ссылок, а также концепцию указателя, на который сделана ссылка (referenced pointers). Такой указатель нужен для доступа к объекту тогда, когда этот объект подвергается опасности удаления. В зависимости от соглашений относительно конкретных типов объектов существуют только определенные моменты времени, когда объект может быть удален другим потоком.

Предыдущий раздел Оглавление Следующий раздел