Sdílet prostřednictvím


Priority plánování

Vlákna jsou naplánována tak, aby běžela na základě jejich plánovací priority. Každému vláknu je přiřazena priorita plánování. Úrovně priority jsou v rozsahu od nuly (nejnižší priorita) do 31 (nejvyšší priorita). Pouze vlákno nulové stránky může mít prioritu nuly. (Vlákno pro nulování stránek je systémové vlákno zodpovědné za nulování všech volných stránek, pokud nejsou žádná jiná vlákna, která by bylo potřeba spustit.)

Systém zachází se všemi vlákny se stejnou prioritou jako s rovnocennými. Systém přiřazuje časové řezy všem vláknům s nejvyšší prioritou ve stylu round-robin. Pokud nejsou žádná z těchto vláken připravená ke spuštění, systém přiřadí časové řezy způsobem kruhového dotazování všem vláknům s další nejvyšší prioritou. Pokud je vlákno s vyšší prioritou k dispozici ke spuštění, přestane systém spouštět vlákno s nižší prioritou (bez povolení dokončení pomocí časového řezu) a přiřadí řez na plný úvazek vláknu s vyšší prioritou. Další informace naleznete v tématu kontextové přepínače.

Priorita každého vlákna je určena následujícími kritérii:

  • Třída priority procesu
  • Úroveň priority vlákna v rámci třídy priority procesu

Třída priority a úroveň priority jsou kombinovány tak, aby vytvořily základní prioritu vlákna. Informace o dynamické prioritě vlákna naleznete v tématu Priority Boosts.

Prioritní třída

Každý proces patří do jedné z následujících tříd priority:

IDLE_PRIORITY_CLASS
Třída priority pod normální úrovní
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
TŘÍDA_VYSOKÉ_PRIORITY
Třída priorita v reálném čase (REALTIME_PRIORITY_CLASS)

Ve výchozím nastavení je třída priority procesu NORMAL_PRIORITY_CLASS. Pomocí funkce CreateProcess určete třídu priority podřízeného procesu při jeho vytvoření. Pokud je volající proces IDLE_PRIORITY_CLASS nebo BELOW_NORMAL_PRIORITY_CLASS, nový proces zdědí tuto třídu. Pomocí funkce GetPriorityClass určete aktuální třídu priority procesu a funkci SetPriorityClass ke změně třídy priority procesu.

Procesy, které monitorují systém, jako jsou šetřiče obrazovky nebo aplikace, které pravidelně aktualizují zobrazení, by měly používat IDLE_PRIORITY_CLASS. Tím zabráníte, aby vlákna tohoto procesu, která nemají vysokou prioritu, zasahovala do vláken s vyšší prioritou.

Používejte HIGH_PRIORITY_CLASS opatrně. Pokud vlákno běží na nejvyšší úrovni priority pro delší období, ostatní vlákna v systému nezískají čas procesoru. Pokud je současně nastaveno několik vláken s vysokou prioritou, vlákna ztratí svou účinnost. Třída s vysokou prioritou by měla být vyhrazena pro vlákna, která musí reagovat na události kritické pro čas. Pokud vaše aplikace provádí jednu úlohu, která vyžaduje třídu s vysokou prioritou, zatímco ostatní její úkoly jsou normální prioritou, použijte SetPriorityClass zvýšit prioritu třídy aplikace dočasně; po dokončení úkolu kritického času ho zmenšete. Další strategií je vytvořit proces s vysokou prioritou, který má všechna vlákna zablokovaná většinu času, probuzení vláken pouze v případě, že jsou potřeba kritické úlohy. Důležitým bodem je, že vlákno s vysokou prioritou by se mělo spustit po krátkou dobu a pouze v případě, že má k provedení časově kritickou práci.

Téměř nikdy byste neměli používat REALTIME_PRIORITY_CLASS, protože tím přerušíte systémová vlákna, která spravují vstup myši, vstup klávesnice a vyprazdňování disku na pozadí. Tato třída může být vhodná pro aplikace, které "komunikují" přímo s hardwarem nebo provádějí krátké úlohy, které by měly mít omezené přerušení.

Úroveň priority

V rámci každé třídy priority jsou následující úrovně priority:

THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST (nejnižší priorita vlákna)
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL (normální priorita vlákna)
THREAD_PRIORITY_ABOVE_NORMAL
Priorita_vlákna_nejvyšší
Priorita vlákna: Kritická pro čas

Všechna vlákna se vytvářejí pomocí THREAD_PRIORITY_NORMAL. To znamená, že priorita vlákna je stejná jako třída priority procesu. Po vytvoření vlákna použijte funkci SetThreadPriority k úpravě priority vzhledem k jiným vláknům v procesu.

Typickou strategií je použít THREAD_PRIORITY_ABOVE_NORMAL nebo THREAD_PRIORITY_HIGHEST pro vstupní vlákno procesu, aby aplikace reagovala na uživatele. Vlákna na pozadí, zejména ta, která jsou náročná na procesor, je možné nastavit na THREAD_PRIORITY_BELOW_NORMAL nebo THREAD_PRIORITY_LOWEST, aby je bylo možné v případě potřeby přerušit. Pokud však máte vlákno, které čeká na jiné vlákno s nižší prioritou dokončení nějaké úlohy, nezapomeňte zablokovat provádění čekající vlákna s vysokou prioritou. K tomu použijte čekací funkci , kritickou sekci nebo funkci Sleep, SleepEx, nebo funkci SwitchToThread. To je vhodnější než mít vlákno vykonávající smyčku. Jinak se proces může stát zablokován, protože vlákno s nižší prioritou není nikdy zařazeno do plánu.

Pokud chcete určit aktuální úroveň priority vlákna, použijte funkci GetThreadPriority.

Základní priorita

Úroveň priority procesu a priority vlákna jsou kombinovány tak, aby vytvořily základní prioritu každého vlákna.

Následující tabulka ukazuje základní prioritu pro kombinace třídy priority procesu a hodnoty priority vlákna.

Třída priority procesu Úroveň priority vlákna Základní priorita
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
NEJNIŽŠÍ_PRIORITA_VLÁKNA 2
THREAD_PRIORITY_BELOW_NORMAL 3
THREAD_PRIORITY_NORMAL 4
THREAD_PRIORITY_ABOVE_NORMAL 5
THREAD_PRIORITY_HIGHEST 6
KRITICKÁ PRIORITA VLAKNA CASU 15
TŘÍDA_PRIORITA_POD_NORMÁLNÍ THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 4
PRIORITA_VLÁKNA_POD_NORMÁLEM 5
Priorita_vlákna_normální 6
THREAD_PRIORITY_ABOVE_NORMAL 7
VLÁKNOVÁ_PRIORITA_NEJVYŠŠÍ 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE (Nejnižší priorita vlákna) 1
THREAD_PRIORITY_NEJNIŽŠÍ 6
THREAD_PRIORITY_BELOW_NORMAL 7
NORMÁLNÍ_PRIORITA_VLÁKNA 8
Priorita vlákna nad normální 9
THREAD_PRIORITY_HIGHEST 10
THREAD_PRIORITY_TIME_CRITICAL (priorita vlákna – časově kritická) 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
Nejnižší priorita vlákna 8
Priorita vlákna pod normálem 9
Priorita vlákna: Normální 10
THREAD_PRIORITY_ABOVE_NORMAL 11
VLÁKNO_PRIORITA_NEJVYŠŠÍ 12
THREAD_PRIORITY_TIME_CRITICAL 15
třída_vysoké_prioritě THREAD_PRIORITY_IDLE 1
NEJNIŽŠÍ_PRIORITA_VLÁKNA 11
Priorita vlákna pod normální 12
PRIORITA_VLÁKNA_NORMÁLNÍ 13
THREAD_PRIORITY_ABOVE_NORMAL 14
NEJVYŠŠÍ_PRIORITA_VLÁKNA 15
PRIORITA_VLÁKNA_ČAS_KRITICKÝ 15
Reálný čas: Priorita Třída THREAD_PRIORITY_IDLE 16
Nejnižší_priorita_vlákna 22
THREAD_PRIORITY_BELOW_NORMAL 23
Normální priorita vlákna 24
Vlákno s prioritou vyšší než normální 25
Nejvyšší_priorita_vlákna 26
THREAD_PRIORITY_TIME_CRITICAL 31