Struttura ISchedulerProxy
L'interfaccia mediante la quale le utilità di pianificazione comunicano con Gestione risorse del runtime di concorrenza per negoziare l'allocazione delle risorse.
Sintassi
struct ISchedulerProxy;
Membri
Metodi pubblici
Nome | Descrizione |
---|---|
ISchedulerProxy::BindContext | Associa un contesto di esecuzione a un proxy di thread, se non è già associato a uno. |
ISchedulerProxy::CreateOversubscriber | Crea una nuova radice del processore virtuale nel thread hardware associato a una risorsa di esecuzione esistente. |
ISchedulerProxy::RequestInitialVirtualProcessors | Richiede un'allocazione iniziale delle radici del processore virtuale. Ogni radice del processore virtuale rappresenta la possibilità di eseguire un thread in grado di eseguire il lavoro per l'utilità di pianificazione. |
ISchedulerProxy::Shutdown | Notifica a Resource Manager che l'utilità di pianificazione sta arrestando. In questo modo, Resource Manager recupera immediatamente tutte le risorse concesse all'utilità di pianificazione. |
ISchedulerProxy::SubscribeCurrentThread | Registra il thread corrente con Resource Manager, associandolo a questa utilità di pianificazione. |
ISchedulerProxy::UnbindContext | Annulla l'associazione di un proxy di thread dal contesto di esecuzione specificato dal pContext parametro e lo restituisce al pool gratuito della factory del proxy del thread. Questo metodo può essere chiamato solo in un contesto di esecuzione associato tramite il metodo ISchedulerProxy::BindContext e non è ancora stato avviato tramite il pContext parametro di una chiamata al metodo IThreadProxy::SwitchTo . |
Osservazioni:
Resource Manager passa un'interfaccia ISchedulerProxy
a ogni utilità di pianificazione che esegue la registrazione usando il metodo IResourceManager::RegisterScheduler .
Gerarchia di ereditarietà
ISchedulerProxy
Requisiti
Intestazione: concrtrm.h
Spazio dei nomi: Concurrency
Metodo ISchedulerProxy::BindContext
Associa un contesto di esecuzione a un proxy di thread, se non è già associato a uno.
virtual void BindContext(_Inout_ IExecutionContext* pContext) = 0;
Parametri
pContext
Interfaccia al contesto di esecuzione da associare a un proxy di thread.
Osservazioni:
In genere, il metodo IThreadProxy::SwitchTo associa un proxy di thread a un contesto di esecuzione su richiesta. Esistono tuttavia circostanze in cui è necessario associare un contesto in anticipo per assicurarsi che il SwitchTo
metodo passi a un contesto già associato. Questo è il caso in un contesto di pianificazione UMS perché non può chiamare metodi che allocano memoria e l'associazione di un proxy di thread può comportare l'allocazione di memoria se un proxy di thread non è facilmente disponibile nel pool gratuito della factory proxy del thread.
invalid_argument
viene generata se il parametro pContext
ha il valore NULL
.
Metodo ISchedulerProxy::CreateOversubscriber
Crea una nuova radice del processore virtuale nel thread hardware associato a una risorsa di esecuzione esistente.
virtual IVirtualProcessorRoot* CreateOversubscriber(_Inout_ IExecutionResource* pExecutionResource) = 0;
Parametri
pExecutionResource
Interfaccia IExecutionResource
che rappresenta il thread hardware da sovrascrivere.
Valore restituito
Interfaccia IVirtualProcessorRoot
.
Osservazioni:
Usare questo metodo quando l'utilità di pianificazione vuole sovrascrivere un determinato thread hardware per un periodo di tempo limitato. Al termine dell'operazione con la radice del processore virtuale, è necessario restituirla a Resource Manager chiamando il metodo Remove nell'interfaccia IVirtualProcessorRoot
.
È anche possibile eseguire l'oversubscription di una radice del processore virtuale esistente, poiché l'interfaccia IVirtualProcessorRoot
eredita dall'interfaccia IExecutionResource
.
Metodo ISchedulerProxy::RequestInitialVirtualProcessors
Richiede un'allocazione iniziale delle radici del processore virtuale. Ogni radice del processore virtuale rappresenta la possibilità di eseguire un thread in grado di eseguire il lavoro per l'utilità di pianificazione.
virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;
Parametri
doSubscribeCurrentThread
Indica se sottoscrivere il thread corrente e tenervi conto durante l'allocazione delle risorse.
Valore restituito
Interfaccia IExecutionResource
per il thread corrente, se il parametro doSubscribeCurrentThread
ha il valore true
. Se il valore è false
, il metodo restituisce NULL.
Osservazioni:
Prima dell'esecuzione di un'utilità di pianificazione, è consigliabile usare questo metodo per richiedere radici del processore virtuale da Resource Manager. Resource Manager accederà ai criteri dell'utilità di pianificazione usando IScheduler::GetPolicy e userà i valori per le chiavi MinConcurrency
MaxConcurrency
dei criteri e TargetOversubscriptionFactor
per determinare il numero di thread hardware da assegnare all'utilità di pianificazione inizialmente e il numero di radici del processore virtuale da creare per ogni thread hardware. Per altre informazioni sull'uso dei criteri dell'utilità di pianificazione per determinare l'allocazione iniziale di un'utilità di pianificazione, vedere PolicyElementKey.
Resource Manager concede risorse a un'utilità di pianificazione chiamando il metodo IScheduler::AddVirtualProcessors con un elenco di radici del processore virtuale. Il metodo viene richiamato come callback nell'utilità di pianificazione prima che venga restituito questo metodo.
Se l'utilità di pianificazione ha richiesto la sottoscrizione per il thread corrente impostando il parametro doSubscribeCurrentThread
su true
, il metodo restituisce un'interfaccia IExecutionResource
. La sottoscrizione deve essere terminata in un secondo momento usando il metodo IExecutionResource::Remove .
Quando si determinano i thread hardware selezionati, Resource Manager tenterà di ottimizzare l'affinità dei nodi del processore. Se la sottoscrizione è richiesta per il thread corrente, è un'indicazione che il thread corrente intende partecipare al lavoro assegnato a questa utilità di pianificazione. In questo caso, le radici dei processori virtuali allocate si trovano nel nodo del processore in cui è in esecuzione il thread corrente, se possibile.
L'azione di sottoscrizione di un thread aumenta il livello di sottoscrizione del thread hardware sottostante di uno. Il livello di sottoscrizione viene ridotto di uno quando la sottoscrizione viene terminata. Per altre informazioni sui livelli di sottoscrizione, vedere IExecutionResource::CurrentSubscriptionLevel.
Metodo ISchedulerProxy::Shutdown
Notifica a Resource Manager che l'utilità di pianificazione sta arrestando. In questo modo, Resource Manager recupera immediatamente tutte le risorse concesse all'utilità di pianificazione.
virtual void Shutdown() = 0;
Osservazioni:
Tutte le IExecutionContext
interfacce ricevute dall'utilità di pianificazione come risultato della sottoscrizione di un thread esterno tramite i metodi ISchedulerProxy::RequestInitialVirtualProcessors
o ISchedulerProxy::SubscribeCurrentThread
devono essere restituite a Resource Manager usando IExecutionResource::Remove
prima che un'utilità di pianificazione si arresti.
Se l'utilità di pianificazione aveva radici del processore virtuale disattivate, è necessario attivarle usando IVirtualProcessorRoot::Activate e fare in modo che i proxy del thread vengano eseguiti in essi lasciano il Dispatch
metodo dei contesti di esecuzione inviati prima di richiamare Shutdown
su un proxy dell'utilità di pianificazione.
Non è necessario che tramite l'utilità di pianificazione vengano restituite singolarmente tutte le radici del processore virtuale concesse da Gestione risorse tramite chiamate al metodo Remove
poiché tutte le radici del processore virtuale saranno restituite a Gestione risorse all'arresto.
Metodo ISchedulerProxy::SubscribeCurrentThread
Registra il thread corrente con Resource Manager, associandolo a questa utilità di pianificazione.
virtual IExecutionResource* SubscribeCurrentThread() = 0;
Valore restituito
Interfaccia IExecutionResource
che rappresenta il thread corrente nel runtime.
Osservazioni:
Usare questo metodo se si vuole che Resource Manager tenga conto del thread corrente durante l'allocazione delle risorse all'utilità di pianificazione e ad altre utilità di pianificazione. È particolarmente utile quando il thread prevede di partecipare al lavoro in coda all'utilità di pianificazione, insieme alle radici del processore virtuale che l'utilità di pianificazione riceve da Resource Manager. Resource Manager usa le informazioni per impedire l'oversubscription non necessario dei thread hardware nel sistema.
La risorsa di esecuzione ricevuta tramite questo metodo deve essere restituita a Resource Manager usando il metodo IExecutionResource::Remove . Il thread che chiama il Remove
metodo deve essere lo stesso thread che in precedenza ha chiamato il SubscribeCurrentThread
metodo .
L'azione di sottoscrizione di un thread aumenta il livello di sottoscrizione del thread hardware sottostante di uno. Il livello di sottoscrizione viene ridotto di uno quando la sottoscrizione viene terminata. Per altre informazioni sui livelli di sottoscrizione, vedere IExecutionResource::CurrentSubscriptionLevel.
Metodo ISchedulerProxy::UnbindContext
Annulla l'associazione di un proxy di thread dal contesto di esecuzione specificato dal pContext
parametro e lo restituisce al pool gratuito della factory del proxy del thread. Questo metodo può essere chiamato solo in un contesto di esecuzione associato tramite il metodo ISchedulerProxy::BindContext e non è ancora stato avviato tramite il pContext
parametro di una chiamata al metodo IThreadProxy::SwitchTo .
virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;
Parametri
pContext
Contesto di esecuzione da annullare l'associazione dal proxy del thread.
Vedi anche
Spazio dei nomi concurrency
Struttura IScheduler
Struttura IThreadProxy
Struttura IVirtualProcessorRoot
Struttura IResourceManager