IScheduler 結構
工作排程器抽象概念的介面。 並行執行階段的資源管理員會使用這個介面與工作排程器通訊。
語法
struct IScheduler;
成員
公用方法
名稱 | 描述 |
---|---|
IScheduler::AddVirtualProcessors | 提供一組虛擬處理器根目錄供排程器使用。 每個 IVirtualProcessorRoot 介面都代表執行單一線程的權利,該線程可以代表排程器執行工作。 |
IScheduler::GetId | 傳回排程器的唯一標識碼。 |
IScheduler::GetPolicy | 傳回排程器原則的複本。 如需排程器原則的詳細資訊,請參閱 SchedulerPolicy。 |
IScheduler::NotifyResourcesExternallyBusy | 通知此排程器,陣列中 ppVirtualProcessorRoots 一組虛擬處理器根目錄所代表的硬體線程現在正由其他排程器使用。 |
IScheduler::NotifyResourcesExternallyIdle | 通知此排程器,其他排程器不會使用數位 ppVirtualProcessorRoots 中一組虛擬處理器根目錄所代表的硬體線程。 |
IScheduler::RemoveVirtualProcessors | 起始移除先前配置給此排程器的虛擬處理器根目錄。 |
IScheduler::Statistics | 提供工作抵達和完成率的相關信息,以及排程器的佇列長度變更。 |
備註
如果您要實作與 Resource Manager 通訊的自定義排程器,您應該提供 介面的 IScheduler
實作。 此介面是排程器與 Resource Manager 之間雙向通道的一端。 另一端則由 IResourceManager
Resource Manager 實作的 和 ISchedulerProxy
介面表示。
繼承階層架構
IScheduler
需求
標頭: concrtrm.h
命名空間: concurrency
IScheduler::AddVirtualProcessors 方法
提供一組虛擬處理器根目錄供排程器使用。 每個 IVirtualProcessorRoot
介面都代表執行單一線程的權利,該線程可以代表排程器執行工作。
virtual void AddVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
參數
ppVirtualProcessorRoots
介面陣列 IVirtualProcessorRoot
,表示要新增至排程器的虛擬處理器根目錄。
計數
陣列中的介面數目 IVirtualProcessorRoot
。
備註
Resource Manager 會叫 AddVirtualProcessor
用 方法,將一組初始虛擬處理器根目錄授與排程器。 它也可以叫用 方法,在排程器之間重新平衡資源時,將虛擬處理器根目錄新增至排程器。
IScheduler::GetId 方法
傳回排程器的唯一標識碼。
virtual unsigned int GetId() const = 0;
傳回值
唯一的整數標識碼。
備註
您應該使用 GetSchedulerId 函式來取得實作介面之物件 IScheduler
的唯一標識碼,再使用 介面做為 Resource Manager 提供之方法的參數。 叫用函式時 GetId
,您應該傳回相同的標識碼。
從不同來源取得的標識碼可能會導致未定義的行為。
IScheduler::GetPolicy 方法
傳回排程器原則的複本。 如需排程器原則的詳細資訊,請參閱 SchedulerPolicy。
virtual SchedulerPolicy GetPolicy() const = 0;
傳回值
排程器原則的複本。
IScheduler::NotifyResourcesExternallyBusy 方法
通知此排程器,陣列中 ppVirtualProcessorRoots
一組虛擬處理器根目錄所代表的硬體線程現在正由其他排程器使用。
virtual void NotifyResourcesExternallyBusy(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
參數
ppVirtualProcessorRoots
與其他排程器忙碌所在的硬體線程相關聯的介面數位。IVirtualProcessorRoot
計數
陣列中的介面數目 IVirtualProcessorRoot
。
備註
特定硬體線程可以同時指派給多個排程器。 其中一個原因是系統上沒有足夠的硬體線程來滿足所有排程器的最低並行,而不需要共享資源。 另一個可能性是,當擁有排程器未使用這些排程器時,資源會暫時指派給其他排程器,方法是停用該硬體線程上的所有虛擬處理器根目錄。
硬體線程的訂用帳戶層級會以已訂閱的線程數目和與該硬體線程相關聯的已啟用虛擬處理器根目錄來表示。 從特定排程器的觀點來看,硬體線程的外部訂用帳戶層級是其他排程器參與的訂用帳戶部分。 當硬體線程的外部訂用帳戶層級從零移至正區域時,資源在外部忙碌的通知會傳送至排程器。
透過此方法的通知只會傳送給具有原則的排程器,其中原則索引鍵的值 MinConcurrency
等於原則索引鍵的值 MaxConcurrency
。 如需排程器原則的詳細資訊,請參閱 SchedulerPolicy。
符合通知資格的排程器會在建立通知時取得一組初始通知,告知它剛指派的資源是外部忙碌或閑置。
IScheduler::NotifyResourcesExternallyIdle 方法
通知此排程器,其他排程器不會使用數位 ppVirtualProcessorRoots
中一組虛擬處理器根目錄所代表的硬體線程。
virtual void NotifyResourcesExternallyIdle(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
參數
ppVirtualProcessorRoots
與其他排程器閑置之硬體線程相關聯的介面數位。IVirtualProcessorRoot
計數
陣列中的介面數目 IVirtualProcessorRoot
。
備註
特定硬體線程可以同時指派給多個排程器。 其中一個原因是系統上沒有足夠的硬體線程來滿足所有排程器的最低並行,而不需要共享資源。 另一個可能性是,當擁有排程器未使用這些排程器時,資源會暫時指派給其他排程器,方法是停用該硬體線程上的所有虛擬處理器根目錄。
硬體線程的訂用帳戶層級會以已訂閱的線程數目和與該硬體線程相關聯的已啟用虛擬處理器根目錄來表示。 從特定排程器的觀點來看,硬體線程的外部訂用帳戶層級是其他排程器參與的訂用帳戶部分。 當硬體線程的外部訂用帳戶層級從先前的正值降至零時,資源在外部忙碌的通知會傳送至排程器。
透過此方法的通知只會傳送給具有原則的排程器,其中原則索引鍵的值 MinConcurrency
等於原則索引鍵的值 MaxConcurrency
。 如需排程器原則的詳細資訊,請參閱 SchedulerPolicy。
符合通知資格的排程器會在建立通知時取得一組初始通知,告知它剛指派的資源是外部忙碌或閑置。
IScheduler::RemoveVirtualProcessors 方法
起始移除先前配置給此排程器的虛擬處理器根目錄。
virtual void RemoveVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
參數
ppVirtualProcessorRoots
介面陣列 IVirtualProcessorRoot
,表示要移除的虛擬處理器根目錄。
計數
陣列中的介面數目 IVirtualProcessorRoot
。
備註
Resource Manager 會叫用 方法, RemoveVirtualProcessors
從排程器擷取一組虛擬處理器根目錄。 當排程器使用虛擬處理器根目錄完成時,應該在每個介面上叫 用 Remove 方法。 一旦您在上面叫用 方法之後Remove
,請勿使用 IVirtualProcessorRoot
介面。
參數 ppVirtualProcessorRoots
會指向介面陣列。 在要移除的虛擬處理器根集合中,永遠無法使用 方法立即 Remove
傳回根目錄。 已啟動且正在執行工作的根目錄,或已停用並等候工作到達,應該以異步方式傳回。 排程器必須嘗試儘快移除虛擬處理器根目錄。 延遲移除虛擬處理器根目錄可能會導致排程器內無意的超額訂閱。
IScheduler::Statistics 方法
提供工作抵達和完成率的相關信息,以及排程器的佇列長度變更。
virtual void Statistics(
_Out_ unsigned int* pTaskCompletionRate,
_Out_ unsigned int* pTaskArrivalRate,
_Out_ unsigned int* pNumberOfTasksEnqueued) = 0;
參數
pTaskCompletionRate
排程器自上次呼叫此方法之後完成的工作數目。
pTaskArrivalRate
自從上次呼叫此方法之後,已抵達排程器的工作數目。
pNumberOfTasksEnqueued
所有排程器佇列中的工作總數。
備註
Resource Manager 會叫用這個方法,以便收集排程器的統計數據。 這裡收集的統計數據將用來驅動動態意見反應演算法,以判斷何時適合將更多資源指派給排程器,以及何時將資源帶走。 排程器所提供的值可以樂觀,而且不一定必須準確地反映目前的計數。
如果您希望資源管理員使用像是工作抵達這類事件的意見反應,決定如何在您的排程器與資源管理員中註冊的其他排程器之間平衡資源,則應該實作這個方法。 如果您選擇不收集統計數據,您可以將原則索引鍵 DynamicProgressFeedback
設定為排程器原則中的值 DynamicProgressFeedbackDisabled
,且 Resource Manager 不會在您的排程器上叫用此方法。
如果沒有統計數據,Resource Manager 會使用硬體線程訂用帳戶層級來進行資源配置和移轉決策。 如需訂用帳戶層級的詳細資訊,請參閱 IExecutionResource::CurrentSubscriptionLevel。
另請參閱
concurrency 命名空間
PolicyElementKey
SchedulerPolicy 類別
IExecutionContext 結構
IThreadProxy 結構
IVirtualProcessorRoot 結構
IResourceManager 結構