Freigeben über


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