DPC 队列的组织
系统为每个处理器提供一个 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,或者 Importance 等于 LowImportance 且当前处理器的 DPC 队列深度超过系统定义的限制,或者 DPC 请求速率低于系统定义的最小值,则立即开始处理 DPC 队列。 否则,DPC 的处理将延迟到满足相应的队列深度和速率要求。
如果 DPC 分配给与当前处理器不同的处理器,并且 Importance 等于 MediumHighImportance 或 HighImportance,或者目标处理器的 DPC 队列深度超过系统定义的限制,则 DPC 队列的处理将立即在目标处理器上开始。 否则,DPC 的处理将延迟到满足相应的队列深度和速率要求。