Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Trådar schemaläggs att köras utifrån deras schemaläggningsprioritet. Varje tråd tilldelas en schemaläggningsprioritet. Prioritetsnivåerna varierar från noll (lägsta prioritet) till 31 (högsta prioritet). Endast nollsidestråden kan ha en prioritet på noll. (Nollsidestråden är en systemtråd som ansvarar för att nollställa alla lediga sidor när det inte finns några andra trådar som behöver köras.)
Systemet behandlar alla trådar med samma prioritet som jämlika. Det systemet tilldelar tidskivor på ett rundgångsmetod till alla trådar med högsta prioritet. Om ingen av dessa trådar är redo att köras tilldelar systemet tidskvoter i tur och ordning till alla trådar med näst högsta prioritet. Om en tråd med högre prioritet blir tillgänglig för körning upphör systemet att köra tråden med lägre prioritet (utan att den får avsluta sitt tidskvantum) och tilldelar ett fullt tidskvantum till tråden med högre prioritet. För mer information, se kontextomkopplingar.
Prioriteten för varje tråd bestäms av följande kriterier:
- Prioritetsklassen för processen
- Prioritetsnivån för tråden inom prioritetsklassen för processen
Prioritetsklassen och prioritetsnivån kombineras för att bilda basprioritet för en tråd. Information om den dynamiska prioriteten för en tråd finns i Priority Boosts.
Prioritetsklass
Varje process tillhör någon av följande prioritetsklasser:
- IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS (HÖG PRIORITETSKLASS)
REALTIME_PRIORITY_CLASS
Som standard är prioritetsklassen för en process NORMAL_PRIORITY_CLASS. Använd funktionen CreateProcess för att ange prioritetsklassen för en underordnad process när du skapar den. Om anropsprocessen är IDLE_PRIORITY_CLASS eller BELOW_NORMAL_PRIORITY_CLASS ärver den nya processen den här klassen. Använd funktionen GetPriorityClass för att fastställa den aktuella prioritetsklassen för en process och funktionen SetPriorityClass för att ändra prioritetsklassen för en process.
Processer som övervakar systemet, till exempel skärmsläckare eller program som regelbundet uppdaterar en skärm, bör använda IDLE_PRIORITY_CLASS. Detta förhindrar att trådarna i den här processen, som inte har hög prioritet, stör trådar med högre prioritet.
Använd HIGH_PRIORITY_CLASS med försiktighet. Om en tråd körs på högsta prioritetsnivå under längre perioder får andra trådar i systemet inte processortid. Om flera trådar anges med hög prioritet samtidigt förlorar trådarna sin effektivitet. Klassen med hög prioritet bör reserveras för trådar som måste svara på tidskritiska händelser. Om ditt program utför en uppgift som kräver högprioriterad klass medan resten av dess uppgifter är normal prioritet använder du SetPriorityClass för att tillfälligt höja prioritetsklassen för programmet. minska sedan den när den tidskritiska aktiviteten har slutförts. En annan strategi är att skapa en process med hög prioritet som har alla sina trådar blockerade oftast, och väcker trådar endast när kritiska uppgifter behövs. Den viktiga punkten är att en tråd med hög prioritet ska köras under en kort tid och bara när den har tidskritiskt arbete att utföra.
Du bör nästan aldrig använda REALTIME_PRIORITY_CLASS eftersom detta avbryter systemtrådar som hanterar musinmatning, tangentbordsinmatning och diskrensning i bakgrunden. Den här klassen kan vara lämplig för program som "pratar" direkt med maskinvara eller som utför korta uppgifter som bör ha begränsade avbrott.
Prioritetsnivå
Följande är prioritetsnivåer inom varje prioritetsklass:
- THREAD_PRIORITY_IDLE
TRÅD_PRIORITET_LÄGST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
TRÅD_PRIORITET_OVAN_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_TIME_CRITICAL
Alla trådar skapas med hjälp av THREAD_PRIORITY_NORMAL. Det innebär att trådprioriteten är samma som processprioritetsklassen. När du har skapat en tråd använder du funktionen SetThreadPriority för att justera dess prioritet i förhållande till andra trådar i processen.
En vanlig strategi är att använda THREAD_PRIORITY_ABOVE_NORMAL eller THREAD_PRIORITY_HIGHEST för processens indatatråd för att säkerställa att programmet svarar mot användaren. Bakgrundstrådar, särskilt de som är processorintensiva, kan ställas in på THREAD_PRIORITY_BELOW_NORMAL eller THREAD_PRIORITY_LOWEST för att säkerställa att de kan föregripas vid behov. Men om du har en tråd som väntar på en annan tråd med lägre prioritet för att slutföra en uppgift, måste du blockera körningen av den väntande tråden med hög prioritet. Det gör du genom att använda funktionen wait, critical sectioneller funktionen Sleep, SleepExeller SwitchToThread. Det är bättre än att låta tråden köra en loop. Annars kan processen bli låst eftersom tråden med lägre prioritet aldrig schemaläggs.
Om du vill fastställa den aktuella prioritetsnivån för en tråd använder du funktionen GetThreadPriority.
Basprioritet
Processprioritetsklassen och trådprioritetsnivån kombineras för att bilda basprioriteten för varje tråd.
I följande tabell visas basprioriteten för kombinationer av processprioritetsklass och trådprioritetsvärde.
| Processprioritetsklass | Trådprioritetsnivå | Basprioritet | |
|---|---|---|---|
| IDLE_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
| LÄGSTA_TRÅDPRIORITET | 2 | ||
| Trådprioritet_under_normal | 3 | ||
| THREAD_PRIORITY_NORMAL | 4 | ||
| THREAD_PRIORITY_ABOVE_NORMAL | 5 | ||
| Tråd_Prioritet_Högst | 6 | ||
| THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
| BELOW_NORMAL_PRIORITY_CLASS | Trådprioritet_Vänteläge | 1 | |
| THREAD_PRIORITY_LOWEST | 4 | ||
| THREAD_PRIORITY_BELOW_NORMAL | 5 | ||
| TRÅD_PRIORITET_NORMAL | 6 | ||
| THREAD_PRIORITY_ABOVE_NORMAL | 7 | ||
| THREAD_PRIORITY_HÖGSTA | 8 | ||
| THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
| NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
| THREAD_PRIORITY_LÄGSTA | 6 | ||
| TRÅD_PRIORITET_UNDER_NORMAL | 7 | ||
| THREAD_PRIORITY_NORMAL | 8 | ||
| THREAD_PRIORITY_ABOVE_NORMAL | 9 | ||
| THREAD_PRIORITY_HIGHEST | 10 | ||
| THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
| ABOVE_NORMAL_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 1 | |
| Tråd_prioritet_Lägst (THREAD_PRIORITY_LOWEST) | 8 | ||
| Trådens_prioritet_under_normal | 9 | ||
| THREAD_PRIORITY_NORMAL | 10 | ||
| THREAD_PRIORITY_ABOVE_NORMAL | 11 | ||
| Trådprioritet_Högst | 12 | ||
| THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
| HIGH_PRIORITY_CLASS | Trådprioritet_Låg | 1 | |
| THREAD_PRIORITY_LOWEST | 11 | ||
| THREAD_PRIORITY_BELOW_NORMAL | 12 | ||
| TRÅD_PRIORITET_NORMAL | 13 | ||
| THREAD_PRIORITY_ABOVE_NORMAL | 14 | ||
| TRÅD_PRIORITET_HÖGSTA | 15 | ||
| THREAD_PRIORITY_TIME_CRITICAL | 15 | ||
| REALTIME_PRIORITY_CLASS | THREAD_PRIORITY_IDLE | 16 | |
| TRÅD_PRIORITET_LÄGST | 22 | ||
| Trådprioritet_Under_Normal | 23 | ||
| TRÅD_PRIORITET_NORMAL | 24 | ||
| TRÅD_PRIORITET_ÖVER_NORMAL | 25 | ||
| THREAD_PRIORITY_HIGHEST | 26 | ||
| TRÅD_PRIORITET_TIDSKRITISK | 31 | ||