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