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 方法系結的執行內容上呼叫,而且尚未透過 IThreadProxypContext ::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 方法,將資源授與排程器。 在此方法傳回之前,方法會叫用為排程器的回呼。
如果排程器藉由將 參數doSubscribeCurrentThread
true
設定為 來要求目前線程的訂用帳戶,此方法會傳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 方法系結的執行內容上呼叫,而且尚未透過 IThreadProxypContext
::SwitchTo 方法呼叫的參數啟動。
virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;
參數
pContext
要與其線程 Proxy 解除關聯的執行內容。
另請參閱
concurrency 命名空間
IScheduler 結構
IThreadProxy 結構
IVirtualProcessorRoot 結構
IResourceManager 結構