3. Översikt av skedulering
Prioriteter
Preemption
En tråd som ska köra kan bli preemptad av en tråd med högre prioritet
Processor affinity
Kvantum
Systemets konfiguration (lång kvantum, kort kvantum, fix-storlek, variabel storlek)
Background eller foreground
4. Kernel dispatcher
Skedulerarens kod ligger utspridd i kärnan
Event som startar dispatchern
Thread -> Ready
Thread -> Slut på kvantumet || Terminate || Wait
Thread -> Ändring av prioritet
Thread -> Ändring av processor affinity
Dispatchern väljer vilken tråd som ska köras på processorn näst
Kontextbyte utförs
8. Prioritetsnivåer
När en tråd skapas så ärver den processens prioritet
När en process skapas så ärver den prioriteten från den process som skapade
den.
Att ändra en process till Real-time kan vara farligt, vissa kritiska processer i
windowskärnan körs där och OS:et kan frysa
10. Ready
Tråden väntar på att exekvera
Dispatchern väljer bara bland trådar
i detta tillstånd
11. Deffered Ready
Tråden ska köras men har inte
startat ännu
Minimerar låsningstiden på
skedulerarens databas för en viss
processor
12. Standby
Tråden ska köra näst på en viss
processor
När detta är möjligt utförs ett
kontextbyte
Bara en tråd kan finnas i standby
för varje processor
Tråden kan preemptas ur tillståndet
14. Waiting
Tråden väntar
Väntar frivilligt på ett
synkroniseringsobjekt
OS väntar på I/O
OS försätter tråden i ett
väntetillstånd
Efter väntan är slut:
Endera fortsätter den att köra
Eller så går till Ready
22. Dispatcher databas
● Datastrukturer för att bestämma skeduleringsbeslut
● Håller koll på vilka trådar som väntar och vilka trådar som körs i vilka
processorer
● Windows multiprocessorsystem har ready-köer för varje processor
● Det finns en kö för varje en av de 32 prioritetsnivåerna
● Istället för att kolla om varje kö är tom eller inte så sker en en-bits-skanning
för att hitta den högsta biten satt
○ Denna algoritm tar konstant tid
24. Kvantum
En tråd kör ett visst kvantum av tid
Om det inte finns en till tråd med samma prioritet som är Ready kör tråden
ytterliggare ett kvantum
På client-versionen av Windows kör en tråd i 2 klockintervaller
På server-versionen av Windows kör en tråd i 12 kockintervaller
Minimering av kontextändringar
Processorn bestämmer klockintervallet (cirka 15 millisekunder på x86 och x64
processorer)
25. Variabla kvantum
Om variabla kvantumet används kan en process få ett större kvantum när en av
dess trådar är i förgrunden
Kvantumet (2 eller 12) och variabla kvantum kan ställas in i Windowss Registry i
HKLMSYSTEMCurrentControlSetControlPriorityControlWin32PrioritySepa
ration
27. Prioritetsboost
Windows skedulerare använder sig av en prioritets-boost-mekanism
I många fall för att minska latency och öka responstiden
I andra fall för att inte processer ska svälta
29. När ett I/O event har avslutats
Windows ger temporära prioritets-boosts när I/O har gjorts
Denna boost ges till de trådar/processer som väntar på I/O
Större chans att de får köra snabbt
30. När GUI:n vaknar
När trådar som äger ett eget fönster vaknar ges de en boost
För att användaren så snabbt som möjligt ska kunna använda programmet
31. Vid svält
Om en process har varit i ready-kön mer än 4 sekunder sker en boost
Då ökar processens prioritet med 15
När processen har kört sitt kvantum får den samma prioritet som innan
Om den inte hann köras klart så kommer den vänta i ready-kön i 4 sekunder till
innan den får en ny boost
33. Kontext-byten
Beror på arkiteturen
Vanligtvis sparas:
Programpekare
Kernel stack pointer
Pekare till adressrymden
Detta läggs på kernel-stacken och kernel-stack-pekaren sparas i trådens
kontrollblock
Kernel-stack-pekaren sätts till den nya trådens kernel-stack-pekare och ett
kontext-byte utförs
35. Skeduleringsscenarier
När en process gör en frivillig switch
Genom t.ex. mutex, semafor m.m.
Processen går till wait state
Nästa process väljs från ready-kön
Processen som flyttas till wait state får inte lägre
prioritet, den flyttas bara till väntekön
36. Skeduleringsscenarier
Preemption
När en tråd med högre prioritets väntetid är slut
En tråds prioritet ökar eller minskas
Windows behöver bestämma om en ny tråd ska köras eller inte
Tråd med prioritet 18 avslutar sin väntetid
Den har högre prioritet än den som körs
Tråd med prioritet 18 swappas in och den som kördes
går tillbaka till första platsen i ready-kön
37. Skeduleringsscenarier
Tidskvantum avslutas
Windows bestämmer om trådens prioritet ska minskas eller inte
Om den minskas flyttas den till annan kö, annars längst bak i ready-kön
Windows bestämmer att trådens prioritet inte ska
minskas
Tråden sätts längst bak i ready-kön
Om trådens prioritet skulle ha minskats skulle den sättas
i den prioritetens ready-kö
39. Idle-Thread
Varje processor har sin egen Idle-tråd
Alla Idle-trådar tillhör en Idle-process
Idle-tråden kör när processorn inte har någon annan tråd att exekvera
Idle-tråden och Idle-processen har ID = 0 och prioritet 0
Idle-tråden står dock inte i Ready-kön och prioriteten används inte
Tråden har inte heller någon kod eller minne i user-space
40. Idle-Tråden
Exekvering:
1. Enable interrupts, deliver pending interrupts, disable interrupts
2. Kolla om en kernel-debugger vill komma åt systemet och ge den åtkomst
3. Kolla om DPC:er (Deferred Procedure Call) väntar
4. Kolla om någon tråd vill exekvera och dispatcha den tråden
5. Kolla om någon tråd vill köra på en annan processor och låt den köra på den
egna processorn
6. Kalla på “power management processor idle routine” för eventuell
42. System med en processor
På system med en processor skeduleras alltid den process med högst prioritet
som vill köra
43. System med flera processorer
På system med flera processorer försöker Windows att skedulera trådar baserat
på vilka processorer trådarna körde på förut och vilka processorer de föredrar
att köra på
Windows försöker att skedulera de trådar med högst prioritet på alla tillgängliga
processorer men garanterar bara att en av de trådar med högst prioritet körs
Windows grupperar ihop processorer i grupper med max. 64 processorer och
trådar tillåts “by default” bara att köra på processorer i sin egen grupp
Trådar ärver sin grupp från processen
Detta kan modifieras med diverse API:er och systemverktyg