Share via


Estrutura ISchedulerProxy

A interface pela qual os agendadores se comunicam com o Runtime de Simultaneidade do Resource Manager para negociar a alocação de recursos.

Sintaxe

struct ISchedulerProxy;

Membros

Métodos públicos

Nome Descrição
ISchedulerProxy::BindContext Associa o contexto de execução a um proxy de thread se ele ainda não estiver associado a um.
ISchedulerProxy::CreateOversubscriber Cria uma nova raiz de processador virtual no thread de hardware associado a um recurso de execução existente.
ISchedulerProxy::RequestInitialVirtualProcessors Solicita uma alocação inicial de raízes de processador virtual. Cada raiz de processador virtual representa a capacidade de executar um thread que pode executar o trabalho para o agendador.
ISchedulerProxy::Shutdown Notifica o Resource Manager que o agendador está sendo desligado. Isso fará com que o Resource Manager recupere imediatamente todos os recursos concedidos ao agendador.
ISchedulerProxy::SubscribeCurrentThread Registra o thread atual com o Resource Manager, associando-o a esse agendador.
ISchedulerProxy::UnbindContext Desassocia um proxy de thread do contexto de execução especificado pelo parâmetro pContext e o retorna para o pool livre do alocador de proxy de thread. Esse método só pode ser chamado em um contexto de execução que foi associado por meio do método ISchedulerProxy::BindContext e ainda não foi iniciado por ser o parâmetro pContext de uma chamada de método IThreadProxy::SwitchTo.

Comentários

O Resource Manager entrega uma interface ISchedulerProxy para cada agendador que se registra com ele usando o método IResourceManager::RegisterScheduler.

Hierarquia de herança

ISchedulerProxy

Requisitos

Cabeçalho: concrtrm.h

Namespace: concurrency

Método ISchedulerProxy::BindContext

Associa o contexto de execução a um proxy de thread se ele ainda não estiver associado a um.

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

Parâmetros

pContext
Uma interface para o contexto de execução a ser associada a um proxy de thread.

Comentários

Normalmente, o método IThreadProxy::SwitchTo associará um proxy de thread a um contexto de execução sob demanda. Há, no entanto, circunstâncias em que é necessário associar um contexto com antecedência para garantir que o método SwitchTo mude para um contexto já associado. Esse é o caso em um contexto de agendamento UMS, pois ele 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 prontamente disponível no pool livre do alocador de proxy de thread.

invalid_argument será gerado se o parâmetro pContext tiver o valor NULL.

Método ISchedulerProxy::CreateOversubscriber

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

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

Parâmetros

pExecutionResource
Uma interface IExecutionResource que representa o thread de hardware que você deseja subscrever.

Valor de Devolução

Uma interface IVirtualProcessorRoot.

Comentários

Use esse método quando o agendador quiser subscrever um thread de hardware específico por um período limitado. Depois de terminar com a raiz de processador virtual, você deve devolvê-la ao gerenciador de recursos chamando o método Remove na interface IVirtualProcessorRoot.

Você pode até mesmo subscrever uma raiz de processador virtual existente, pois a interface IVirtualProcessorRoot herda da interface IExecutionResource.

Método ISchedulerProxy::RequestInitialVirtualProcessors

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

virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;

Parâmetros

doSubscribeCurrentThread
Se deseja assinar para ele o thread atual e a conta durante a alocação de recursos.

Valor de Devolução

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

Comentários

Antes que um agendador execute qualquer trabalho, ele deve usar esse método para solicitar raízes de processador virtual do Resource Manager. O Resource Manager acessará a política do agendador usando IScheduler::GetPolicy e usará os valores para as chaves de política MinConcurrency, MaxConcurrency e TargetOversubscriptionFactor para determinar quantos threads de hardware atribuir inicialmente ao agendador e quantas raízes de processador virtual criar para cada thread de hardware. Para obter 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 Resource Manager concede recursos a um agendador chamando o método IScheduler::AddVirtualProcessors com uma lista de raízes de processador virtual. O método é invocado como um retorno de chamada no agendador antes que esse método retorne.

Se o agendador solicitou assinatura para o thread atual definindo o parâmetro doSubscribeCurrentThread como true, o método retornará uma interface IExecutionResource. A assinatura deve ser encerrada posteriormente usando o método IExecutionResource::Remove.

Ao determinar quais threads de hardware estão selecionados, o Resource Manager tentará otimizar para afinidade de nó do processador. Se a assinatura for solicitada para o thread atual, é uma indicação de que o thread atual pretende participar do trabalho atribuído a esse agendador. Nesse caso, as raízes de processadores virtuais alocados estão localizadas no nó do processador no qual o thread atual está sendo executado, se possível.

O ato de assinar um thread aumenta o nível de assinatura do thread de hardware subjacente em um. O nível de assinatura é reduzido em um quando a assinatura é encerrada. Para obter mais informações sobre os níveis de assinatura, consulte IExecutionResource::CurrentSubscriptionLevel.

Método ISchedulerProxy::Shutdown

Notifica o Resource Manager que o agendador está sendo desligado. Isso fará com que o Resource Manager recupere imediatamente todos os recursos concedidos ao agendador.

virtual void Shutdown() = 0;

Comentários

Todas as interfaces IExecutionContext que o agendador recebeu como resultado da assinatura de um thread externo usando os métodos ISchedulerProxy::RequestInitialVirtualProcessors ou ISchedulerProxy::SubscribeCurrentThread devem ser retornadas para o Resource Manager usando IExecutionResource::Remove antes que um agendador se desligue.

Se o agendador tiver alguma raiz de processador virtual desativada, você deverá ativá-las usando IVirtualProcessorRoot::Activate e fazer com que os proxies de thread executados nelas deixem o método Dispatch dos contextos de execução que estejam expedindo antes de você invocar Shutdown em um proxy de agendador.

Não é necessário que o agendador retorne individualmente todas as raízes de processador virtual que o Resource Manager concedeu a ele por meio de chamadas para o método Remove, pois todas as raízes de processadores virtuais serão retornadas ao Resource Manager no desligamento.

Método ISchedulerProxy::SubscribeCurrentThread

Registra o thread atual com o Resource Manager, associando-o a esse agendador.

virtual IExecutionResource* SubscribeCurrentThread() = 0;

Valor de Devolução

A interface IExecutionResource que representa o thread atual no runtime.

Comentários

Use esse método se quiser que o Resource Manager contabilize o thread atual ao alocar recursos para seu agendador e outros agendadores. É especialmente útil quando o thread planeja participar do trabalho enfileirado no agendador, juntamente com as raízes de processador virtual que o agendador recebe do Resource Manager. O Resource Manager usa informações para evitar subscrições desnecessárias de threads de hardware no sistema.

O recurso de execução recebido por meio desse método deve ser retornado ao Resource Manager usando o método IExecutionResource::Remove. O thread que chama o método Remove deve ser o mesmo thread que anteriormente chamou o método SubscribeCurrentThread.

O ato de assinar um thread aumenta o nível de assinatura do thread de hardware subjacente em um. O nível de assinatura é reduzido em um quando a assinatura é encerrada. Para obter mais informações sobre os níveis de assinatura, consulte IExecutionResource::CurrentSubscriptionLevel.

Método ISchedulerProxy::UnbindContext

Desassocia um proxy de thread do contexto de execução especificado pelo parâmetro pContext e o retorna para o pool livre do alocador de proxy de thread. Esse método só pode ser chamado em um contexto de execução que foi associado por meio do método ISchedulerProxy::BindContext e 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

pContext
O contexto de execução a ser desassociado de seu proxy de thread.

Confira também

Namespace de simultaneidade
Estrutura IScheduler
Estrutura IThreadProxy
Estrutura IVirtualProcessorRoot
Estrutura IResourceManager