WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

DPC (англ. Deferred procedure call — отложенный вызов процедуры) — специфический механизм вызова процедур в архитектуре Windows.

Суть DPC

При возникновении прерывания управление передаётся обработчику прерывания. Существует ряд факторов, ограничивающих возможности кода обработчика прерывания:

  • Общей практикой является требование минимизации времени работы обработчика прерывания. Поэтому необходимо воздержаться от выполнения ресурсоёмких и долгих действий непосредственно внутри обработчика прерывания.
  • В Windows код обработчика прерывания выполняется на низком IRQL, что сильно ограничивает набор доступных обработчику ядерных функций: многие функции требуют гораздо более высокого IRQL для своего вызова.

Решением этой проблемы является подход, при котором непосредственно в обработчике выполняются лишь самые критические операции, а остальные действия откладываются до тех пор, пока не появится относительно свободное процессорное время, а IRQL не опустится до допустимого значения (DISPATCH_LEVEL). Тогда эти действия будут выполнены в рамках вызова отложенной (её выполнение было отложено до этого момента) процедуры.

В отличие от обычного вызова процедуры, при котором, фактически, управление сразу же передаётся коду вызываемой процедуры, при DPC-вызове передачи управления вызываемой процедуре не происходит — вместо этого адрес вызываемой процедуры и параметры помещаются в специальную очередь[1], называемую DPC Queue. Когда наступает «благоприятное» время, отложенная процедура вызывается по-настоящему.

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

Управление DPC

  • Для того, чтобы осуществлять отложенные вызовы, необходимо сперва создать объект DPC при помощи функции ядра KeInitializeDpc.
  • Созданному объекту DPC можно изменить приоритет при помощи функци KeSetImportanceDpc, а также переназначить логический процессор, в очередь которого будет помещён отложенный вызов, с помощью KeSetTargetProcessorDpc.
  • Постановка DPC в очередь осуществляется вызовом функции ядра KeInsertQueueDpc.
  • Помещённый в очередь DPC можно убрать из очереди вызовом функции KeRemoveQueueDpc.

Поскольку механизм DPC используется главным образом в рамках обработки запросов ввода-вывода, существуют специальные функции-обёртки с префиксом Io для управления отложенными вызовами. В частности, обработчики прерываний, согласно документации, должны использовать именно эти функции.

Примечания

  1. В многопроцессорных системах каждый процессор имеет свою отдельную очередь отложенных вызовов. Так что каждый отложенный вызов ассоциирован с определённым процессором.

См. также

Литература

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии