Estrutura IScheduler
Uma interface para uma abstração de um agendador de trabalho. O Resource Manager do Runtime de Simultaneidade usa essa interface para se comunicar com agendadores de trabalho.
Sintaxe
struct IScheduler;
Membros
Métodos públicos
Nome | Descrição |
---|---|
IScheduler::AddVirtualProcessors | Fornece um agendador com um conjunto de raízes de processador virtual para ele usar. Cada interface IVirtualProcessorRoot representa o direito de executar um thread único que pode executar o trabalho em nome do agendador. |
IScheduler::GetId | Retorna um identificador exclusivo do agendador. |
IScheduler::GetPolicy | Retorna uma cópia da política do agendador. Para obter mais informações sobre políticas de agendador, consulte SchedulerPolicy. |
IScheduler::NotifyResourcesExternallyBusy | Notifica esse agendador de que os threads de hardware representados pelo conjunto de raízes do processador virtual na matriz ppVirtualProcessorRoots agora estão sendo usados por outros agendadores. |
IScheduler::NotifyResourcesExternallyIdle | Notifica esse agendador de que os threads de hardware representados pelo conjunto de raízes do processador virtual na matriz ppVirtualProcessorRoots não estão sendo usados por outros agendadores. |
IScheduler::RemoveVirtualProcessors | Inicia a remoção de raízes de processador virtual que foram alocadas anteriormente para esse agendador. |
IScheduler::Statistics | Fornece informações relacionadas às taxas de chegada e conclusão da tarefa e à alteração no comprimento da fila para um agendador. |
Comentários
Se você estiver implementando um agendador personalizado que se comunica com o Resource Manager, você deve fornecer uma implementação da interface IScheduler
. Essa interface é uma extremidade de um canal bidirecional de comunicação entre um agendador e o Resource Manager. A outra extremidade é representada pelas interfaces IResourceManager
e ISchedulerProxy
que são implementadas pelo Resource Manager.
Hierarquia de herança
IScheduler
Requisitos
Cabeçalho: concrtrm.h
Namespace: concurrency
Método IScheduler::AddVirtualProcessors
Fornece um agendador com um conjunto de raízes de processador virtual para ele usar. Cada interface IVirtualProcessorRoot
representa o direito de executar um thread único que pode executar o trabalho em nome do agendador.
virtual void AddVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parâmetros
ppVirtualProcessorRoots
Uma matriz de interfaces IVirtualProcessorRoot
que representa as raízes do processador virtual que estão sendo adicionadas ao agendador.
count
O número de interfaces IVirtualProcessorRoot
na matriz.
Comentários
O Resource Manager invoca o método AddVirtualProcessor
para conceder um conjunto inicial de raízes de processador virtual a um agendador. Ele também pode invocar o método para adicionar raízes de processador virtual ao agendador quando ele reequilibra os recursos entre os agendadores.
Método IScheduler::GetId
Retorna um identificador exclusivo do agendador.
virtual unsigned int GetId() const = 0;
Valor de retorno
Um identificador inteiro exclusivo.
Comentários
Você deve usar a função GetSchedulerId para obter um identificador exclusivo para o objeto que implementa a interface IScheduler
, antes de usar a interface como um parâmetro para métodos fornecidos pelo Resource Manager. É esperado que você retorne o mesmo identificador quando a função GetId
for invocada.
Um identificador obtido de uma fonte diferente pode resultar em um comportamento indefinido.
Método IScheduler::GetPolicy
Retorna uma cópia da política do agendador. Para obter mais informações sobre políticas de agendador, consulte SchedulerPolicy.
virtual SchedulerPolicy GetPolicy() const = 0;
Valor de retorno
Uma cópia da política do agendador.
Método IScheduler::NotifyResourcesExternallyBusy
Notifica esse agendador de que os threads de hardware representados pelo conjunto de raízes do processador virtual na matriz ppVirtualProcessorRoots
agora estão sendo usados por outros agendadores.
virtual void NotifyResourcesExternallyBusy(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parâmetros
ppVirtualProcessorRoots
Uma matriz de interfaces IVirtualProcessorRoot
associadas aos threads de hardware nos quais outros agendadores ficaram ocupados.
count
O número de interfaces IVirtualProcessorRoot
na matriz.
Comentários
É possível que um thread de hardware específico seja atribuído a vários agendadores ao mesmo tempo. Um dos motivos para isso pode ser que não existam threads de hardware suficientes no sistema para atender à simultaneidade mínima para todos os agendadores, sem compartilhar recursos. Outra possibilidade é que os recursos sejam atribuídos temporariamente a outros agendadores quando o agendador proprietário não os estiver usando, por meio de todas as suas raízes de processador virtual nesse thread de hardware que está sendo desativado.
O nível de assinatura de um thread de hardware é indicado pelo número de threads assinadas e raízes do processador virtual ativadas associadas a esse thread de hardware. Do ponto de vista de um agendador específico, o nível de assinatura externa de um thread de hardware é a parte da assinatura para a qual outros agendadores contribuem. As notificações de que os recursos estão ocupados externamente são enviadas a um agendador quando o nível de assinatura externa de um thread de hardware passa de zero para território positivo.
As notificações por meio desse método são enviadas somente para agendadores que têm uma política em que o valor da chave de política MinConcurrency
é igual ao valor da chave de política MaxConcurrency
. Para obter mais informações sobre políticas de agendador, consulte SchedulerPolicy.
Um agendador que se qualifica para notificações obtém um conjunto de notificações iniciais quando ele é criado, informando se os recursos que acabaram de ser atribuídos a ele estão externamente ocupados ou ociosos.
Método IScheduler::NotifyResourcesExternallyIdle
Notifica esse agendador de que os threads de hardware representados pelo conjunto de raízes do processador virtual na matriz ppVirtualProcessorRoots
não estão sendo usados por outros agendadores.
virtual void NotifyResourcesExternallyIdle(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parâmetros
ppVirtualProcessorRoots
Uma matriz de interfaces IVirtualProcessorRoot
associadas à threads de hardware nos quais outros agendadores ficaram ociosos.
count
O número de interfaces IVirtualProcessorRoot
na matriz.
Comentários
É possível que um thread de hardware específico seja atribuído a vários agendadores ao mesmo tempo. Um dos motivos para isso pode ser que não existam threads de hardware suficientes no sistema para atender à simultaneidade mínima para todos os agendadores, sem compartilhar recursos. Outra possibilidade é que os recursos sejam atribuídos temporariamente a outros agendadores quando o agendador proprietário não os estiver usando, por meio de todas as suas raízes de processador virtual nesse thread de hardware que está sendo desativado.
O nível de assinatura de um thread de hardware é indicado pelo número de threads assinadas e raízes do processador virtual ativadas associadas a esse thread de hardware. Do ponto de vista de um agendador específico, o nível de assinatura externa de um thread de hardware é a parte da assinatura para a qual outros agendadores contribuem. As notificações de que os recursos estão ocupados externamente são enviadas a um agendador quando o nível de assinatura externa de um thread de hardware cai de zero para um valor positivo anterior.
As notificações por meio desse método são enviadas somente para agendadores que têm uma política em que o valor da chave de política MinConcurrency
é igual ao valor da chave de política MaxConcurrency
. Para obter mais informações sobre políticas de agendador, consulte SchedulerPolicy.
Um agendador que se qualifica para notificações obtém um conjunto de notificações iniciais quando ele é criado, informando se os recursos que acabaram de ser atribuídos a ele estão externamente ocupados ou ociosos.
Método IScheduler::RemoveVirtualProcessors
Inicia a remoção de raízes de processador virtual que foram alocadas anteriormente para esse agendador.
virtual void RemoveVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parâmetros
ppVirtualProcessorRoots
Uma matriz de interfaces IVirtualProcessorRoot
que representa as raízes do processador virtual que serão removidas.
count
O número de interfaces IVirtualProcessorRoot
na matriz.
Comentários
O Resource Manager invoca o método RemoveVirtualProcessors
para retomar um conjunto de raízes de processador virtual de um agendador. É esperado que o agendador invoque o método Remover em cada interface quando isso for feito com as raízes do processador virtual. Não use uma interface IVirtualProcessorRoot
depois de invocar nela o método Remove
.
O parâmetro ppVirtualProcessorRoots
aponta para uma matriz de interfaces. Em meio ao conjunto de raízes do processador virtual a ser removido, as raízes que nunca foram ativadas podem ser retornadas imediatamente usando o método Remove
. As raízes que foram ativadas e estão executando o trabalho ou que foram desativadas e estão aguardando a chegada do trabalho, devem ser retornadas de forma assíncrona. O agendador deve fazer todas as tentativas de remover a raiz do processador virtual o mais rápido possível. Atrasar a remoção das raízes do processador virtual pode resultar em excesso de assinaturas não intencional no agendador.
Método IScheduler::Statistics
Fornece informações relacionadas às taxas de chegada e conclusão da tarefa e à alteração no comprimento da fila para um agendador.
virtual void Statistics(
_Out_ unsigned int* pTaskCompletionRate,
_Out_ unsigned int* pTaskArrivalRate,
_Out_ unsigned int* pNumberOfTasksEnqueued) = 0;
Parâmetros
pTaskCompletionRate
O número de tarefas que foram concluídas pelo agendador desde a última chamada desse método.
pTaskArrivalRate
O número de tarefas que chegaram no agendador desde a última chamada desse método.
pNumberOfTasksEnqueued
O número total de tarefas em todas as filas do agendador.
Comentários
Esse método é invocado pelo Resource Manager para coletar estatísticas para um agendador. As estatísticas coletadas aqui serão usadas para conduzir algoritmos de comentários dinâmicos para determinar quando é apropriado atribuir mais recursos ao agendador e quando remover recursos. Os valores fornecidos pelo agendador podem ser otimistas e não necessariamente precisam refletir a contagem atual de forma precisa.
Você deve implementar esse método se desejar que o Resource Manager use comentários sobre coisas como a chegada da tarefa para determinar como equilibrar o recurso entre o agendador e outros agendadores registrados no Resource Manager. Caso opte por não coletar estatísticas, você pode definir a chave de política DynamicProgressFeedback
para o valor DynamicProgressFeedbackDisabled
na política do agendador e o Resource Manager não invocará esse método no agendador.
Na falta de informações estatísticas, o Resource Manager usará níveis de assinatura de thread de hardware para tomar decisões de alocação de recursos e migração. Para obter mais informações sobre os níveis de assinatura, consulte IExecutionResource::CurrentSubscriptionLevel.
Confira também
Namespace de simultaneidade
PolicyElementKey
Classe SchedulerPolicy
Estrutura IExecutionContext
Estrutura IThreadProxy
Estrutura IVirtualProcessorRoot
Estrutura IResourceManager