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
Název | 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;
Návratová 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;
Návratová 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