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

2.3.1.3. Отложенные вызовы процедур (DPC)

Объекты отложенного вызова процедур (Deferred Procedure Call (DPC)) используются для того, что уменьшить время выполнения процедуры обслуживания прерываний, запускаемой по возникновению прерывания от некоторого устройства. Ограничением времени, которое затрачивается на процедуры обслуживания прерываний (Interrupt Service Routines (ISR)), можно добиться сокращения шансов утраты прерывания.

Прерывания получают аппаратный уровень приоритета от оборудования системы. Уровень приоритета выполняемой работы также учитывается центральным процессором. Процессор может переключиться на обработку прерываний, чей приоритет выше используемых процессором в данный момент. Нормальный уровень приоритета (в том числе и для пользовательского режима) — это приоритет со значением 0. Прерывания устройств обычно имеют приоритет 3 или выше, а ISR, которая используется для обработки прерывания устройства, обычно имеет то же значение приоритета, что и прерывание. Делается это для того, чтобы менее важные прерывания не мешали обработке более важного прерывания.

Слишком долгое выполнение ISR может привести к потере данных или замедлению ввода-вывода системы из-за того, что обслуживание прерываний, имеющих более низкий приоритет, будет отложено. Для того, чтобы уменьшить время обработки ISR, выполняются только критические операции (например, такие как повторная инициализация устройства или запись результатов операций ввода-вывода). Затем обработка прерывания приостанавливается до тех пор, пока не будет снижен уровень приоритета процессора и обслуживание других прерываний не перестанет им блокироваться. Для представления работы, которая подлежит выполнению, используется объект DPC, а для добавления DPC в список DPC конкретного процессора ISR совершает вызов уровня ядра Если данный DPC окажется первым в списке, то ядро выполняет специальный аппаратный запрос, осуществляющий прерывание процессора с уровнем 2. По завершению последней ISR уровень приоритета прерывания процессора опускается ниже 2, что вызывает разблокирование прерывания для обработки DPC. ISR для прерывания DPC будет обрабатывать каждый из объектов DPC, находящихся в очереди.

Примером осуществления описанного выше алгоритма в системе Windows является клавиатура. Клавиатурная процедура обработки прерывания после нажатия клавиши прочитает из регистра код клавиши, после чего снова разрешает прерывание клавиатуры, но не обрабатывает прерывание клавиши немедленно. Клавиатурная IRC использует DPC, чтобы поставить обработку кода клавиши в очередь.

Так как DPC работают с уровнем приоритета равным 2, они не мешают выполнению ISR, но являются преградой для выполнения любого потока до тех пор, пока очередь обрабатываемых DPC не опустеет и уровень приоритета процессора не опустится ниже 2. Обработка ISR и DPC может вызвать сбои в работе, например, аудио или видеопроцессов, или сделать систему медлительной. Другим частым случаем использования DPC является выполнение процедур по прерыванию таймера. Чтобы избежать блокирования потоков, события таймера, выполняющиеся продолжительное время, должны ставить в очередь запросы к пулу рабочих потоков, поддерживаемому ядром для фоновой работы.

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