Ütemezési prioritások

A szálakat a ütemezési prioritásukalapján ütemezik. Minden szálhoz ütemezési prioritás tartozik. A prioritási szintek nulla (legalacsonyabb prioritás) és 31 (legmagasabb prioritás) között mozognak. Csak a nullaoldalas szál rendelkezhet nulla prioritással. (A nullaoldalas szál egy rendszerszál, amely felelős az ingyenes lapok nullázásáért, ha nincs más szál, amelyet futtatnia kell.)

A rendszer az összes szálat ugyanolyan prioritással kezeli, mint az egyenlőséget. A rendszer alternáló módon rendeli hozzá az időszeleteket a legmagasabb prioritású szálakhoz. Ha egyik szál sem áll készen a futtatásra, a rendszer körkörös módon rendeli hozzá az időszeleteket a következő legmagasabb prioritású szálakhoz. Ha egy magasabb prioritású szál futtathatóvá válik, a rendszer leállítja az alacsonyabb prioritású szál végrehajtását (anélkül, hogy az befejezné az időszeletét), és teljes időszeletet rendel a magasabb prioritású szálhoz. További információkért lásd: Környezetváltások.

Az egyes szálak prioritását a következő feltételek határozzák meg:

  • A folyamat prioritási osztálya
  • A szál prioritási szintje a folyamat prioritási osztályán belül

A prioritási osztály és a prioritási szint kombinálva alkotják egy szál alap prioritását. A szál dinamikus prioritásáról további információt a Prioritási kiemelésekcímű témakörben talál.

Prioritási osztály

Minden folyamat a következő prioritási osztályok egyikéhez tartozik:

IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
Normál_prioritás_osztály
ÁTLAGOSNÁL_MAGASABB_PRIORITÁS_OSZTÁLY
MAGAS_PRIORITÁS_OSZTÁLY
REALTIME_PRIORITY_CLASS

Alapértelmezés szerint a folyamat prioritási osztálya NORMAL_PRIORITY_CLASS. A CreateProcess függvénnyel adja meg a gyermekfolyamat prioritási osztályát a létrehozáskor. Ha a hívási folyamat az IDLE_PRIORITY_CLASS vagy a BELOW_NORMAL_PRIORITY_CLASS, az új folyamat örökölni fogja ezt az osztályt. A GetPriorityClass függvénnyel meghatározhatja egy folyamat aktuális prioritási osztályát, a SetPriorityClass függvény pedig a folyamat prioritási osztályát.

A rendszert figyelő folyamatoknak, például a képernyőkímélőknek vagy a kijelzőt rendszeresen frissítő alkalmazásoknak IDLE_PRIORITY_CLASS kell használniuk. Ez megakadályozza, hogy a folyamat szálai, amelyek nem rendelkeznek magas prioritással, zavarják a magasabb prioritású szálakat.

Óvatosan használja HIGH_PRIORITY_CLASS. Ha egy szál hosszabb ideig a legmagasabb prioritási szinten fut, a rendszer többi szála nem kap processzoridőt. Ha egyszerre több szál is magas prioritással van beállítva, a szálak elveszítik hatékonyságukat. A magas prioritású osztályt olyan szálak számára kell fenntartani, amelyeknek reagálnia kell az idő szempontjából kritikus eseményekre. Ha az alkalmazás egy olyan feladatot hajt végre, amely megköveteli a magas prioritású osztályt, míg a többi tevékenység normál prioritású, használja SetPriorityClass az alkalmazás prioritási osztályának ideiglenes emeléséhez; majd csökkentse azt az idő szempontjából kritikus feladat befejezése után. Egy másik stratégia egy magas prioritású folyamat létrehozása, amelynek során az összes szála blokkolva van az idő nagy részében, és csak kritikus feladatok esetén ébreszti fel a szálakat. A lényeg az, hogy egy magas prioritású szálnak rövid ideig kell futnia, és csak akkor, ha idő szempontjából kritikus fontosságú feladatokat kell elvégeznie.

Szinte soha ne használjon REALTIME_PRIORITY_CLASS, mert ez megszakítja az egérbemenetet, a billentyűzetbemenetet és a háttérlemez kiürítését kezelő rendszerszálakat. Ez az osztály alkalmas lehet olyan alkalmazásokra, amelyek közvetlenül a hardverhez "beszélnek", vagy olyan rövid feladatokat hajtanak végre, amelyeknek korlátozott megszakításokkal kell rendelkezniük.

Prioritási szint

Az egyes prioritási osztályok prioritási szintjei a következők:

THREAD_PRIORITY_IDLE
SZÁL_PRIORITÁS_LEGALACSONYABB
SZÁL_PRIORITÁS_A_NORMÁL_ALATT
Normál szálprioritás
THREAD_PRIORITY_ABOVE_NORMAL
Legmagasabb szálprioritás
KÜLÖNÖS FONTOSSÁGÚ IDŐ PRIORITÁSÚ SZÁL

Minden szál THREAD_PRIORITY_NORMAL használatával jön létre. Ez azt jelenti, hogy a szál prioritása megegyezik a folyamat prioritási osztályával. Miután létrehozott egy szálat, a SetThreadPriority függvénnyel állítsa a prioritást a folyamat többi szálához képest.

Egy tipikus stratégia a folyamat bemeneti szálához THREAD_PRIORITY_ABOVE_NORMAL vagy THREAD_PRIORITY_HIGHEST használata annak biztosítása érdekében, hogy az alkalmazás reagáljon a felhasználóra. Az olyan háttérszálak, amelyek különösen processzorigényesek, beállíthatók THREAD_PRIORITY_BELOW_NORMAL vagy THREAD_PRIORITY_LOWEST értékre, hogy szükség esetén kiszoríthatók legyenek. Ha azonban egy szál egy másik, alacsonyabb prioritású szálra vár egy feladat elvégzéséhez, mindenképpen tiltsa le a magas prioritású várakozó szál végrehajtását. Ehhez használjon egy várakozási függvényt, kritikus szakaszt, vagy a Sleep függvényt, SleepExvagy SwitchToThread függvényt. Jobb, mint ha a szál egy hurkot hajtana végre. Ellenkező esetben előfordulhat, hogy a folyamat holtpontra kerül, mert az alacsonyabb prioritású szál nincs ütemezve.

A szál aktuális prioritási szintjének meghatározásához használja a GetThreadPriority függvényt.

Alap prioritás

A folyamat prioritási osztálya és a szál prioritási szintje kombinálva alkotja az egyes szálak alap prioritását.

Az alábbi táblázat a folyamatprioritási osztály és a szál prioritási érték kombinációinak alap prioritását mutatja be.

Folyamat prioritási osztálya Szál prioritási szintje Alap prioritás
IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
Legalacsonyabb szálprioritás 2
SZÁL_PRIORITÁS_AZ_ÁTLAGOS_ALATT 3
SZÁL_PRIORITÁS_NORMÁL (THREAD_PRIORITY_NORMAL) 4
SZÁLAS_PRIORITÁS_AZ_NORMÁL_FELETT 5
THREAD_PRIORITY_HIGHEST 6
THREAD_PRIORITY_TIME_CRITICAL 15
BELOW_NORMAL_PRIORITY_CLASS SZÁL_PRIORITÁS_TÉTLEN 1
THREAD_PRIORITY_ALACSONYABB 4
THREAD_PRIORITY_BELOW_NORMAL 5
THREAD_PRIORITY_NORMAL 6
SZÁL_PRIORITÁS_AZ_ÁTLOGOS_FELETT 7
THREAD_PRIORITY_HIGHEST 8
THREAD_PRIORITY_TIME_CRITICAL 15
NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
SZÁLAK_PRIORITÁSA_LEGALACSONYABB 6
SZÁLFOLYAMAT_PRIORITÁS_A_NORMAL_ALATT 7
SZÁLF_PRIORITÁS_NORMÁLIS 8
SZÁL_PRIORITÁS_A_NORMÁL_FÖLÖTT 9
SZÁL_PRIORITÁS_LEGMAGASABB 10
SZÁL_PRIORITÁS_IDŐ_KRITIKUS 15
ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1
THREAD_PRIORITY_LOWEST 8
SZÁL_PRIORITÁS_A_NORMAL_ALATT 9
SZÁL_PRIORITÁS_NORMÁL 10
THREAD_PRIORITY_ABOVE_NORMAL 11
THREAD_PRIORITY_HIGHEST 12
SZÁLFOLYAMAT_PRIORITÁS_IDŐ_KRITIKUS 15
Magas_prioritású_osztály SZÁLFOLYAMAT_PRIORITÁS_TÉTLEN 1
THREAD_PRIORITY_LOWEST 11
THREAD_PRIORITY_BELOW_NORMAL (szál-prioritás normál alatt) 12
SZÁL_PRIORITÁS_NORMÁL 13
SZÁL_PRIORITÁS_A_NORMÁLNÁL_MAGASABB 14
SZÁLFOLYAMAT_PRIORITÁS_LEGMAGASABB 15
KIRITÉS_PRIORITÁS_IDŐ_KRITIKUS 15
REALTIME_PRIORITY_OSZTÁLY THREAD_PRIORITY_IDLE 16
SZÁL_PRIORITÁS_LEGALACSONYABB 22
THREAD_PRIORITY_ALACSONYABB_A_NORMÁLNÁL 23
THREAD_PRIORITY_NORMAL (Normál szálprioritás) 24
SZÁL_PRIORITÁS_AZ_ÁTLAG_FELETTI 25
SZÁL_PRIORITÁS_LEGMAGASABB 26
THREAD_PRIORITY_TIME_CRITICAL 31