Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Interfaccia mediante la quale gli scheduler comunicano con il Resource Manager del Concurrency Runtime per allocare le 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 lo schedulatore. |
| ISchedulerProxy::Shutdown | Notifica al Resource Manager che il pianificatore si sta spegnendo. In questo modo, Resource Manager recupererà immediatamente tutte le risorse concesse al pianificatore. |
| ISchedulerProxy::SubscribeCurrentThread | Registra il thread corrente con Resource Manager, associandolo a questa utilità di pianificazione. |
| ISchedulerProxy::UnbindContext | Annulla l'associazione di un thread proxy dal contesto di esecuzione specificato dal parametro pContext e lo restituisce al pool libero della fabbrica del thread proxy. Questo metodo può essere chiamato solo in un contesto di esecuzione associato tramite il metodo ISchedulerProxy::BindContext e non è ancora stato avviato essendo il pContext parametro di una chiamata al metodo IThreadProxy::SwitchTo. |
Osservazioni:
Il Resource Manager passa un'interfaccia ISchedulerProxy a ogni scheduler che si registra 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 per il 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 generato 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 sovrascrivere una radice esistente del processore virtuale, perché 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 lo schedulatore.
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 che un pianificatore esegua qualsiasi lavoro, è consigliabile usare questo metodo per richiedere le radici dei processori virtuali dal Gestore delle Risorse. Resource Manager accederà ai criteri dell'utilità di pianificazione usando IScheduler::GetPolicy e userà i valori per le chiavi MinConcurrencyMaxConcurrency 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 ulteriori informazioni su come le politiche di pianificazione vengono utilizzate per determinare l'allocazione iniziale di un pianificatore, 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 nel scheduler prima che il metodo termini l'esecuzione.
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 è richiesta la sottoscrizione per il thread corrente, è un'indicazione che il thread corrente intende partecipare al lavoro assegnato a questo scheduler. 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 iscrizione a un thread incrementa di un'unità il livello di iscrizione del thread hardware sottostante. 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 al Resource Manager che il pianificatore si sta spegnendo. In questo modo, Resource Manager recupererà immediatamente tutte le risorse concesse al pianificatore.
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 assicurarsi che i proxy dei thread in esecuzione completino il metodo Dispatch dei contesti di esecuzione che stanno gestendo, prima di richiamare Shutdown su un proxy dello scheduler.
Non è necessario che l'agente di pianificazione restituisca singolarmente tutte le radici dei processori virtuali concesse dalla Gestione Risorse tramite chiamate al metodo Remove, poiché tutte le radici dei processori virtuali saranno restituite alla 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 il Gestore delle risorse tenga conto del thread corrente durante l'allocazione delle risorse al tuo pianificatore e ad altri pianificatori. È particolarmente utile quando il thread prevede di partecipare al lavoro in coda al tuo scheduler, insieme alle radici dei processori virtuali che lo scheduler riceve dal gestore delle risorse. Resource Manager usa le informazioni per impedire l'oversubscription superfluo 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 iscrizione di un thread aumenta di un'unità il livello di iscrizione del thread hardware sottostante. 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 thread proxy dal contesto di esecuzione specificato dal parametro pContext e lo restituisce al pool libero della fabbrica del thread proxy. Questo metodo può essere chiamato solo in un contesto di esecuzione associato tramite il metodo ISchedulerProxy::BindContext e non è ancora stato avviato essendo il pContext parametro di una chiamata al metodo IThreadProxy::SwitchTo.
virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;
Parametri
pContext
Contesto di esecuzione da disassociare dal proxy del thread.
Vedi anche
Spazio dei nomi concorrenza
Struttura IScheduler
Struttura IThreadProxy
Struttura IVirtualProcessorRoot
Struttura IResourceManager