Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
195
Добавлен:
20.02.2016
Размер:
135.68 Кб
Скачать

[13.2] Отложенные вызовы процедур (Deferred Procedure Call – dpc)

Вызовы DPC – «рабочие лошадки» обработки прерываний NT. NT передает DPC тем же образом, что и прерывания – в объектах. Драйверы устройств обычно инициализируют объект DPC в момент подключения к прерыванию. Информация, которую должен указать драйвер, включает адрес его функции DPC, процессор, на котором должна исполняться функция DPC, и приоритет DPC. По умолчанию DPC всегда исполняется на том же процессоре, на котором исполняется ISR, однако, разработчик драйвера устройства может переопределить это присваивание. Кроме того, для функций DPC по умолчанию назначается средний приоритет (при возможных низком, среднем и высоком), однако разработчик драйвера устройства также может контролировать приоритет.

Когда функция ISR запрашивает DPC, NT помещает указанный объект DPC в очереди DPC целевого процессора. Если DPC имеет низкий или средний приоритет, NT помещает объект DPC в конец очереди; если DPC имеет высокий приоритет, NT вставляет объект DPC в начало очереди. Когда уровень IRQL процессора готов понизиться с уровня Dispatch Level к более низкому IRQL (APC Level или Passive Level), NT убирает объект DPC из очереди DPC. NT гарантирует, что IRQL остается на уровне Dispatch Level и вытаскивает объекты DPC из очереди вплоть до ее освобождения (т.е. NT опорожняет очередь), вызывая каждую функцию DPC по очереди. Только когда очередь пуста, NT позволит уровню IRQL понизиться ниже уровня Dispatch Level и позволит продолжить исполнение обычным потокам.

Приоритеты DPC могут оказывать влияние на поведение системы другим способом. NT обычно приступает к опорожнению очереди DPC с программного прерывания, чей уровень IRQL - Dispatch Level. NT генерирует такое прерывание только если DPC направлено на процессор, на котором запрошена функция ISR, и DPC имеет высокий или средний приоритет. Если DPC имеет низкий приоритет, DPC запрашивает прерывание только если число невыполненных запросов DPC для процессора поднимается выше порогового значения, или число DPC, запрошенных на процессоре за интервал времени, мало. Если DPC направлен на CPU, отличный от того, на котором выполняется ISR, и DPC имеет высокий приоритет, NT немедленно сигнализирует целевому CPU очищать его очередь DPC. Если приоритет средний или низкий, число DPC, помещенных в очередь целевого процессора должно превысить пороговое значение. Системный поток idle также освобождает очередь DPC. В таблице 1 перечислены ситуации, инициирующие освобождение очереди DPC.

Таблица 1. Ситуации, инициирующие очистку очереди DPC

Приоритет DPC

DPC выполняются на том же процессоре, что и ISR

DPC выполняются на другом процессоре

Низкий

Размер очереди DPC превышает максимум, частота появления запросов DPC меньше минимальной, или система простаивает

Размер очереди DPC превышает максимум или система простаивает (выполняется поток idle)

Средний

Всегда

Размер очереди DPC превышает максимум или система простаивает (выполняется поток idle)

Высокий

Всегда

Всегда

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

Рисунок 2

Лекция №12. Рабочие потоки (Worker Threads и Work Queue) 1

[12.1] Необходимость в создании рабочих потоков 1

[12.2] Системные рабочие потоки (System Worker Thread WorkItems) 1

[12.3] Создание потоков драйвером 3

[12.4] Потоки как диспетчерские объекты 3

[13] Введение в обработку прерываний 6

[13.1] Объекты – прерывания 6

[13.2] Отложенные вызовы процедур (Deferred Procedure Call – DPC) 8

11

Соседние файлы в папке Лабы по драйверам