共用方式為


工作佇列分派機制

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 層級與其他兩個層級不同,因為常式不應封鎖 (等候任何資源) 。 此要求無法強制執行,因此調度機制的有效性依賴於客戶端的隱含配合。

RDBSS 中的工作佇列實作是以一種 KQUEUE 實作為基礎建構的。 額外的支援涉及管理一些正在等待工作項目的執行緒。 每個工作佇列資料結構都是從非分頁集區記憶體中配置,並且擁有自己的同步機制(旋轉鎖)。

除了簿記資訊 (例如佇列狀態和類型) 之外,RDBSS 也會維護在工作佇列生命週期內收集的統計資料。 這可以在調整工作佇列時提供有價值的資訊。 已處理的項目數、必須處理的項目數,以及累計佇列長度是結構化的。 累積佇列長度是重要的度量,代表每次將其他工作項目排入佇列時等待處理的項目數目總和。 累積佇列長度除以已處理項目總數與要處理項目數的總和,可指出平均佇列長度。 遠大於 1 的值表示可以增加與工作佇列相關聯的工作執行緒數目下限。 遠小於 1 的值表示可以減少與佇列相關聯的工作執行緒數目上限。

工作佇列通常會以作用中狀態啟動,並持續到遇到無法回復狀況 (例如,缺少系統資源) 或轉換成非作用中狀態為止。 啟動 Rundown 時,它會轉換成 Rundown 進行中狀態。

工作佇列的概要在執行緒已被關閉時尚未完成。 在拆除資料結構之前,需要確保執行緒的終止。 RDBSS 中的工作佇列實作遵循通訊協定,其中每個向下旋轉的執行緒都會在執行階段內容中儲存執行緒物件的參考。 啟動指令的執行緒(不屬於工作佇列)會等待所有停止運作的執行緒完成,然後再拆除資料結構。

RxDispatchToWorkerThreadRxPostToWorkerThread 佇列的目前實作會在呼叫來源的相同處理器上運作。

下列用於工作佇列分派的 RDBSS 常式包括。

常規 說明

RxDispatchToWorkerThread

此常式會在背景工作執行程的內容中叫用常式。 此例程會配置WORK_QUEUE_ITEM的記憶體。

RxPostToWorker執行緒

此常式會在背景工作執行程的內容中叫用常式。 呼叫端必須配置WORK_QUEUE_ITEM的記憶體。

RxSpinDownMRxDispatcher

此常式會拆除網路迷你重新導向器的調度器內容。

請注意,此常式僅適用於 Windows Server 2003 和 Windows XP。