Partilhar via


Estrutura IScheduler

Uma interface para uma abstração de um agendador de trabalho. O Gestor de Recursos do Concurrent Runtime utiliza esta interface para comunicar com os agendadores de trabalho.

Sintaxe

struct IScheduler;

Membros

Métodos Públicos

Nome Description
IScheduler::AddVirtualProcessors Fornece um escalonador com um conjunto de raízes virtuais de processador para o seu uso. Cada IVirtualProcessorRoot interface representa o direito de executar um único thread que pode realizar trabalho em nome do escalonador.
IScheduler::GetId Devolve um identificador único para o agendador.
IScheduler::GetPolicy Devolve uma cópia da política do agendador. Para mais informações sobre políticas de agendadores, consulte SchedulerPolicy.
IScheduler::NotifyResourcesExternallyBusy Notifica este escalonador de que as threads de hardware representadas pelo conjunto de raízes de processadores virtuais no array ppVirtualProcessorRoots estão agora a ser usadas por outros escalonadores.
IScheduler::NotifyResourcesExternallyIdle Notifica este escalonador que as threads de processamento de hardware representadas pelo conjunto de raízes de processadores virtuais no array ppVirtualProcessorRoots não estão a ser usadas por outros escalonadores.
IScheduler::RemoveVirtualProcessors Inicia a remoção de raízes de processadores virtuais que foram previamente alocadas a este escalonador.
IScheduler::Estatísticas Fornece informações relacionadas com as taxas de chegada e conclusão de tarefas, bem como a alteração do comprimento da fila para um agendador.

Observações

Se está a implementar um agendador personalizado que comunica com o Gestor de Recursos, deve fornecer uma implementação da IScheduler interface. Esta interface é uma das extremidades de um canal bidirecional de comunicação entre um agendador e o Gestor de Recursos. A outra extremidade é representada pelas interfaces IResourceManager e ISchedulerProxy, que são implementadas pelo Gestor de Recursos.

Hierarquia de herança

IScheduler

Requerimentos

Cabeçalho: concrtrm.h

Namespace: simultaneidade

IScheduler::Método AddVirtualProcessors

Fornece um escalonador com um conjunto de raízes virtuais de processador para o seu uso. Cada IVirtualProcessorRoot interface representa o direito de executar um único thread que pode realizar trabalho em nome do escalonador.

virtual void AddVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parâmetros

ppVirtualProcessorRoots
Um conjunto de IVirtualProcessorRoot interfaces que representam as raízes do processador virtual a serem adicionadas ao escalonador.

count
O número de IVirtualProcessorRoot interfaces na matriz.

Observações

O Gestor de Recursos invoca o AddVirtualProcessor método para conceder um conjunto inicial de raízes virtuais de processador a um agendador. Também poderia invocar o método para adicionar raízes de processador virtual ao escalonador quando este reequilibra recursos entre os escalonadores.

Método IScheduler::GetId

Devolve um identificador único para o agendador.

virtual unsigned int GetId() const = 0;

Valor de retorno

Um identificador inteiro único.

Observações

Deve usar a função GetSchedulerId para obter um identificador único para o objeto que implementa a IScheduler interface, antes de usar a interface como parâmetro para os métodos fornecidos pelo Gestor de Recursos. Espera-se que devolvas o mesmo identificador quando a GetId função é invocada.

Um identificador obtido de uma fonte diferente pode resultar num comportamento indefinido.

IScheduler::GetPolicy Método

Retorna uma cópia da política do agendador. Para mais informações sobre políticas de agendadores, consulte SchedulerPolicy.

virtual SchedulerPolicy GetPolicy() const = 0;

Valor de retorno

Uma cópia da política do agendador.

IScheduler::NotifyResourcesExternallyBusy Método

Notifica este escalonador que as threads de hardware representadas pelo conjunto de raízes virtuais do processador no array ppVirtualProcessorRoots estão a serem utilizadas por outros escalonadores.

virtual void NotifyResourcesExternallyBusy(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parâmetros

ppVirtualProcessorRoots
Um conjunto de IVirtualProcessorRoot interfaces associadas aos threads de hardware nas quais outros escalonadores ficaram ocupados.

count
O número de IVirtualProcessorRoot interfaces na matriz.

Observações

É possível que um determinado thread de hardware seja atribuído a múltiplos escalonadores ao mesmo tempo. Uma razão para isto pode ser que não existem threads de hardware suficientes no sistema para satisfazer o nível mínimo de concorrência para todos os escalonadores, sem partilha de recursos. Outra possibilidade é que os recursos sejam temporariamente atribuídos a outros escalonadores quando o escalonador proprietário não os está a usar, através da desativação de todas as raízes virtuais do processador nessa thread de hardware.

O nível de subscrição de uma thread de hardware é indicado pelo número de threads subscritos e raízes de processadores virtuais ativadas associadas a essa thread de hardware. Do ponto de vista de um agendador específico, o nível de subscrição externa de um encadeamento de hardware é a parte da subscrição para a qual outros agendadores contribuem. Notificações de que os recursos estão ocupados externamente são enviadas para um agendador quando o nível de subscrição externa de um thread de hardware muda de zero para um valor positivo.

As notificações através deste método são enviadas apenas a agendadores que tenham uma política onde o valor da MinConcurrency chave da política é igual ao valor da MaxConcurrency chave da política. Para mais informações sobre políticas de agendadores, consulte SchedulerPolicy.

Um agendador que se qualifica para notificações recebe um conjunto inicial de notificações quando é criado, informando-o se os recursos que lhe foram atribuídos estão ocupados externamente ou inativos.

IScheduler::NotifyResourcesExternallyIdle Método

Notifica este escalonador que as threads de processamento de hardware representadas pelo conjunto de raízes de processadores virtuais no array ppVirtualProcessorRoots não estão a ser usadas por outros escalonadores.

virtual void NotifyResourcesExternallyIdle(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parâmetros

ppVirtualProcessorRoots
Um conjunto de IVirtualProcessorRoot interfaces associadas a threads de hardware nas quais outros escalonadores ficaram inativos.

count
O número de IVirtualProcessorRoot interfaces na matriz.

Observações

É possível que um determinado thread de hardware seja atribuído a múltiplos escalonadores ao mesmo tempo. Uma razão para isso pode ser a falta de threads de hardware suficientes no sistema para satisfazer a concorrência mínima de todos os escalonadores, sem compartilhamento de recursos. Outra possibilidade é que os recursos sejam temporariamente atribuídos a outros escalonadores quando o escalonador proprietário não os está a utilizar, através de todas as raízes virtuais do processador nesse thread de hardware serem desativadas.

O nível de subscrição de uma thread de hardware é denotado pelo número de threads inscritas e raízes de processadores virtuais ativadas associadas a essa thread de hardware. Do ponto de vista de um escalonador particular, o nível de subscrição externa de um thread de hardware é a parte da subscrição para a qual outros escalonadores contribuem. Notificações de que os recursos estão ocupados externamente são enviadas para o scheduler quando o nível de subscrição externa de uma thread de hardware cai para zero a partir de um valor positivo anterior.

As notificações através deste método são enviadas apenas a agendadores que tenham uma política onde o valor da MinConcurrency chave da política é igual ao valor da MaxConcurrency chave da política. Para mais informações sobre políticas de agendadores, consulte SchedulerPolicy.

Um agendador que se qualifica para notificações recebe um conjunto inicial de notificações quando é criado, informando-o se os recursos que lhe foram atribuídos estão ocupados externamente ou inativos.

IScheduler::RemoveVirtualProcessors Método

Inicia a remoção de raízes de processadores virtuais que foram previamente alocadas a este escalonador.

virtual void RemoveVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parâmetros

ppVirtualProcessorRoots
Um conjunto de IVirtualProcessorRoot interfaces que representam as raízes do processador virtual a serem removidas.

count
O número de IVirtualProcessorRoot interfaces na matriz.

Observações

O Gestor de Recursos invoca o RemoveVirtualProcessors método para recuperar um conjunto de raízes virtuais de processador a partir de um agendador. Espera-se que o agendador invoque o método Remove em cada interface quando terminar com as raízes dos processadores virtuais. Não uses uma IVirtualProcessorRoot interface depois de teres invocado o Remove método nela.

O parâmetro ppVirtualProcessorRoots aponta para um conjunto de interfaces. Entre o conjunto de raízes virtuais do processador a remover, as raízes nunca ativadas podem ser retornadas imediatamente usando o Remove método. As raízes que foram ativadas e estão a executar trabalho, ou foram desativadas e estão à espera da chegada do trabalho, devem ser devolvidas de forma assíncrona. O agendador deve fazer todas as tentativas para remover a raiz do processador virtual o mais rapidamente possível. Atrasar a remoção das raízes do processador virtual pode resultar numa sobresubscrição não intencional dentro do agendador.

IScheduler::Método de Estatística

Fornece informações relacionadas com as taxas de chegada e conclusão de tarefas, bem como a alteração do comprimento da fila para um agendador.

virtual void Statistics(
    _Out_ unsigned int* pTaskCompletionRate,
    _Out_ unsigned int* pTaskArrivalRate,
    _Out_ unsigned int* pNumberOfTasksEnqueued) = 0;

Parâmetros

pTaxaConclusãoTarefas
O número de tarefas que foram concluídas pelo agendador desde a última chamada a este método.

pTaxaDeChegadaDeTarefa
O número de tarefas que chegaram ao agendador desde a última chamada para este método.

pNumberOfTasksEnqueued
O número total de tarefas em todas as filas do agendador de tarefas.

Observações

Este método é invocado pelo Gestor de Recursos para recolher estatísticas para um agendador. As estatísticas aqui recolhidas serão usadas para impulsionar algoritmos de feedback dinâmico para determinar quando é apropriado atribuir mais recursos ao agendador e quando retirar recursos. Os valores fornecidos pelo agendador podem ser otimistas e não têm necessariamente de refletir com precisão a contagem atual.

Deve implementar este método se quiser que o Gestor de Recursos utilize o feedback sobre aspetos como a chegada de tarefas para determinar como equilibrar recursos entre o seu agendador e outros agendadores registados no Gestor de Recursos. Se optar por não recolher estatísticas, pode definir a chave DynamicProgressFeedback da política para o valor DynamicProgressFeedbackDisabled na política do seu agendador, e o Gestor de Recursos não invocará este método no seu agendador.

Na ausência de informação estatística, o Gestor de Recursos utilizará níveis de subscrição de threads de hardware para tomar decisões de alocação e migração de recursos. Para mais informações sobre níveis de subscrição, consulte IExecutionResource::CurrentSubscriptionLevel.

Consulte também

concorrência Namespace
PolicyElementKey
Classe de SchedulerPolicy
IExecutionContext Structure
Estrutura IThreadProxy
IVirtualProcessorRoot Structure
Estrutura IResourceManager