工作佇列分派機制
RDBSS 會使用 Windows 核心工作佇列來分派多個線程上的作業,以供日後執行。 網路迷你重新導向器驅動程式可以使用 RDBSS 維護的工作佇列來分派作業以供稍後執行。
RDBSS 提供數個例程,實作 RDBSS 中使用的分派機制。 網路迷你重新導向器驅動程式也可以使用這些例程。
RDBSS 會根據每個裝置對象追蹤工作專案。 這可讓 RDBSS 處理與載入和卸除網路迷你重新導向器相關聯的競爭條件。 這也會在 RDBSS 中提供機制,以防止單一網路迷你重新導向器不公平地使用所有資源。
在某些情況下,分派工作專案是不可避免的。 為了避免頻繁的記憶體配置和在這些案例中釋放作業,WORK_QUEUE_ITEM會配置為另一個數據的一部分。 在其他罕見的分派案例中,在需要記憶體配置之前,需要它才能避免記憶體配置。 RDBSS 工作佇列實作會以分派和張貼工作佇列要求的形式,提供這兩種案例。 如果使用 RxDispatchToWorkerThread 例程進行分派,則呼叫端不需要配置WORK_QUEUE_ITEM的記憶體。 若要使用 RxPostToWorkerThread 例程張貼,呼叫端必須配置WORK_QUEUE_ITEM的記憶體。
將作業分派至背景工作線程有兩個常見案例:
對於非常不頻繁的作業,請使用 RxDispatchToWorkerThread 例程,藉由視需要動態配置和釋放工作佇列專案的記憶體來節省記憶體使用量。
將重複分派作業時,請使用 RxPostToWorkerThread 例程,藉由事先配置WORK_QUEUE_ITEM作為要分派的數據結構一部分來節省時間。
兩個分派作業之間的取捨是時間與空間(記憶體使用量)。
RDBSS 中的分派機制會針對每個處理器的多個工作佇列層級提供。 目前支援下列工作佇列層級:
重大
延遲
HyperCritical
Critical 和 Delayed 之間的差異是其中一個優先順序。 HyperCritical 層級與另外兩個不同,例程不應該封鎖 (等候任何資源)。 無法強制執行這項需求,因此分派機制的有效性依賴用戶端的隱含合作。
RDBSS 中的工作佇列實作是以 KQUEUE 實作為基礎所建置。 額外的支持牽涉到一些正在主動等候工作項目的線程的法規。 每個工作佇列數據結構都是從非分頁集區內存配置,並有自己的同步處理機制(同步鎖定)。
除了記帳資訊(例如佇列狀態和類型),RDBSS 也會維護在工作佇列存留期內收集的統計數據。 這可以提供微調工作佇列中寶貴的資訊。 已處理的項目數目、必須處理的項目數,以及累積佇列長度的結構。 累積佇列長度是重要的計量,代表每次佇列其他工作專案排入佇列時,等候處理的項目數目總和。 累計佇列長度除以已處理之專案總數的總和,以及要處理的項目數目會指出平均佇列長度。 大於一個值,表示可以增加與工作佇列相關聯的背景工作線程數目下限。 值遠小於一個,表示可以減少與佇列相關聯的工作線程數目上限。
工作佇列通常會以作用中狀態啟動,並繼續執行,直到遇到無法復原的情況(例如,缺少系統資源),或轉換成非作用中狀態時。 起始取消時,它會轉換為進行中的執行狀態。
當線程已展開時,工作佇列的取消不會完成。 必須先確定線程的終止,才能中斷數據結構。 RDBSS 中的工作佇列實作會遵循通訊協定,其中每個正在展開的線程都會將參考儲存在 Rundown 內容中的線程物件。 取消發行線程(不屬於工作佇列)會先等候所有線程完成,再卸除數據結構。
RxDispatchToWorkerThread 和 RxPostToWorkerThread 佇列的目前實作會與呼叫來源相同的處理器上運作。
下列適用於工作佇列分派的 RDBSS 例程包括。
常式 | 描述 |
---|---|
此例程會在背景工作線程的內容中叫用例程。 此例程會配置WORK_QUEUE_ITEM的記憶體。 |
|
此例程會叫用背景工作線程內容中的例程。 呼叫端必須配置WORK_QUEUE_ITEM的記憶體。 |
|
此例程會卸除網路迷你重新導向器的發送器內容。 請注意,此例程僅適用於 Windows Server 2003 和 Windows XP。 |