Partager via


Groupes de planification

Ce document décrit le rôle des groupes de planification pendant le runtime d'accès concurrentiel. Un groupe de planification affine, ou regroupe, des tâches connexes. Chaque planificateur possède un ou plusieurs groupes de planification. Utilisez des groupes de planification lorsque vous avez besoin d'un niveau élevé de localité pour les tâches, par exemple, lorsqu'un groupe de tâches connexes tire profit d'une exécution sur le même nœud du processeur. À l'inverse, utilisez des instances du planificateur lorsque votre application dispose de spécifications de qualité spécifiques, par exemple, lorsque vous souhaitez limiter la quantité de ressources de traitement qui sont allouées à un groupe de tâches. Pour plus d'informations sur les instances du planificateur, consultez Instances de planificateur.

Conseil

Le runtime d'accès concurrentiel fournit un planificateur par défaut. Par conséquent, vous n'êtes pas tenu d'en créer un dans votre application.Étant donné que le planificateur de tâches vous aide à affiner les performances de vos applications, nous vous recommandons de commencer avec la Bibliothèque de modèles parallèles ou la Bibliothèque d'agents asynchrones si vous ne connaissez pas encore le runtime d'accès concurrentiel.

Chaque objet Scheduler a un groupe de planification par défaut pour chaque nœud de planification. Un nœud de planification est mappé à la topologie de système sous-jacente. Le runtime crée un nœud de planification pour chaque package de processeur ou nœud NUMA (Non-Uniform Memory Architecture), le nombre le plus grand étant retenu. Si vous n'associez pas explicitement une tâche à un groupe de planification, le planificateur choisit le groupe auquel la tâche est ajoutée.

La stratégie du planificateur SchedulingProtocol influence l'ordre dans lequel le planificateur exécute les tâches dans chaque groupe de planification. Lorsque SchedulingProtocol a la valeur EnhanceScheduleGroupLocality (qui est la valeur par défaut), le Planificateur de tâches sélectionne la tâche suivante dans le groupe de planification sur lequel il travaille lorsque la tâche actuelle se termine ou cède ses ressources de manière coopérative. Le Planificateur de tâches recherche un travail dans le groupe de planification actuel avant de passer au groupe disponible suivant. Inversement, lorsque SchedulingProtocol a la valeur EnhanceForwardProgress, le planificateur passe au groupe de planification suivant après la fin de chaque tâche. Pour obtenir un exemple qui compare ces stratégies, consultez Comment : utiliser des groupes de planifications pour influencer l'ordre d'exécution.

Le runtime utilise la classe Concurrency::ScheduleGroup pour représenter des groupes de planification. Pour créer un objet ScheduleGroup, appelez les méthodes concurrency::CurrentScheduler::CreateScheduleGroup ou concurrency::Scheduler::CreateScheduleGroup. Le runtime utilise un mécanisme de décompte de références pour contrôler la durée de vie des objets ScheduleGroup, tout comme il le fait pour les objets Scheduler. Lorsque vous créez un objet ScheduleGroup, le runtime affecte la valeur « un » au compteur de références. La méthode concurrency::ScheduleGroup::Reference incrémente d'une unité le compteur de références. La méthode concurrency::ScheduleGroup::Release décrémente d'une unité le compteur de références.

Dans le runtime d'accès concurrentiel, de nombreux types vous permettent d'associer un objet à un groupe de planification. Par exemple, la classe concurrency::agent et les classes de blocs de messages telles que concurrency::unbounded_buffer, concurrency::join et concurrency::timer, fournissent des versions surchargées du constructeur qui prennent un objet ScheduleGroup. Le runtime utilise l'objet Scheduler associé à cet objet ScheduleGroup pour planifier la tâche.

Utilisez également la méthode concurrency::ScheduleGroup::ScheduleTask pour planifier une tâche légère. Pour plus d'informations sur les tâches légères, consultez Tâches légères.

Exemple

Pour obtenir un exemple qui utilise des groupes de planification pour contrôler l'ordre d'exécution des tâches, consultez Comment : utiliser des groupes de planifications pour influencer l'ordre d'exécution.

Voir aussi

Tâches

Comment : utiliser des groupes de planifications pour influencer l'ordre d'exécution

Concepts

Planificateur de tâches (runtime d'accès concurrentiel)

Instances de planificateur