Compartilhar via


Grupos de agendas

Este documento descreve a função de grupos agendados no Runtime de Simultaneidade. Um grupo agendado tem afinidades ou grupos, tarefas relacionadas em conjunto. Cada agendador tem um ou mais grupos agendados. Use grupos agendados quando você exigir um alto grau de localidade entre as tarefas, por exemplo, quando um grupo de tarefas relacionadas se beneficiar da execução 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 agendado padrão para cada nó de agendamento. Um nó de agendamento é mapeado para a topologia do sistema subjacente. O runtime cria um nó de agendamento para todo pacote de processador ou nó NUMA (Arquitetura de Memória Não Uniforme), o que tiver o maior número. 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 no grupo de agendamento que está funcionando quando a tarefa atual é concluída ou suspensa 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 Runtime de Simultaneidade permitem associar um objeto a um grupo agendado. Por exemplo, as classes de concurrency::agent e bloco de mensagens, como concurrency::unbounded_buffer, concurrency::join, e concurrency::timer, fornecem versões sobrecarregadas do construtor que levam 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