Partilhar via


Estrutura ISchedulerProxy

A interface através da qual os agendadores se comunicam com o Gestor de Recursos do Ambiente de Execução Concorrente para negociar a alocação de recursos.

Sintaxe

struct ISchedulerProxy;

Membros

Métodos Públicos

Nome Description
ISchedulerProxy::BindContext Associa um contexto de execução a um proxy de thread, caso não esteja já associado a um.
ISchedulerProxy::CreateOversubscriber Cria uma nova raiz de processador virtual na thread de hardware associada a um recurso de execução existente.
ISchedulerProxy::RequestInitialVirtualProcessors Solicita uma alocação inicial das raízes do processador virtual. Cada raiz de processador virtual representa a capacidade de executar um thread que pode realizar trabalho para o agendador.
ISchedulerProxy::Shutdown Notifica o Gestor de Recursos de que o agendador está a desligar-se. Isto fará com que o Gestor de Recursos recupere imediatamente todos os recursos concedidos ao agendador.
ISchedulerProxy::SubscribeCurrentThread Regista a thread atual no Gestor de Recursos, associando-a a este scheduler.
ISchedulerProxy::UnbindContext Desassocia um proxy de execução do contexto de execução especificado pelo parâmetro pContext e devolve-o ao pool livre da fábrica de proxies de execução. Este método só pode ser chamado num contexto de execução que foi associado através do método ISchedulerProxy::BindContext e que ainda não foi iniciado por ser o parâmetro pContext de uma chamada de método IThreadProxy::SwitchTo.

Observações

O Gestor de Recursos passa uma ISchedulerProxy interface a cada agendador que se regista com ele usando o método IResourceManager::RegisterScheduler .

Hierarquia de herança

ISchedulerProxy

Requerimentos

Cabeçalho: concrtrm.h

Namespace: simultaneidade

Método ISchedulerProxy::BindContext

Associa um contexto de execução a um proxy de thread, caso não esteja já associado a um.

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

Parâmetros

pContexto
Uma interface para o contexto de execução para associar a um proxy de thread.

Observações

Normalmente, o método IThreadProxy::SwitchTo liga um proxy de thread a um contexto de execução sob demanda. Existem, no entanto, circunstâncias em que é necessário ligar um contexto antecipadamente para garantir que o SwitchTo método muda para um contexto já vinculado. Este é o caso num contexto de agendamento UMS, pois não pode chamar métodos que alocam memória, e associar um proxy de thread pode envolver alocação de memória se um proxy de thread não estiver facilmente disponível no pool disponível da fábrica de proxies de threads.

invalid_argument é lançado se o parâmetro pContext tiver o valor NULL.

ISchedulerProxy::Método CreateOversubscriber

Cria uma nova raiz de processador virtual na thread de hardware associada a um recurso de execução existente.

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

Parâmetros

pExecutionResource
Uma IExecutionResource interface que representa o thread de hardware que pretende sobresubscrever.

Valor de retorno

Uma interface IVirtualProcessorRoot.

Observações

Use este método quando o seu agendador quiser sobrecarregar um determinado fio de hardware durante um período limitado. Quando terminares com a raiz do processador virtual, deves devolvê-la ao gestor de recursos chamando o método Remover na IVirtualProcessorRoot interface.

Pode até superaprovisionar uma raiz de processador virtual existente, porque a interface IVirtualProcessorRoot herda da interface IExecutionResource.

ISchedulerProxy::Método RequestInitialVirtualProcessors

Solicita uma alocação inicial das raízes do processador virtual. Cada raiz de processador virtual representa a capacidade de executar um thread que pode realizar trabalho para o agendador.

virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;

Parâmetros

doSubscreverTópicoAtual
Se deve subscrever o tópico atual e contabilizá-lo durante a alocação de recursos.

Valor de retorno

A IExecutionResource interface para o thread atual, se o parâmetro doSubscribeCurrentThread tiver o valor true. Se o valor for false, o método devolve NULL.

Observações

Antes de um agendador executar qualquer trabalho, deve usar este método para solicitar raízes virtuais do processador ao Gestor de Recursos. O Gestor de Recursos acede à política do escalonador usando IScheduler::GetPolicy e utiliza os valores das chaves MinConcurrencyde política , MaxConcurrency e TargetOversubscriptionFactor determina quantas threads de hardware atribuir inicialmente ao escalonador e quantas raízes de processador virtual criar para cada thread de hardware. Para mais informações sobre como as políticas do agendador são usadas para determinar a alocação inicial de um agendador, consulte PolicyElementKey.

O Gestor de Recursos concede recursos a um agendador chamando o método IScheduler::AddVirtualProcessors com uma lista de raízes de processadores virtuais. O método é invocado como um retorno de chamada no agendador antes que este método regresse.

Se o agendador solicitou subscrição para o thread atual definindo o parâmetro doSubscribeCurrentThread para true, o método devolve uma IExecutionResource interface. A subscrição deve ser terminada posteriormente, utilizando o método IExecutionResource::Remove .

Ao determinar quais threads de hardware são selecionados, o Gestor de Recursos tentará otimizar para a afinidade dos nós do processador. Se for solicitada a subscrição para a thread atual, isso indica que a thread atual pretende participar do trabalho atribuído a este agendador. Nesse caso, as raízes dos processadores virtuais alocados estão localizadas no nó do processador onde a thread atual está a ser executada, se possível.

O ato de subscrever um thread aumenta o nível de subscrição do thread de hardware subjacente em um. O nível da subscrição é reduzido em um quando a subscrição é terminada. Para mais informações sobre níveis de subscrição, consulte IExecutionResource::CurrentSubscriptionLevel.

ISchedulerProxy::Método de Encerramento

Notifica o Gestor de Recursos de que o agendador está a desligar-se. Isto fará com que o Gestor de Recursos recupere imediatamente todos os recursos concedidos ao agendador.

virtual void Shutdown() = 0;

Observações

Todas IExecutionContext as interfaces que o escalonador recebeu como resultado de subscrever um thread externo usando os métodos ISchedulerProxy::RequestInitialVirtualProcessors ou ISchedulerProxy::SubscribeCurrentThread devem ser devolvidas ao Gestor de Recursos usando IExecutionResource::Remove antes de o agendador se desligar.

Se o seu agendador teve raízes de processador virtual desativadas, deve ativá-las usando IVirtualProcessorRoot::Activate, e fazer com que os proxies de thread que estão a executar nelas saiam do Dispatch método dos contextos de execução que estão a despachar antes de invocar Shutdown num proxy de agendador.

Não é necessário que o escalonador devolva individualmente todas as raízes do processador virtual que o Gestor de Recursos lhe concedeu através de chamadas ao método Remove, pois as raízes de todos os processadores virtuais serão devolvidas ao Gestor de Recursos no encerramento.

ISchedulerProxy::SubscribeCurrentThread Método

Regista a thread atual no Gestor de Recursos, associando-a a este scheduler.

virtual IExecutionResource* SubscribeCurrentThread() = 0;

Valor de retorno

A interface IExecutionResource que representa o thread atual em tempo de execução.

Observações

Use este método se quiser que o Gestor de Recursos tenha em conta a thread atual enquanto aloca recursos ao seu agendador e a outros agendadores. É especialmente útil quando o thread planeia participar no trabalho enfileirado para o seu agendador, juntamente com as raízes do processador virtual que o agendador recebe do Gestor de Recursos. O Gestor de Recursos utiliza a informação para evitar sobrescrevemento desnecessário de threads de hardware no sistema.

O recurso de execução recebido através deste método deve ser devolvido ao Gestor de Recursos usando o método IExecutionResource::Remove . O thread que chama o Remove método deve ser o mesmo thread que anteriormente chamou o SubscribeCurrentThread método.

O ato de subscrever um thread aumenta o nível de subscrição do thread de hardware subjacente em um. O nível da subscrição é reduzido em um quando a subscrição é terminada. Para mais informações sobre níveis de subscrição, consulte IExecutionResource::CurrentSubscriptionLevel.

Método ISchedulerProxy::UnbindContext

Desassocia um proxy de execução do contexto de execução especificado pelo parâmetro pContext e devolve-o ao pool livre da fábrica de proxies de execução. Este método só pode ser chamado num contexto de execução que foi associado através do método ISchedulerProxy::BindContext e que ainda não foi iniciado por ser o parâmetro pContext de uma chamada de método IThreadProxy::SwitchTo.

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

Parâmetros

pContexto
O contexto de execução para se dissociar do proxy de thread.

Consulte também

concorrência Namespace
Estrutura de IScheduler
Estrutura IThreadProxy
IVirtualProcessorRoot Structure
Estrutura IResourceManager