IScheduler-Struktur
Eine Schnittstelle zu der Abstraktion eines Arbeitsplaners. Der Ressourcen-Manager der Concurrency Runtime kommuniziert mithilfe dieser Schnittstelle mit Arbeitsplanern.
Syntax
struct IScheduler;
Member
Öffentliche Methoden
Name | Beschreibung |
---|---|
IScheduler::AddVirtualProcessors | Stellt einen Scheduler mit einer Reihe von virtuellen Prozessorwurzeln für die Verwendung bereit. Jede IVirtualProcessorRoot Schnittstelle stellt das Recht dar, einen einzelnen Thread auszuführen, der im Auftrag des Schedulers Arbeiten ausführen kann. |
IScheduler::GetId | Gibt einen eindeutigen Bezeichner für den Scheduler zurück. |
IScheduler::GetPolicy | Gibt eine Kopie der Richtlinie des Zeitplans zurück. Weitere Informationen zu Zeitplanrichtlinien finden Sie unter SchedulerPolicy. |
IScheduler::NotifyResourcesExternallyBusy | Benachrichtigt diesen Scheduler, dass die Hardwarethreads, die durch die Gruppe der virtuellen Prozessorwurzeln im Array ppVirtualProcessorRoots dargestellt werden, jetzt von anderen Planern verwendet werden. |
IScheduler::NotifyResourcesExternallyIdle | Benachrichtigt diesen Scheduler, dass die Hardwarethreads, die durch die Gruppe der virtuellen Prozessorwurzeln im Array ppVirtualProcessorRoots dargestellt werden, nicht von anderen Planern verwendet werden. |
IScheduler::RemoveVirtualProcessors | Initiiert das Entfernen von virtuellen Prozessorwurzeln, die zuvor diesem Zeitplan zugeordnet wurden. |
IScheduler::Statistics | Stellt Informationen zu den Ankunfts- und Vervollständigungsraten des Vorgangs und zur Änderung der Warteschlangenlänge für einen Planer bereit. |
Hinweise
Wenn Sie einen benutzerdefinierten Zeitplan implementieren, der mit dem Ressourcen-Manager kommuniziert, sollten Sie eine Implementierung der IScheduler
Schnittstelle bereitstellen. Diese Schnittstelle ist ein Ende einer bidirektionale Kommunikation zwischen einem Planer und dem Ressourcen-Manager. Das andere Ende wird durch die IResourceManager
schnittstellen ISchedulerProxy
dargestellt, die vom Ressourcen-Manager implementiert werden.
Vererbungshierarchie
IScheduler
Anforderungen
Kopfzeile: concrtrm.h
Namespace: Parallelität
IScheduler::AddVirtualProcessors-Methode
Stellt einen Scheduler mit einer Reihe von virtuellen Prozessorwurzeln für die Verwendung bereit. Jede IVirtualProcessorRoot
Schnittstelle stellt das Recht dar, einen einzelnen Thread auszuführen, der im Auftrag des Schedulers Arbeiten ausführen kann.
virtual void AddVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parameter
ppVirtualProcessorRoots
Ein Array von IVirtualProcessorRoot
Schnittstellen, die die virtuellen Prozessorwurzeln darstellen, die dem Scheduler hinzugefügt werden.
count
Die Anzahl der IVirtualProcessorRoot
Schnittstellen im Array.
Hinweise
Der Ressourcen-Manager ruft die AddVirtualProcessor
Methode auf, um einem Planer einen anfänglichen Satz virtueller Prozessorwurzeln zu gewähren. Sie könnte auch die Methode aufrufen, um dem Scheduler virtuelle Prozessorwurzeln hinzuzufügen, wenn sie Ressourcen zwischen Planern neu ausbalanciert.
IScheduler::GetId-Methode
Gibt einen eindeutigen Bezeichner für den Scheduler zurück.
virtual unsigned int GetId() const = 0;
Rückgabewert
Ein eindeutiger ganzzahliger Bezeichner.
Hinweise
Sie sollten die GetSchedulerId-Funktion verwenden, um einen eindeutigen Bezeichner für das Objekt abzurufen, das die IScheduler
Schnittstelle implementiert, bevor Sie die Schnittstelle als Parameter für Methoden verwenden, die vom Ressourcen-Manager bereitgestellt werden. Es wird erwartet, dass Sie denselben Bezeichner zurückgeben, wenn die GetId
Funktion aufgerufen wird.
Ein von einer anderen Quelle abgerufener Bezeichner kann zu einem nicht definierten Verhalten führen.
IScheduler::GetPolicy-Methode
Gibt eine Kopie der Richtlinie des Zeitplans zurück. Weitere Informationen zu Zeitplanrichtlinien finden Sie unter SchedulerPolicy.
virtual SchedulerPolicy GetPolicy() const = 0;
Rückgabewert
Eine Kopie der Richtlinie des Planers.
IScheduler::NotifyResourcesExternallyBusy-Methode
Benachrichtigt diesen Scheduler, dass die Hardwarethreads, die durch die Gruppe der virtuellen Prozessorwurzeln im Array ppVirtualProcessorRoots
dargestellt werden, jetzt von anderen Planern verwendet werden.
virtual void NotifyResourcesExternallyBusy(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parameter
ppVirtualProcessorRoots
Ein Array von IVirtualProcessorRoot
Schnittstellen, die den Hardwarethreads zugeordnet sind, für die andere Scheduler ausgelastet sind.
count
Die Anzahl der IVirtualProcessorRoot
Schnittstellen im Array.
Hinweise
Es ist möglich, dass ein bestimmter Hardwarethread gleichzeitig mehreren Schedulern zugewiesen werden kann. Ein Grund hierfür könnte sein, dass nicht genügend Hardwarethreads auf dem System vorhanden sind, um die minimale Parallelität für alle Planer zu erfüllen, ohne Ressourcen freizugeben. Eine weitere Möglichkeit besteht darin, dass Ressourcen vorübergehend anderen Schedulern zugewiesen werden, wenn der besitzereigene Planer sie nicht verwendet, und zwar über alle virtuellen Prozessorwurzeln in diesem Hardwarethread, der deaktiviert wird.
Die Abonnementebene eines Hardwarethreads wird durch die Anzahl der abonnierten Threads und aktivierten virtuellen Prozessorstamms angegeben, die diesem Hardwarethread zugeordnet sind. Aus sicht eines bestimmten Planers ist die externe Abonnementebene eines Hardwarethreads der Teil des Abonnements, zu dem andere Planer beitragen. Benachrichtigungen, dass Ressourcen extern ausgelastet sind, werden an einen Planer gesendet, wenn die externe Abonnementebene für einen Hardwarethread von Null in ein positives Gebiet wechselt.
Benachrichtigungen über diese Methode werden nur an Scheduler gesendet, die über eine Richtlinie verfügen, bei der der Wert für den MinConcurrency
Richtlinienschlüssel dem Wert für den MaxConcurrency
Richtlinienschlüssel entspricht. Weitere Informationen zu Zeitplanrichtlinien finden Sie unter SchedulerPolicy.
Ein Planer, der für Benachrichtigungen qualifiziert ist, erhält beim Erstellen eine Reihe von anfänglichen Benachrichtigungen und informiert ihn darüber, ob die soeben zugewiesenen Ressourcen extern ausgelastet oder im Leerlauf sind.
IScheduler::NotifyResourcesExternallyIdle-Methode
Benachrichtigt diesen Scheduler, dass die Hardwarethreads, die durch die Gruppe der virtuellen Prozessorwurzeln im Array ppVirtualProcessorRoots
dargestellt werden, nicht von anderen Planern verwendet werden.
virtual void NotifyResourcesExternallyIdle(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parameter
ppVirtualProcessorRoots
Ein Array von IVirtualProcessorRoot
Schnittstellen, die Hardwarethreads zugeordnet sind, für die andere Scheduler im Leerlauf sind.
count
Die Anzahl der IVirtualProcessorRoot
Schnittstellen im Array.
Hinweise
Es ist möglich, dass ein bestimmter Hardwarethread gleichzeitig mehreren Schedulern zugewiesen werden kann. Ein Grund hierfür könnte sein, dass nicht genügend Hardwarethreads auf dem System vorhanden sind, um die minimale Parallelität für alle Planer zu erfüllen, ohne Ressourcen freizugeben. Eine weitere Möglichkeit besteht darin, dass Ressourcen vorübergehend anderen Schedulern zugewiesen werden, wenn der besitzereigene Planer sie nicht verwendet, und zwar über alle virtuellen Prozessorwurzeln in diesem Hardwarethread, der deaktiviert wird.
Die Abonnementebene eines Hardwarethreads wird durch die Anzahl der abonnierten Threads und aktivierten virtuellen Prozessorstamms angegeben, die diesem Hardwarethread zugeordnet sind. Aus sicht eines bestimmten Planers ist die externe Abonnementebene eines Hardwarethreads der Teil des Abonnements, zu dem andere Planer beitragen. Benachrichtigungen, dass Ressourcen extern ausgelastet sind, werden an einen Planer gesendet, wenn die externe Abonnementebene für einen Hardwarethread aus einem vorherigen positiven Wert auf Null fällt.
Benachrichtigungen über diese Methode werden nur an Scheduler gesendet, die über eine Richtlinie verfügen, bei der der Wert für den MinConcurrency
Richtlinienschlüssel dem Wert für den MaxConcurrency
Richtlinienschlüssel entspricht. Weitere Informationen zu Zeitplanrichtlinien finden Sie unter SchedulerPolicy.
Ein Planer, der für Benachrichtigungen qualifiziert ist, erhält beim Erstellen eine Reihe von anfänglichen Benachrichtigungen und informiert ihn darüber, ob die soeben zugewiesenen Ressourcen extern ausgelastet oder im Leerlauf sind.
IScheduler::RemoveVirtualProcessors-Methode
Initiiert das Entfernen von virtuellen Prozessorwurzeln, die zuvor diesem Zeitplan zugeordnet wurden.
virtual void RemoveVirtualProcessors(
_In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
unsigned int count) = 0;
Parameter
ppVirtualProcessorRoots
Ein Array von IVirtualProcessorRoot
Schnittstellen, die die zu entfernenden virtuellen Prozessorwurzeln darstellen.
count
Die Anzahl der IVirtualProcessorRoot
Schnittstellen im Array.
Hinweise
Der Ressourcen-Manager ruft die RemoveVirtualProcessors
Methode auf, um einen Satz virtueller Prozessorwurzeln von einem Planer zurückzunehmen. Der Scheduler wird erwartet, dass die Remove-Methode auf jeder Schnittstelle aufgerufen wird, wenn sie mit den virtuellen Prozessorwurzeln erfolgt. Verwenden Sie keine IVirtualProcessorRoot
Schnittstelle, nachdem Sie die Remove
Methode aufgerufen haben.
Der Parameter ppVirtualProcessorRoots
verweist auf ein Array von Schnittstellen. Unter den zu entfernenden virtuellen Prozessorwurzeln können die Wurzeln noch nie mit der Remove
Methode zurückgegeben werden. Die Stämme, die aktiviert wurden und entweder Arbeiten ausführen oder deaktiviert wurden und auf die Eintreffen der Arbeit warten, sollten asynchron zurückgegeben werden. Der Scheduler muss jeden Versuch unternehmen, den Stamm des virtuellen Prozessors so schnell wie möglich zu entfernen. Das Verzögern der Entfernung der virtuellen Prozessorwurzeln kann zu unbeabsichtigter Überschreibung innerhalb des Zeitplans führen.
IScheduler::Statistics-Methode
Stellt Informationen zu den Ankunfts- und Vervollständigungsraten des Vorgangs und zur Änderung der Warteschlangenlänge für einen Planer bereit.
virtual void Statistics(
_Out_ unsigned int* pTaskCompletionRate,
_Out_ unsigned int* pTaskArrivalRate,
_Out_ unsigned int* pNumberOfTasksEnqueued) = 0;
Parameter
pTaskCompletionRate
Die Anzahl der Vorgänge, die seit dem letzten Aufruf dieser Methode vom Scheduler abgeschlossen wurden.
pTaskArrivalRate
Die Anzahl der Vorgänge, die seit dem letzten Aufruf dieser Methode im Scheduler eingegangen sind.
pNumberOfTasksEnqueued
Die Gesamtanzahl der Vorgänge in allen Planerwarteschlangen.
Hinweise
Diese Methode wird vom Ressourcen-Manager aufgerufen, um Statistiken für einen Planer zu sammeln. Die hier gesammelten Statistiken werden verwendet, um dynamische Feedbackalgorithmen zu fördern, um festzustellen, wann es geeignet ist, dem Zeitplaner weitere Ressourcen zuzuweisen und wann Ressourcen weggenommen werden sollen. Die vom Scheduler bereitgestellten Werte können optimistisch sein und müssen nicht unbedingt die aktuelle Anzahl genau wiedergeben.
Sie sollten diese Methode implementieren, wenn der Ressourcen-Manager Feedback zu solchen Dingen wie der Ankunft von Vorgängen verwenden soll, um zu bestimmen, wie die Ressource zwischen Ihrem Planer und anderen Planern ausgeglichen werden soll, die beim Ressourcen-Manager registriert sind. Wenn Sie sich entscheiden, keine Statistiken zu sammeln, können Sie den Richtlinienschlüssel DynamicProgressFeedback
auf den Wert DynamicProgressFeedbackDisabled
in der Richtlinie des Zeitplans festlegen, und der Ressourcen-Manager ruft diese Methode nicht für den Zeitplan auf.
Wenn keine statistischen Informationen vorhanden sind, verwendet der Ressourcen-Manager Hardwarethreadabonnementebenen, um Ressourcenzuordnungs- und Migrationsentscheidungen zu treffen. Weitere Informationen zu Abonnementebenen finden Sie unter "IExecutionResource::CurrentSubscriptionLevel".
Siehe auch
Concurrency-Namespace
PolicyElementKey
SchedulerPolicy-Klasse
IExecutionContext-Struktur
IThreadProxy-Struktur
IVirtualProcessorRoot-Struktur
IResourceManager-Struktur