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 的處理會延後,直到符合適當的佇列深度和速率需求為止。