Condividi tramite


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