系统为每个处理器提供一个 DPC 队列。 驱动程序可以控制系统向哪个队列分配 DPC、队列中 DPC 的位置以及处理队列的时间。
分配给特定处理器队列的 DPC 在该处理器上运行。 默认情况下,当驱动程序调用 KeInsertQueueDpc 或 IoRequestDpc 时,DPC 在当前活动处理器上排队。 驱动程序可以通过在调用 KeInsertQueueDpc 或 IoRequestDpc 之前调用 KeSetTargetProcessorDpc 来指定处理器队列。
在 Windows Vista 和更高版本的 Windows 上,系统还为每个处理器具有一个线程 DPC 队列。 驱动程序可以使用 KeSetTargetProcessorDpc 指定线程 DPC 的处理器队列。
KeSetImportanceDpc 例程控制在队列中放置 DPC 的位置。 通常,DPC 放置在队列的末尾;但是,如果驱动程序首先调用 KeSetImportanceDpc ,其 Importance 参数等于 HighImportance,则 DPC 将放置在队列的开头。
对于普通(非线程) DPC,KeSetImportanceDpc 还确定 KeInsertQueueDpc 还是 IoRequestDpc 将立即开始处理 DPC 队列。 以下列表描述了处理队列的规则:
如果为当前处理器分配了 DPC 且 Importance 不等于 LowImportance,或者重要性等于 LowImportance 并且当前处理器的 DPC 队列深度超过系统定义的限制或 DPC 请求速率低于系统定义的最小值,则立即开始处理 DPC 队列。 否则,将延迟处理 DPC,直到满足适当的队列深度和速率要求。
如果将 DPC 分配给与当前处理器不同的处理器,并且 Importance 等于 MediumHighImportance 或 HighImportance,或者目标处理器的 DPC 队列深度超出系统定义的限制,则 DPC 队列的处理将立即在目标处理器上开始。 否则,将延迟处理 DPC,直到满足适当的队列深度和速率要求。