Share via


Struktura rozhraní IScheduler

Rozhraní pro abstrakci pracovního plánovače Resource Manager modulu Concurrency Runtime používá toto rozhraní ke komunikaci s pracovními plánovači.

Syntaxe

struct IScheduler;

Členové

Veřejné metody

Jméno popis
IScheduler::AddVirtualProcessors Poskytuje plánovač se sadou kořenových virtuálních procesorů pro jeho použití. Každé IVirtualProcessorRoot rozhraní představuje právo spustit jedno vlákno, které může provádět práci jménem plánovače.
IScheduler::GetId Vrátí jedinečný identifikátor plánovače.
IScheduler::GetPolicy Vrátí kopii zásad plánovače. Další informace o zásadách plánovače najdete v tématu SchedulerPolicy.
IScheduler::NotifyResourcesExternallyBusy Upozorní tohoto plánovače, že hardwarová vlákna reprezentovaná sadou kořenových virtuálních procesorů v poli ppVirtualProcessorRoots se teď používají jinými plánovači.
IScheduler::NotifyResourcesExternallyIdle Upozorní tohoto plánovače, že jiná plánovače nepoužívají hardwarová vlákna reprezentovaná sadou kořenových virtuálních procesorů v poli ppVirtualProcessorRoots .
IScheduler::RemoveVirtualProcessors Zahájí odebrání kořenových certifikátů virtuálního procesoru, které byly dříve přiděleny tomuto plánovači.
IScheduler::Statistics Poskytuje informace týkající se rychlosti doručení a dokončení úkolů a změny délky fronty pro plánovače.

Poznámky

Pokud implementujete vlastní plánovač, který komunikuje s Resource Managerem, měli byste poskytnout implementaci IScheduler rozhraní. Toto rozhraní je jedním ze dvoucestných kanálů komunikace mezi plánovačem a Resource Managerem. Druhý konec je reprezentován IResourceManager rozhraními ISchedulerProxy , která jsou implementována Resource Managerem.

Hierarchie dědičnosti

IScheduler

Požadavky

Hlavička: concrtrm.h

Obor názvů: souběžnost

IScheduler::AddVirtualProcessors – metoda

Poskytuje plánovač se sadou kořenových virtuálních procesorů pro jeho použití. Každé IVirtualProcessorRoot rozhraní představuje právo spustit jedno vlákno, které může provádět práci jménem plánovače.

virtual void AddVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parametry

ppVirtualProcessorRoots
Pole IVirtualProcessorRoot rozhraní představující kořeny virtuálního procesoru, které se přidávají do plánovače.

count
Počet IVirtualProcessorRoot rozhraní v poli.

Poznámky

Resource Manager vyvolá metodu AddVirtualProcessor pro udělení počáteční sady kořenových certifikátů virtuálního procesoru plánovači. Může také vyvolat metodu, která přidá kořeny virtuálního procesoru do plánovače, když znovu vyrovnává prostředky mezi plánovači.

IScheduler::GetId – metoda

Vrátí jedinečný identifikátor plánovače.

virtual unsigned int GetId() const = 0;

Vrácená hodnota

Jedinečný celočíselnou identifikátor.

Poznámky

Funkci GetSchedulerId byste měli použít k získání jedinečného identifikátoru objektu, který implementuje IScheduler rozhraní, před použitím rozhraní jako parametru pro metody poskytované Resource Managerem. Očekává se, že při GetId vyvolání funkce vrátíte stejný identifikátor.

Identifikátor získaný z jiného zdroje může mít za následek nedefinované chování.

IScheduler::GetPolicy – metoda

Vrátí kopii zásad plánovače. Další informace o zásadách plánovače najdete v tématu SchedulerPolicy.

virtual SchedulerPolicy GetPolicy() const = 0;

Vrácená hodnota

Kopie zásad plánovače.

IScheduler::NotifyResourcesExternallyBusy – metoda

Upozorní tohoto plánovače, že hardwarová vlákna reprezentovaná sadou kořenových virtuálních procesorů v poli ppVirtualProcessorRoots se teď používají jinými plánovači.

virtual void NotifyResourcesExternallyBusy(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parametry

ppVirtualProcessorRoots
Pole IVirtualProcessorRoot rozhraní spojených s hardwarovými vlákny, na kterých jsou zaneprázdněni ostatní plánovači.

count
Počet IVirtualProcessorRoot rozhraní v poli.

Poznámky

Určité hardwarové vlákno je možné přiřadit více plánovačům najednou. Jedním z důvodů může být, že v systému není dostatek hardwarových vláken pro splnění minimální souběžnosti pro všechny plánovače bez sdílení prostředků. Další možností je, že prostředky jsou dočasně přiřazeny jiným plánovačům, když je vlastnící plánovač nepoužívá, a to prostřednictvím všech jeho kořenových virtuálních procesorů v daném hardwarovém vlákně, které se deaktivuje.

Úroveň předplatného hardwarového vlákna je označena počtem předplatných vláken a aktivovanými kořeny virtuálních procesorů přidružených k danému hardwarovému vláknu. Z pohledu konkrétního plánovače je úroveň externího předplatného hardwarového vlákna částí předplatného, do které ostatní plánovači přispívají. Oznámení, že prostředky jsou externě zaneprázdněné, se odesílají do plánovače, když se úroveň externího předplatného hardwarového vlákna přesune z nuly na kladné území.

Oznámení prostřednictvím této metody se odesílají pouze plánovačům, které mají zásadu, ve které je hodnota MinConcurrency klíče zásady rovna MaxConcurrency hodnotě klíče zásady. Další informace o zásadách plánovače najdete v tématu SchedulerPolicy.

Plánovač, který se kvalifikuje pro oznámení, získá sadu počátečních oznámení při vytváření a informuje ho, jestli jsou prostředky, které byly právě přiřazeny, externě zaneprázdněné nebo nečinné.

IScheduler::NotifyResourcesExternallyIdle – metoda

Upozorní tohoto plánovače, že jiná plánovače nepoužívají hardwarová vlákna reprezentovaná sadou kořenových virtuálních procesorů v poli ppVirtualProcessorRoots .

virtual void NotifyResourcesExternallyIdle(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parametry

ppVirtualProcessorRoots
Pole rozhraní přidružených k IVirtualProcessorRoot hardwarovým vláknům, na kterých se ostatní plánovače staly nečinnými.

count
Počet IVirtualProcessorRoot rozhraní v poli.

Poznámky

Určité hardwarové vlákno je možné přiřadit více plánovačům najednou. Jedním z důvodů může být, že v systému není dostatek hardwarových vláken pro splnění minimální souběžnosti pro všechny plánovače bez sdílení prostředků. Další možností je, že prostředky jsou dočasně přiřazeny jiným plánovačům, když je vlastnící plánovač nepoužívá, a to prostřednictvím všech jeho kořenových virtuálních procesorů v daném hardwarovém vlákně, které se deaktivuje.

Úroveň předplatného hardwarového vlákna je označena počtem předplatných vláken a aktivovanými kořeny virtuálních procesorů přidružených k danému hardwarovému vláknu. Z pohledu konkrétního plánovače je úroveň externího předplatného hardwarového vlákna částí předplatného, do které ostatní plánovači přispívají. Oznámení, že prostředky jsou externě zaneprázdněné, se odesílají do plánovače, když úroveň externího odběru hardwarového vlákna klesne na nulu z předchozí kladné hodnoty.

Oznámení prostřednictvím této metody se odesílají pouze plánovačům, které mají zásadu, ve které je hodnota MinConcurrency klíče zásady rovna MaxConcurrency hodnotě klíče zásady. Další informace o zásadách plánovače najdete v tématu SchedulerPolicy.

Plánovač, který se kvalifikuje pro oznámení, získá sadu počátečních oznámení při vytváření a informuje ho, jestli jsou prostředky, které byly právě přiřazeny, externě zaneprázdněné nebo nečinné.

IScheduler::RemoveVirtualProcessors – metoda

Zahájí odebrání kořenových certifikátů virtuálního procesoru, které byly dříve přiděleny tomuto plánovači.

virtual void RemoveVirtualProcessors(
    _In_reads_(count) IVirtualProcessorRoot** ppVirtualProcessorRoots,
    unsigned int count) = 0;

Parametry

ppVirtualProcessorRoots
Pole IVirtualProcessorRoot rozhraní představující kořeny virtuálního procesoru, které se mají odebrat.

count
Počet IVirtualProcessorRoot rozhraní v poli.

Poznámky

Resource Manager vyvolá metodu RemoveVirtualProcessors , která vrátí sadu kořenových virtuálních procesorů z plánovače. Plánovač se očekává, že vyvolá metodu Remove v každém rozhraní, když se dokončí s kořeny virtuálního procesoru. Jakmile vyvoláte metodu, Remove nepoužívejte IVirtualProcessorRoot rozhraní.

ppVirtualProcessorRoots Parametr odkazuje na pole rozhraní. Mezi sadou kořenových certifikátů virtuálních procesorů, které se mají odebrat, se kořeny nikdy neaktivovaly, lze okamžitě vrátit pomocí Remove metody. Kořeny, které jsou aktivované a buď provádějí práci, nebo byly deaktivovány a čekají na doručení práce, by se měly vrátit asynchronně. Plánovač musí provést všechny pokusy o co nejrychlejší odebrání kořenového adresáře virtuálního procesoru. Zpoždění odebrání kořenových virtuálních procesorů může vést k neúmyslnému překročení podsítě v rámci plánovače.

IScheduler::Statistics – metoda

Poskytuje informace týkající se rychlosti doručení a dokončení úkolů a změny délky fronty pro plánovače.

virtual void Statistics(
    _Out_ unsigned int* pTaskCompletionRate,
    _Out_ unsigned int* pTaskArrivalRate,
    _Out_ unsigned int* pNumberOfTasksEnqueued) = 0;

Parametry

pTaskCompletionRate
Počet úkolů, které plánovač dokončil od posledního volání této metody

pTaskArrivalRate
Počet úkolů, které byly doručeny v plánovači od posledního volání této metody.

pNumberOfTasksEnqueued
Celkový počet úkolů ve všech frontách plánovače.

Poznámky

Tato metoda je vyvolána Resource Managerem, aby se shromáždily statistiky plánovače. Zde shromážděné statistiky se použijí k řízení algoritmů dynamické zpětné vazby k určení, kdy je vhodné přiřadit plánovači více prostředků a kdy je potřeba prostředky odvést. Hodnoty poskytované plánovačem můžou být optimistické a nemusí nutně odrážet aktuální počet přesně.

Tuto metodu byste měli implementovat, pokud chcete, aby Resource Manager používal zpětnou vazbu k takovým věcem, jako je doručení úkolu, abyste zjistili, jak vyrovnávat prostředky mezi plánovačem a dalšími plánovači zaregistrovanými v Resource Manageru. Pokud se rozhodnete neshromažďovat statistiky, můžete klíč DynamicProgressFeedback zásad nastavit na hodnotu DynamicProgressFeedbackDisabled v zásadách plánovače a Resource Manager tuto metodu v plánovači nevyvolá.

Při absenci statistických informací použije Resource Manager úrovně předplatného hardwarového vlákna k rozhodování o přidělení prostředků a migraci. Další informace o úrovních předplatného najdete v tématu IExecutionResource::CurrentSubscriptionLevel.

Viz také

concurrency – obor názvů
PolicyElementKey
SchedulerPolicy – třída
IExecutionContext – struktura
IThreadProxy – struktura
IVirtualProcessorRoot – struktura
IResourceManager – struktura