Compartilhar via


Grupos de Cronogramas

Este documento descreve a função de grupos de agendamento no Concurrency Runtime. Um grupo de agendamento afina ou agrupa tarefas relacionadas em conjunto. Cada agendador tem um ou mais grupos agendados. Use grupos de programação quando você precisar de um alto grau de proximidade entre as tarefas, por exemplo, quando um grupo de tarefas relacionadas se beneficiarem de serem executadas no mesmo nó do processador. Por outro lado, use instâncias de agendador quando seu aplicativo tiver requisitos de qualidade específicos, por exemplo, quando você desejar limitar a quantidade de recursos de processamento alocados a um conjunto de tarefas. Para obter mais informações sobre instâncias de agendador, consulte Instâncias de agendador.

Dica

O Runtime de Simultaneidade fornece um agendador padrão e, portanto, você não precisa criar um em seu aplicativo. Como o Agendador de Tarefas ajuda você a ajustar o desempenho de seus aplicativos, é recomendável que você comece com a PPL (Biblioteca de Padrões Paralelos) ou a Biblioteca de Agentes Assíncronos se você for novo no Runtime de Simultaneidade.

Cada objeto Scheduler tem um grupo de agendamento padrão para cada nó de agendamento. Um nó de agendamento corresponde à topologia do sistema subjacente. O runtime cria um nó de agendamento para cada pacote de processador ou nó NUMA (Arquitetura de Memória Não Uniforme), dependendo de qual conta com a maior quantidade. Se você não associar explicitamente uma tarefa a um grupo de agendamento, o agendador escolherá a qual grupo adicionar a tarefa.

A política do agendador SchedulingProtocol influencia a ordem na qual o agendador executa as tarefas em cada grupo de agendamento. Quando SchedulingProtocol é definido como EnhanceScheduleGroupLocality (que é o padrão), o Agendador de Tarefas escolhe a próxima tarefa do grupo de agendamentos que está sendo processado quando a tarefa atual é concluída ou cede cooperativamente. O Agendador de Tarefas pesquisa o grupo agendado atual para trabalhar antes de passar para o próximo grupo disponível. Por outro lado, quando SchedulingProtocol está definido como EnhanceForwardProgress, o agendador passa para o próximo grupo agendado após a conclusão ou suspensão de cada tarefa. Para obter um exemplo que compara essas políticas, consulte Como usar grupos agendados para influenciar a ordem de execução.

O runtime usa a classe concurrency::ScheduleGroup para representar grupos agendados. Para criar um objeto ScheduleGroup, chame o método concurrency::CurrentScheduler::CreateScheduleGroup ou concurrency::Scheduler::CreateScheduleGroup. O runtime usa um mecanismo de contagem de referência para controlar o tempo de vida dos objetos ScheduleGroup, assim como faz com objetos Scheduler. Quando você cria um objeto ScheduleGroup, o runtime define o contador de referência como um. O método concurrency::ScheduleGroup::Reference incrementa o contador de referência em um. O método concurrency::ScheduleGroup::Release diminui o contador de referência em um.

Muitos tipos no Tempo de Execução Concorrente permitem associar um objeto a um grupo de agendamento. Por exemplo, a classe concurrency::agent e as classes de bloco de mensagem como concurrency::unbounded_buffer, concurrency::join e concurrency::timer, fornecem versões sobrecarregadas do construtor que aceitam um objeto ScheduleGroup. O runtime usa o objeto Scheduler que está associado a esse objeto ScheduleGroup para agendar a tarefa.

Você também pode usar o método concurrency::ScheduleGroup::ScheduleTask para agendar uma tarefa leve. Para obter mais informações sobre tarefas leves, confira Tarefas leves.

Exemplo

Para obter um exemplo que usa grupos agendados para controlar a ordem de execução da tarefa, consulte Como usar grupos agendados para influenciar a ordem de execução.

Confira também

Agendador de Tarefas
Instâncias de agendador
Como usar grupos agendados para influenciar a ordem de execução