Partilhar via


Políticas de agendador

Este documento descreve a função das políticas de agendador no Runtime de Simultaneidade. Uma política de agendador controla a estratégia que o agendador usa quando gerencia tarefas. Por exemplo, considere um aplicativo que exige que algumas tarefas sejam executadas em THREAD_PRIORITY_NORMAL e outras tarefas, em THREAD_PRIORITY_HIGHEST. Você pode criar duas instâncias de agendador: uma que especifica a política ContextPriority para ser THREAD_PRIORITY_NORMAL e outra que especifica a mesma política para ser THREAD_PRIORITY_HIGHEST.

Usando políticas de agendador, você pode dividir os recursos de processamento disponíveis e atribuir um conjunto fixo de recursos a cada agendador. Por exemplo, considere um algoritmo paralelo que não é dimensionado além de quatro processadores. Você pode criar uma política de agendador que limite suas tarefas para usar não mais do que quatro processadores simultaneamente.

Dica

O Runtime de Simultaneidade fornece um agendador padrão. 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.

Quando você usa o método concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create ou concurrency::Scheduler::SetDefaultSchedulerPolicy para criar uma instância de agendador, você fornece um objeto a concurrency::SchedulerPolicy que contém uma coleção de pares chave-valor que especificam o comportamento do agendador. O construtor SchedulerPolicy usa um número variável de argumentos. O primeiro argumento é o número de elementos de política que você está prestes a especificar. Os argumentos restantes são pares chave-valor para cada elemento de política. O exemplo a seguir cria um objeto SchedulerPolicy que especifica três elementos de política. O runtime usa valores padrão para as chaves de política que não são especificadas.

SchedulerPolicy policy(3,       
   MinConcurrency, 2,
   MaxConcurrency, 4,
   ContextPriority, THREAD_PRIORITY_HIGHEST
);

A enumeração concurrency::PolicyElementKey define as chaves de política associadas ao Agendador de Tarefas. A tabela a seguir descreve as chaves de política e o valor padrão que o runtime usa para cada uma delas.

Chave de política Descrição Valor Padrão
SchedulerKind Um valor concurrency::SchedulerType que especifica o tipo de threads a ser usado para agendar tarefas. ThreadScheduler (use threads normais). Esse é o único valor válido para essa chave.
MaxConcurrency Um valor unsigned int que especifica o número máximo de recursos de simultaneidade que o agendador usa. concurrency::MaxExecutionResources
MinConcurrency Um valor unsigned int que especifica o número máximo de recursos de simultaneidade que o agendador usa. 1
TargetOversubscriptionFactor Um valor unsigned int que especifica quantos threads alocar para cada recurso de processamento. 1
LocalContextCacheSize Um valor unsigned int que especifica o número máximo de contextos que podem ser armazenados em cache na fila local de cada processador virtual. 8
ContextStackSize Um valor unsigned int que especifica o tamanho da pilha, em quilobytes, para reservar para cada contexto. 0 (use o tamanho da pilha padrão)
ContextPriority Um valor int que especifica a prioridade de thread de cada contexto. Esse pode ser qualquer valor que você pode passar para SetThreadPriority ou INHERIT_THREAD_PRIORITY. THREAD_PRIORITY_NORMAL
SchedulingProtocol Um valor concurrency::SchedulingProtocolType que especifica o algoritmo de agendamento a ser usado. EnhanceScheduleGroupLocality
DynamicProgressFeedback Um valor concurrency::D ynamicProgressFeedbackType que especifica se os recursos devem ser rebalanceados de acordo com informações de progresso baseadas em estatísticas.

Nota Não defina essa política como ProgressFeedbackDisabled porque ela está reservada para uso pelo runtime.
ProgressFeedbackEnabled

Cada agendador usa sua própria política quando agenda tarefas. As políticas associadas a um agendador não afetam o comportamento de nenhum outro agendador. Além disso, você não pode alterar a política do agendador depois de criar o objeto Scheduler.

Importante

Use somente políticas de agendador para controlar os atributos dos threads que o runtime cria. Não altere a afinidade de thread ou a prioridade dos threads criados pelo runtime, pois isso pode causar um comportamento indefinido.

O runtime criará um agendador padrão para você se você não criar explicitamente um. Se você quiser usar o agendador padrão em seu aplicativo, mas quiser especificar uma política para esse agendador usar, chame o método concurrency::Scheduler::SetDefaultSchedulerPolicy antes de agendar o trabalho paralelo. Se você não chamar o método Scheduler::SetDefaultSchedulerPolicy, o runtime usará os valores de política padrão da tabela.

Use os métodos concurrency::CurrentScheduler::GetPolicy e concurrency::Scheduler::GetPolicy para recuperar uma cópia da política do agendador. Os valores de política que você recebe desses métodos podem ser diferentes dos valores de política especificados ao criar o agendador.

Exemplo

Para examinar exemplos que usam políticas de agendador específicas para controlar o comportamento do agendador, consulte Como especificar políticas específicas do agendador e Como criar agentes que usam políticas de agendador específicas.

Confira também

Agendador de Tarefas
Como especificar políticas de agendador específicas
Como criar agentes que usam políticas de agendador específicas