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 結構