IScheduler, structure
Interface avec une abstraction d'un planificateur de tâches. Le gestionnaire des ressources du runtime d'accès concurrentiel utilise cette interface pour communiquer avec les planificateurs de tâches.
Syntaxe
struct IScheduler;
Membres
Méthodes publiques
Nom | Description |
---|---|
IScheduler ::AddVirtualProcessors | Fournit un planificateur avec un ensemble de racines de processeur virtuel pour son utilisation. Chaque IVirtualProcessorRoot interface représente le droit d’exécuter un thread unique qui peut effectuer un travail au nom du planificateur. |
IScheduler ::GetId | Retourne un identificateur unique pour le planificateur. |
IScheduler ::GetPolicy | Retourne une copie de la stratégie du planificateur. Pour plus d’informations sur les stratégies de planificateur, consultez SchedulerPolicy. |
IScheduler ::NotifyResourcesExternallyBusy | Avertit ce planificateur que les threads matériels représentés par l’ensemble de racines de processeur virtuel dans le tableau ppVirtualProcessorRoots sont désormais utilisés par d’autres planificateurs. |
IScheduler ::NotifyResourcesExternallyIdle | Avertit ce planificateur que les threads matériels représentés par l’ensemble de racines de processeur virtuel dans le tableau ppVirtualProcessorRoots ne sont pas utilisés par d’autres planificateurs. |
IScheduler ::RemoveVirtualProcessors | Lance la suppression des racines de processeur virtuel qui ont été précédemment allouées à ce planificateur. |
IScheduler ::Statistics | Fournit des informations relatives aux taux d’arrivée et d’achèvement des tâches, ainsi qu’à la modification de la longueur de file d’attente d’un planificateur. |
Notes
Si vous implémentez un planificateur personnalisé qui communique avec Resource Manager, vous devez fournir une implémentation de l’interface IScheduler
. Cette interface est une extrémité d’un canal bidirectionnel de communication entre un planificateur et Resource Manager. L’autre extrémité est représentée par les IResourceManager
interfaces implémentées ISchedulerProxy
par Resource Manager.
Hiérarchie d'héritage
IScheduler
Spécifications
En-tête : concrtrm.h
Espace de noms : concurrency
IScheduler ::AddVirtualProcessors, méthode
Fournit un planificateur avec un ensemble de racines de processeur virtuel pour son utilisation. Chaque IVirtualProcessorRoot
interface représente le droit d’exécuter un thread unique qui peut effectuer un travail au nom du planificateur.
virtual void AddVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Paramètres
ppVirtualProcessorRoots
Tableau d’interfaces IVirtualProcessorRoot
représentant les racines du processeur virtuel ajoutées au planificateur.
count
Nombre d’interfaces IVirtualProcessorRoot
dans le tableau.
Notes
Resource Manager appelle la AddVirtualProcessor
méthode pour accorder un ensemble initial de racines de processeur virtuel à un planificateur. Il peut également appeler la méthode pour ajouter des racines de processeur virtuel au planificateur lorsqu’il rééquilibrage des ressources entre planificateurs.
IScheduler ::GetId, méthode
Retourne un identificateur unique pour le planificateur.
virtual unsigned int GetId() const = 0;
Valeur de retour
Identificateur entier unique.
Notes
Vous devez utiliser la fonction GetSchedulerId pour obtenir un identificateur unique pour l’objet qui implémente l’interface IScheduler
, avant d’utiliser l’interface comme paramètre pour les méthodes fournies par Resource Manager. Vous êtes censé retourner le même identificateur lorsque la GetId
fonction est appelée.
Un identificateur obtenu à partir d’une autre source peut entraîner un comportement non défini.
IScheduler ::GetPolicy, méthode
Retourne une copie de la stratégie du planificateur. Pour plus d’informations sur les stratégies de planificateur, consultez SchedulerPolicy.
virtual SchedulerPolicy GetPolicy() const = 0;
Valeur de retour
Copie de la stratégie du planificateur.
IScheduler ::NotifyResourcesExternallyBusy, méthode
Avertit ce planificateur que les threads matériels représentés par l’ensemble de racines de processeur virtuel dans le tableau ppVirtualProcessorRoots
sont désormais utilisés par d’autres planificateurs.
virtual void NotifyResourcesExternallyBusy(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Paramètres
ppVirtualProcessorRoots
Tableau d’interfaces IVirtualProcessorRoot
associées aux threads matériels sur lesquels d’autres planificateurs sont occupés.
count
Nombre d’interfaces IVirtualProcessorRoot
dans le tableau.
Notes
Il est possible qu’un thread matériel particulier soit affecté à plusieurs planificateurs en même temps. L’une des raisons de ce problème peut être qu’il n’existe pas suffisamment de threads matériels sur le système pour satisfaire la concurrence minimale pour tous les planificateurs, sans partager de ressources. Une autre possibilité est que les ressources sont temporairement affectées à d’autres planificateurs lorsque le planificateur propriétaire ne les utilise pas, par le biais de toutes ses racines de processeur virtuel sur ce thread matériel en cours de désactivation.
Le niveau d’abonnement d’un thread matériel est indiqué par le nombre de threads abonnés et les racines de processeur virtuel activées associées à ce thread matériel. Du point de vue d’un planificateur particulier, le niveau d’abonnement externe d’un thread matériel est la partie de l’abonnement auquel contribuent d’autres planificateurs. Les notifications indiquant que les ressources sont occupées en externe sont envoyées à un planificateur lorsque le niveau d’abonnement externe d’un thread matériel passe de zéro au territoire positif.
Les notifications via cette méthode sont envoyées uniquement aux planificateurs qui ont une stratégie où la valeur de la MinConcurrency
clé de stratégie est égale à la valeur de la MaxConcurrency
clé de stratégie. Pour plus d’informations sur les stratégies de planificateur, consultez SchedulerPolicy.
Un planificateur qui se qualifie pour les notifications obtient un ensemble de notifications initiales lors de sa création, en l’informant que les ressources qu’il vient d’affecter sont occupées en externe ou inactives.
IScheduler ::NotifyResourcesExternallyIdle, méthode
Avertit ce planificateur que les threads matériels représentés par l’ensemble de racines de processeur virtuel dans le tableau ppVirtualProcessorRoots
ne sont pas utilisés par d’autres planificateurs.
virtual void NotifyResourcesExternallyIdle(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Paramètres
ppVirtualProcessorRoots
Tableau d’interfaces IVirtualProcessorRoot
associées à des threads matériels sur lesquels d’autres planificateurs sont devenus inactifs.
count
Nombre d’interfaces IVirtualProcessorRoot
dans le tableau.
Notes
Il est possible qu’un thread matériel particulier soit affecté à plusieurs planificateurs en même temps. L’une des raisons de ce problème peut être qu’il n’existe pas suffisamment de threads matériels sur le système pour satisfaire la concurrence minimale pour tous les planificateurs, sans partager de ressources. Une autre possibilité est que les ressources sont temporairement affectées à d’autres planificateurs lorsque le planificateur propriétaire ne les utilise pas, par le biais de toutes ses racines de processeur virtuel sur ce thread matériel en cours de désactivation.
Le niveau d’abonnement d’un thread matériel est indiqué par le nombre de threads abonnés et les racines de processeur virtuel activées associées à ce thread matériel. Du point de vue d’un planificateur particulier, le niveau d’abonnement externe d’un thread matériel est la partie de l’abonnement auquel contribuent d’autres planificateurs. Les notifications indiquant que les ressources sont occupées en externe sont envoyées à un planificateur lorsque le niveau d’abonnement externe d’un thread matériel tombe à zéro d’une valeur positive précédente.
Les notifications via cette méthode sont envoyées uniquement aux planificateurs qui ont une stratégie où la valeur de la MinConcurrency
clé de stratégie est égale à la valeur de la MaxConcurrency
clé de stratégie. Pour plus d’informations sur les stratégies de planificateur, consultez SchedulerPolicy.
Un planificateur qui se qualifie pour les notifications obtient un ensemble de notifications initiales lors de sa création, en l’informant que les ressources qu’il vient d’affecter sont occupées en externe ou inactives.
IScheduler ::RemoveVirtualProcessors, méthode
Lance la suppression des racines de processeur virtuel qui ont été précédemment allouées à ce planificateur.
virtual void RemoveVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Paramètres
ppVirtualProcessorRoots
Tableau d’interfaces IVirtualProcessorRoot
représentant les racines du processeur virtuel à supprimer.
count
Nombre d’interfaces IVirtualProcessorRoot
dans le tableau.
Notes
Resource Manager appelle la RemoveVirtualProcessors
méthode pour reprendre un ensemble de racines de processeur virtuel à partir d’un planificateur. Le planificateur est censé appeler la méthode Remove sur chaque interface lorsqu’elle est effectuée avec les racines du processeur virtuel. N’utilisez pas d’interface IVirtualProcessorRoot
une fois que vous avez appelé la Remove
méthode dessus.
Le paramètre ppVirtualProcessorRoots
pointe vers un tableau d’interfaces. Parmi l’ensemble de racines de processeur virtuel à supprimer, les racines n’ont jamais été activées peuvent être retournées immédiatement à l’aide de la Remove
méthode. Les racines qui ont été activées et sont en cours d’exécution ou ont été désactivées et attendent que le travail arrive, doit être retourné de manière asynchrone. Le planificateur doit effectuer chaque tentative de suppression de la racine du processeur virtuel le plus rapidement possible. Le fait de retarder la suppression des racines du processeur virtuel peut entraîner une sursubscription involontaire dans le planificateur.
IScheduler ::Statistics, méthode
Fournit des informations relatives aux taux d’arrivée et d’achèvement des tâches, ainsi qu’à la modification de la longueur de file d’attente d’un planificateur.
virtual void Statistics(
_Out_ unsigned int* pTaskCompletionRate,
_Out_ unsigned int* pTaskArrivalRate,
_Out_ unsigned int* pNumberOfTasksEnqueued) = 0;
Paramètres
pTaskCompletionRate
Nombre de tâches effectuées par le planificateur depuis le dernier appel à cette méthode.
pTaskArrivalRate
Nombre de tâches qui sont arrivées dans le planificateur depuis le dernier appel à cette méthode.
pNumberOfTasksEnqueued
Nombre total de tâches dans toutes les files d’attente du planificateur.
Notes
Cette méthode est appelée par Resource Manager pour collecter des statistiques pour un planificateur. Les statistiques collectées ici seront utilisées pour générer des algorithmes de commentaires dynamiques afin de déterminer quand il convient d’affecter davantage de ressources au planificateur et quand retirer des ressources. Les valeurs fournies par le planificateur peuvent être optimistes et ne doivent pas nécessairement refléter le nombre actuel avec précision.
Vous devez implémenter cette méthode si vous souhaitez que Resource Manager utilise des commentaires sur des éléments tels que l’arrivée des tâches pour déterminer comment équilibrer la ressource entre votre planificateur et d’autres planificateurs inscrits auprès de Resource Manager. Si vous choisissez de ne pas collecter de statistiques, vous pouvez définir la clé DynamicProgressFeedback
de stratégie sur la valeur DynamicProgressFeedbackDisabled
dans la stratégie de votre planificateur, et Resource Manager n’appelle pas cette méthode sur votre planificateur.
En l’absence d’informations statistiques, Resource Manager utilisera les niveaux d’abonnement de threads matériels pour prendre des décisions d’allocation de ressources et de migration. Pour plus d’informations sur les niveaux d’abonnement, consultez IExecutionResource ::CurrentSubscriptionLevel.
Voir aussi
accès concurrentiel Namespace
PolicyElementKey
SchedulerPolicy, classe
IExecutionContext, structure
IThreadProxy, structure
IVirtualProcessorRoot, structure
IResourceManager, structure