DPC 队列的组织

系统为每个处理器提供一个 DPC 队列。 驱动程序可以控制系统将 DPC 分配到哪个队列、DPC 在队列中的位置以及队列的处理时间。

分配给特定处理器队列的 DPC 在该处理器上运行。 默认情况下,当驱动程序调用 KeInsertQueueDpcIoRequestDpc 时,DPC 在当前活动的处理器上排队。 驱动程序可以通过在调用 KeInsertQueueDpcIoRequestDpc 之前调用 KeSetTargetProcessorDpc 来指定处理器队列。

在 Windows Vista 和更高版本的 Windows 上,系统还为每个处理器提供一个线程 DPC 队列。 驱动程序可以使用 KeSetTargetProcessorDpc 为线程 DPC 指定处理器队列。

KeSetImportanceDpc 例程控制 DPC 在队列中的放置位置。 通常,DPC 放置在队列的末尾;但如果驱动程序首先调用 KeSetImportanceDpcImportance 参数等于 HighImportance,则 DPC 将放置在队列的开头。

对于普通 (非线程) DPC, KeSetImportanceDpc 还会确定 KeInsertQueueDpc 还是 IoRequestDpc 将立即开始处理 DPC 队列。 以下列表描述了处理队列的规则:

  • 如果 DPC 分配给当前处理器且 Importance 不等于 LowImportance,或者 Importance 等于 LowImportance 且当前处理器的 DPC 队列深度超过系统定义的限制,或者 DPC 请求速率低于系统定义的最小值,则立即开始处理 DPC 队列。 否则,DPC 的处理将延迟到满足相应的队列深度和速率要求。

  • 如果 DPC 分配给与当前处理器不同的处理器,并且 Importance 等于 MediumHighImportanceHighImportance,或者目标处理器的 DPC 队列深度超过系统定义的限制,则 DPC 队列的处理将立即在目标处理器上开始。 否则,DPC 的处理将延迟到满足相应的队列深度和速率要求。