共用方式為


DPC 佇列的組織

系統會為每個處理器提供一個 DPC 佇列。 驅動程式可以控制系統將 DPC 指派給哪個佇列、佇列中 DPC 的位置,以及處理佇列的時間。

指派給特定處理器佇列的 DPC 會在該處理器上執行。 根據預設,當驅動程式呼叫 KeInsertQueueDpcIoRequestDpc時,DPC 會排入目前作用中的處理器。 驅動程式可以在呼叫KeInsertQueueDpcIoRequestDpc之前呼叫KeSetTargetProcessorDpc來指定處理器佇列。

在 Windows Vista 和更新版本的 Windows 上,系統也會針對每個處理器有一個執行緒的 DPC 佇列。 驅動程式可以使用 KeSetTargetProcessorDpc 來指定執行緒 DPC 的處理器佇列。

KeSetImportanceDpc常式會控制 DPC 放置於佇列中的位置。 一般而言,DPC 會放在佇列的結尾;但是,如果驅動程式第一次呼叫 KeSetImportanceDpc且 Importance 參數等於 HighImportance,DPC 就會放在佇列的開頭。

針對一般 (非執行緒) DPC, KeSetImportanceDpc 也會判斷 KeInsertQueueDpcIoRequestDpc 是否會立即開始處理 DPC 佇列。 下列清單描述處理佇列的規則:

  • 如果 DPC 指派給目前的處理器,而 Importance 不等於LowImportance,或者如果 Importance等於LowImportance,且目前處理器的 DPC 佇列深度超過系統定義的限制或 DPC 要求速率低於系統定義的最小值,則 DPC 佇列的處理會立即開始。 否則,DPC 的處理會延後,直到符合適當的佇列深度和速率需求為止。

  • 如果 DPC 指派給與目前處理器不同的處理器,而 Importance 等於 MediumHighImportanceHighImportance,或是目標處理器的 DPC 佇列深度超過系統定義的限制,則 DPC 佇列的處理會立即開始于目標處理器上。 否則,DPC 的處理會延後,直到符合適當的佇列深度和速率需求為止。