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. Prenons l'exemple d'une application qui exige que certaines tâches utilisent des threads planifiables en mode utilisateur (UMS, User-Mode Schedulable) et que d'autres tâches utilisent le mécanisme de threading normal. Vous pouvez créer deux instances du planificateur : une qui spécifie la création des threads UMS dans le cadre de la stratégie du planificateur et une autre qui spécifie des threads normaux dans le cadre de la stratégie du planificateur. Pour plus d'informations sur la planification UMS, consultez Planification en mode utilisateur.

Les stratégies du planificateur vous permettent également de répartir les ressources de traitement disponibles et d'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'ê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.

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 les 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 s'il faut utiliser des threads normaux ou des threads UMS pour planifier des tâches.

ThreadScheduler (utilisez des threads normaux)

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

Valeur Concurrency::SchedulingProtocolType qui spécifie l'algorithme de planification à utiliser.

EnhanceScheduleGroupLocality

DynamicProgressFeedback

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   N'affectez pas à cette stratégie la valeur ProgressFeedbackDisabled. L'utilisation de ProgressFeedbackDisabled est réservée au 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. Par exemple, la valeur de stratégie UMSThreadDefault spécifie que le planificateur utilise des threads UMS si cette fonctionnalité est disponible sur le système d'exploitation (par exemple, la version 64 bits de Windows 7). Si les threads UMS ne sont pas disponibles, le planificateur affecte à cette valeur de stratégie la valeur ThreadScheduler, laquelle spécifie que le planificateur doit utiliser des threads normaux.

Exemple

Pour obtenir 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)

Historique des modifications

Date

Historique

Motif

Juillet 2010

Réorganisation du contenu.

Améliorations apportées aux informations.