Compartilhar via


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