ISchedulerProxy 結構

排程器用來與並行執行階段的資源管理員通訊,以協調資源配置的介面。

語法

struct ISchedulerProxy;

成員

公用方法

名稱 描述
ISchedulerProxy::BindCoNtext 如果執行內容尚未與執行緒 Proxy 產生關聯,則為它建立關聯。
ISchedulerProxy::CreateOversubscriber 在與現有執行資源相關聯的硬體執行緒上建立新的虛擬處理器根目錄。
ISchedulerProxy::RequestInitialVirtualProcessors 要求虛擬處理器根目錄的初始配置。 每個虛擬處理器根代表能夠執行一個執行緒來執行排程器的工作。
ISchedulerProxy::Shutdown 通知 Resource Manager 排程器正在關閉。 這會導致 Resource Manager 立即回收授與排程器的所有資源。
ISchedulerProxy::SubscribeCurrentThread 向 Resource Manager 註冊目前的執行緒,並將它與這個排程器產生關聯。
ISchedulerProxy::UnbindCoNtext 將執行緒 Proxy 與 參數指定的 pContext 執行內容解除關聯,並將它傳回至執行緒 Proxy 處理站的免費集區。 這個方法只能在透過 ISchedulerProxy::BindCoNtext 方法系結的執行內容上呼叫,而且尚未透過 IThreadProxy pContext ::SwitchTo 方法呼叫的參數 啟動。

備註

Resource Manager 會將介面交給 ISchedulerProxy 使用 IResourceManager::RegisterScheduler 方法向它註冊的每個排程器

繼承階層架構

ISchedulerProxy

需求

標頭: concrtrm.h

命名空間: concurrency

ISchedulerProxy::BindCoNtext 方法

如果執行內容尚未與執行緒 Proxy 產生關聯,則為它建立關聯。

virtual void BindContext(_Inout_ IExecutionContext* pContext) = 0;

參數

pContext
要與執行緒 Proxy 產生關聯的執行內容的介面。

備註

一般而言, IThreadProxy::SwitchTo 方法會視需要將執行緒 Proxy 系結至執行內容。 不過,在某些情況下,您必須事先系結內容,以確保 SwitchTo 方法切換至已系結的內容。 這是 UMS 排程內容的情況,因為它無法呼叫配置記憶體的方法,而且如果執行緒 Proxy 無法線上程 Proxy 處理站的免費集區中輕易取得,系結執行緒 Proxy 可能會牽涉到記憶體配置。

invalid_argument 如果 參數 pContext 具有 值 NULL ,則會擲回 。

ISchedulerProxy::CreateOversubscriber 方法

在與現有執行資源相關聯的硬體執行緒上建立新的虛擬處理器根目錄。

virtual IVirtualProcessorRoot* CreateOversubscriber(_Inout_ IExecutionResource* pExecutionResource) = 0;

參數

pExecutionResource
IExecutionResource介面,表示您想要過度訂閱的硬體執行緒。

傳回值

IVirtualProcessorRoot 介面。

備註

當您的排程器想要在有限的時間內過度訂閱特定硬體執行緒時,請使用此方法。 使用虛擬處理器根目錄完成之後,您應該在 介面上 IVirtualProcessorRoot 呼叫 Remove 方法,將其傳回給資源管理員。

因為 IVirtualProcessorRoot 介面繼承自 IExecutionResource 介面,所以您甚至可以過度訂閱現有的虛擬處理器根。

ISchedulerProxy::RequestInitialVirtualProcessors 方法

要求虛擬處理器根目錄的初始配置。 每個虛擬處理器根代表能夠執行一個執行緒來執行排程器的工作。

virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;

參數

doSubscribeCurrentThread
是否要訂閱目前的執行緒,並在資源配置期間加以考慮。

傳回值

IExecutionResource如果 參數 doSubscribeCurrentThread 具有 值 true ,則為目前線程的介面。 如果值為 false ,則方法會傳回 Null。

備註

排程器執行任何工作之前,應該使用此方法向 Resource Manager 要求虛擬處理器根目錄。 Resource Manager 會使用 IScheduler::GetPolicy 存取排程器的原則,並使用原則索引鍵 MinConcurrency 的值,並決定一開始要指派給排程器的硬體執行緒數目, MaxConcurrency 以及 TargetOversubscriptionFactor 每個硬體執行緒要建立多少個虛擬處理器根目錄。 如需排程器原則如何用來判斷排程器初始配置的詳細資訊,請參閱 PolicyElementKey

Resource Manager 會使用虛擬處理器根目錄清單呼叫 IScheduler::AddVirtualProcessors 方法 ,將資源授與排程器。 在此方法傳回之前,方法會叫用為排程器的回呼。

如果排程器藉由將 參數 doSubscribeCurrentThreadtrue 設定為 來要求目前線程的訂用帳戶,此方法會傳 IExecutionResource 回 介面。 訂閱必須在稍後 使用 IExecutionResource::Remove 方法終止。

判斷選取的硬體執行緒時,Resource Manager 會嘗試優化處理器節點親和性。 如果目前線程要求訂閱,表示目前線程想要參與指派給此排程器的工作。 在這種情況下,配置的虛擬處理器根目錄位於目前線程執行所在的處理器節點上,如果可能的話。

訂閱執行緒的動作會將基礎硬體執行緒的訂用帳戶層級增加一個。 當訂閱終止時,訂用帳戶層級會減少一個。 如需訂用帳戶層級的詳細資訊,請參閱 IExecutionResource::CurrentSubscriptionLevel

ISchedulerProxy::Shutdown 方法

通知 Resource Manager 排程器正在關閉。 這會導致 Resource Manager 立即回收授與排程器的所有資源。

virtual void Shutdown() = 0;

備註

排程器使用 方法 ISchedulerProxy::RequestInitialVirtualProcessors 訂閱外部執行緒而收到的所有 IExecutionContext 介面,或 ISchedulerProxy::SubscribeCurrentThread 必須在排程器關閉本身之前,使用 IExecutionResource::Remove 傳回給 Resource Manager。

如果您的排程器有任何已停用的虛擬處理器根目錄,您必須使用 IVirtualProcessorRoot::Activate 加以啟動,並在它們上執行執行緒 Proxy 時,保留 Dispatch 執行內容的方法,再 Shutdown 叫用 排程器 Proxy。

排程器不需要透過呼叫 Remove 方法的方式,分別傳回資源管理員授與它的所有虛擬處理器根,因為所有虛擬處理器根都會在關閉時傳回資源管理員。

ISchedulerProxy::SubscribeCurrentThread 方法

向 Resource Manager 註冊目前的執行緒,並將它與這個排程器產生關聯。

virtual IExecutionResource* SubscribeCurrentThread() = 0;

傳回值

IExecutionResource表示執行時間中目前線程的介面。

備註

如果您想要 Resource Manager 考慮目前線程,同時將資源配置給排程器和其他排程器,請使用此方法。 當執行緒計畫參與排入排程器的工作,以及排程器從 Resource Manager 接收的虛擬處理器根目錄時,特別有用。 Resource Manager 會使用資訊來防止系統上不必要的硬體執行緒過度訂閱。

應使用 IExecutionResource::Remove 方法,將透過此方法收到的執行資源傳回給 Resource Manager。 呼叫 方法的 Remove 執行緒必須是先前呼叫 SubscribeCurrentThread 方法的相同執行緒。

訂閱執行緒的動作會將基礎硬體執行緒的訂用帳戶層級增加一個。 當訂閱終止時,訂用帳戶層級會減少一個。 如需訂用帳戶層級的詳細資訊,請參閱 IExecutionResource::CurrentSubscriptionLevel

ISchedulerProxy::UnbindCoNtext 方法

將執行緒 Proxy 與 參數指定的 pContext 執行內容解除關聯,並將它傳回至執行緒 Proxy 處理站的免費集區。 這個方法只能在透過 ISchedulerProxy::BindCoNtext 方法系結的執行內容上呼叫,而且尚未透過 IThreadProxy pContext ::SwitchTo 方法呼叫的參數 啟動。

virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;

參數

pContext
要與其執行緒 Proxy 解除關聯的執行內容。

另請參閱

concurrency 命名空間
IScheduler 結構
IThreadProxy 結構
IVirtualProcessorRoot 結構
IResourceManager 結構