Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы_ОСиСП.docx
Скачиваний:
55
Добавлен:
20.04.2019
Размер:
623.57 Кб
Скачать

32. Понятие рабочего элемента ядра (Work Item). Назначение рабочих элементов.

Рабочие элементы описываются структурой WORK_QUEUE_ITEM, начиная с windows 2000 – IO_WORK_ITEM.

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

33. Пулы памяти. Пул подкачиваемой памяти, пул неподкачиваемой памяти, пул сессии, особый пул. Тегирование пулов. Структура данных пула.

При инициализации системы диспетчер памяти создает два типа динамических пулов памяти, используемых компонентами режима ядра для выделения системной памяти.

nonpaged pool — пул неподкачиваемой памяти ~ пул памяти, состоящий из диапазонов системных виртуальных адресов, которые всегда находятся в физической памяти и поэтому доступны из любого адресного пространства без обращения к механизму подкачки. Такой пул создается при инициализации системы и используется компонентами режима ядра для выделения системной памяти.

paged pool — пул подкачиваемой памяти ~ регион виртуальной памяти в системном пространстве, который может подгружаться в рабочий набор системного процесса и выгружаться из него. Пул подкачиваемой памяти создается при инициализации системы и используется компонентами режима ядра для выделения системной памяти. В однопроцессорных системах таких пулов два, а в многопроцессорных — четыре.

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

Special Pool (Особый пул) Этот параметр заставляет функции, отвечающие за выделение памяти из пулов, окружать выделяемый блок недействительными страницами, чтобы ссылки за пределы этого блока вызывали нарушение доступа в режиме ядра и последующий крах системы. А это позволяет тут же указать пальцем на сбойный драйвер. Параметр Special Pool также заставляет проводить дополнительные проверки, когда драйвер выделяет или освобождает память. При включении параметра Special Pool функции пулов выделяют в памяти ядра регион для Driver Verifier, и последний перенаправляет запросы проверяемого драйвера на выделение памяти в особый пул, а не в стандартные пулы. При выделении драйвером памяти из особого пула Driver Verifier округляет размер выделяемого блока до размера, кратного размеру страницы.

Поскольку Driver Verifier окружает выделенный блок недействительными страницами, при попытке записи или чтения за пределами этого блока драйвер попадает на недействительную страницу, и диспетчер памяти сообщает о нарушении доступа в режиме ядра.

34. Оптимизация использования оперативной памяти с помощью списков предыстории (look-aside lists).

Windows поддерживает механизм быстрого выделения памяти — ассоциативные списки (look-aside lists). Главное различие между пулом и ассоциативным списком в том, что из пула можно выделять блоки памяти различного размера, а из ассоциативного списка — только фиксированные. Хотя пулы обеспечивают более высокую гибкость, ассоциативные списки работают быстрее, так как не используют спин-блокировку и не заставляют систему подбирать подходящую область свободной памяти, в которой мог бы уместиться текущий выделяемый блок.

Функции ExInitializeNPagedLookasideList и ExInitializePagedLookasideList (документированные в DDK) позволяют компонентам исполнительной системы и драйверам устройств создавать ассоциативные списки, размеры которых кратны размерам наиболее часто используемых структур данных.

Если ассоциативный список пуст (как это бывает сразу после его создания), система должна выделить память из подкачиваемого или не подкачиваемого пула. Но если в списке уже присутствует освобожденная структура, то занимаемая ею память выделяется очень быстро. (Список разрастается по мере возврата в него структур.) Процедуры выделения памяти из пула автоматически настраивают число освобожденных буферов, хранящихся в ассоциативном списке, в зависимости от частоты выделения памяти из этого списка драйвером или компонентом исполнительной системы. Чем чаще они выделяют память из списка, тем больше буферов в списке. Размер ассоциативных списков автоматически уменьшается, если память из них не выделяется. (Эта проверка выполняется раз в секунду, когда системный поток диспетчера настройки баланса пробуждается и вызывает функцию KiAdjustLookasideDepth.)