Partager via


Stratégies de planificateur

Ce document décrit le rôle des stratégies du planificateur dans le runtime d'accès concurrentiel. Une stratégie du planificateur contrôle la stratégie utilisée par le planificateur lorsqu'il gère des tâches. Par exemple, considérez une requête qui nécessite des tâches à exécuter sur THREAD_PRIORITY_NORMAL et d'autres tâches à exécuter sur THREAD_PRIORITY_HIGHEST. Vous pouvez créer deux instances du planificateur : un qui spécifie la stratégie ContextPriority pour être THREAD_PRIORITY_NORMAL et un autre qui spécifient la même stratégie pour être THREAD_PRIORITY_HIGHEST.

En utilisant les stratégies du planificateur, vous pouvez répartir les ressources de traitement disponibles et assigner un jeu fixe de ressources à chaque planificateur. Par exemple, imaginez un algorithme parallèle qui ne peut pas monter en charge au-delà de quatre processeurs. Vous pouvez alors créer une stratégie de planificateur qui limite ses tâches de façon à ne pas utiliser plus de quatre processeurs simultanément.

Conseil

Le runtime d'accès concurrentiel fournit un planificateur par défaut.Par conséquent, vous n'avez pas à 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.

Lorsque vous utilisez la méthode concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create ou concurrency::Scheduler::SetDefaultSchedulerPolicy pour créer une instance du planificateur, vous fournissez un objet concurrency::SchedulerPolicy qui contient une collection de paires clé/valeur qui spécifie le comportement du planificateur. Le constructeur SchedulerPolicy prend un nombre variable d'arguments. Le premier argument est le nombre d'éléments de stratégie que vous allez spécifier. Les arguments restants sont des paires clé-valeur pour chaque élément de stratégie. L'exemple suivant crée un objet SchedulerPolicy qui spécifie trois éléments de stratégie. Le runtime utilise des valeurs par défaut pour les clés de stratégie qui ne sont pas spécifiées.

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

L'énumération concurrency::PolicyElementKey définit les clés de stratégie associées au Planificateur de tâches. Le tableau suivant décrit les clés de stratégie ainsi que la valeur par défaut que le runtime utilise pour chacune d'elles.

Clé de stratégie

Description

Valeur par défaut

SchedulerKind

Valeur concurrency::SchedulerType qui spécifie le type de threads normaux utiliser pour planifier des tâches.

ThreadScheduler (utilisez des threads normaux). Il s'agit de la seule valeur valide pour cette clé.

MaxConcurrency

Valeur unsigned int qui spécifie le nombre maximal de ressources d'accès concurrentiel utilisées par le planificateur.

concurrency::MaxExecutionResources

MinConcurrency

Valeur unsigned int qui spécifie le nombre minimal de ressources d'accès concurrentiel utilisées par le planificateur.

1

TargetOversubscriptionFactor

Valeur unsigned int qui spécifie le nombre de threads à allouer à chaque ressource de traitement.

1

LocalContextCacheSize

Valeur unsigned int qui spécifie le nombre maximal de contextes qui peuvent être mis en cache dans la file d'attente locale de chaque processeur virtuel.

8

ContextStackSize

Valeur unsigned int qui spécifie la taille de la pile, en kilo-octets, à réserver pour chaque contexte.

0 (utiliser la taille de pile par défaut)

ContextPriority

Valeur int qui spécifie la priorité de thread de chaque contexte. Il peut s'agir de toute valeur que vous pouvez passer à SetThreadPriority ou INHERIT_THREAD_PRIORITY.

THREAD_PRIORITY_NORMAL

SchedulingProtocol

Une valeur concurrency::SchedulingProtocolType qui spécifie l'algorithme de planification à utiliser.

EnhanceScheduleGroupLocality

DynamicProgressFeedback

Une valeur concurrency::DynamicProgressFeedbackType qui spécifie s'il faut rééquilibrer les ressources d'après les informations de progression basées sur les statistiques.

Remarque   Ne définissez pas cette stratégie à ProgressFeedbackDisabled car elle est réservée pour être utilisée par le runtime.

ProgressFeedbackEnabled

Chaque planificateur utilise sa propre stratégie lorsqu'il planifie des tâches. Par conséquent, les stratégies associées à un planificateur n'affectent le comportement d'aucun autre planificateur. De plus, vous ne pouvez pas modifier la stratégie du planificateur après avoir créé l'objet Scheduler.

Important

Utilisez les stratégies du planificateur uniquement pour contrôler les attributs pour les threads créés par le runtime.La modification de l'affinité ou de la priorité de thread créés par le runtime produit un comportement non défini.

Le runtime crée un planificateur par défaut à votre place si vous n'en créez pas un explicitement. Si vous souhaitez utiliser le planificateur par défaut dans votre application, mais que vous souhaitez spécifier une stratégie qui sera utilisée par ce planificateur, appelez la méthode concurrency::Scheduler::SetDefaultSchedulerPolicy avant de planifier un travail parallèle. Si vous n'appelez pas la méthode Scheduler::SetDefaultSchedulerPolicy, le runtime utilise les valeurs de stratégie par défaut fournies dans le tableau.

Utilisez les méthodes concurrency::CurrentScheduler::GetPolicy et concurrency::Scheduler::GetPolicy pour extraire une copie de la stratégie du planificateur. Les valeurs de stratégie que vous recevez de ces méthodes peuvent différer des valeurs de stratégie que vous spécifiez lors de la création du planificateur.

Exemple

Pour examiner des exemples qui utilisent des stratégies du planificateur spécifiques pour contrôler le comportement du planificateur, consultez Comment : spécifier des stratégies de planificateur et Comment : créer des agents qui utilisent des stratégies de planificateur spécifiques.

Voir aussi

Tâches

Comment : spécifier des stratégies de planificateur

Comment : créer des agents qui utilisent des stratégies de planificateur spécifiques

Concepts

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