Windows ütemezési példa A példában szereplő számolás erősen leegyszerűsített egy valós rendszerhez képest, csak az elveket próbálja bemutatni! Egyprocesszoros Windows XP-n dolgozunk, a rendszer úgy van beállítva, hogy az előtérben futó folyamatok quamtumja hosszú, a háttérben futóéké. Nem érkezik megszakítás a futás során, és nem lép életbe a Balance Set Manager. A rendszerben csak a következő folyamatok vannak: Folyamat, előtérben van, -as prioritású o szál, -as prioritású, 0 ticknyi munkája van, futásra kész az induláskor o szál2, 9-es prioritású, 0 ticknyi munkája van, futásra kész az induláskor Folyamat 2, háttérben van, -es prioritás o szál3, -es prioritású, 4 ticknyi munkája van, várakozik, a kezdéstől számított 20 tick múlva fejezi be a várást Folyamat 3, háttérben van, -as prioritás o szál4, végig kernel módban fut, -as prioritású, ticknyi munkája van, I/O-ra várakozik, tick után lesz kész az I/O művelet, és ekkor 0-es prioritást kap Megoldás A Windows szálakat ütemez, tehát az ütemezés szempontjából nem számít, hogy melyik szál melyik folyamathoz tartozik, a rendszer nem törekszik arra, hogy minden folyamat egyformán kapjon időt. A quantum óra megszakítás (clock tick) * 3 formában van tárolva, ezért érdemes mindent átváltani ebbe. o Így a 4-es szál (t4) 24 egység után lesz futásra kész, t3 pedig 0 után. A feladat szövege szerint t3 végig kernel módban fut, ez az ütemezés szempontjából nem változtat semmit, felhasználói módú szálak is ugyanúgy megszakíthatják kernel módban futó szálak futását. Egy szálhoz érdemes tárolni az aktuális prioritását, hogy mennyi munkája van vissza, és a quantumja aktuális hosszát. A megoldásban ezt a következő formában jelöljük: 0 <-idő <- aktuális prioritás t <- hátralévő munka <- quantum értéke 9 t2 t4 A t szálnak -as prioritása van, 0*3 a hátralévő munkája, és az előtérben lévő folyamathoz tartozik, így -as a quantumja induláskor. A többi szálra hasonlóan számolhatóak az értékek. Az induláskor az ütemező megnézi a futásra kész sorokat, minden prioritásértékhez tartozik egy FIFO sor:
9 t2 t A t3 és t4 szálak várakoznak, így a másik kettő közül kell választania az ütemezőnek. t2 a magasabb prioritású, így az ütemező azt választja. t2 mindaddig fut, amíg le nem jár a qunatumja, vagy valami egyéb esemény nem történik (pl. valaki befejezi a futását, belép egy új szál, stb.). t 0 9 9 t2 2 t4 t2 futását nem szakítja meg semmi, így egységig ( tick) fut. Miután lejárt a quantumja, újra meghívódik az ütemező. t3 és t4 még mindig várakozik, t-nek alacsonyabb a prioritása, így t2 futhat újra, a quantumja -ról indul újra. t 0 24 9 9 9 t2 2 2 0 t4 5 Az indulás után 24 egységgel t4 futásra kész lesz. Mivel I/O-ra várakozott, ezért a rendszer megnöveli ideiglenesen a prioritását (priority boost), de, hogy a prioritás növelése miatt ne legyen túlságosan előnyben, a quantumját eggyel csökkenti. Mivel új szál lett futásra kész, újra meghívódik az ütemező. t4-nek van most a legnagyobb prioritása a futásra kész szálak közül, így az fog futni.
t 0 24 29 9 9 9 t2 2 2 0 9 t4 3 5 Miután t4-nek lejár a quamtumja, az ideiglenesen megnövelt prioritása egyesével visszacsökken az eredetire, így most már csak 9 az aktuális prioritása. A quantumja újra lesz (háttérben futó folyamathoz tartozik, és a quantum csökkentés csak a prioritás megnövelés utáni első ütemre vonatkozik). A futásra kész sorok helyzete: 9 t2 t4 t t4 az előbb futott, és végére ért a quantumjának, így a megfelelő sor végére kerül. Az ütemező a legmagasabb prioritású sor elejéről választ, tehát t2 fog futni. t 0 24 29 35 t2 2 0 2 0 9 t4 3 5 t2 egység után befejezi a munkáját, így az ütemezőnek új szálat kell választania. A futásra kész sorok helyzete:
9 t4 t Így t4 fog futni: t 0 24 29 35 4 t2 2 0 2 0 9 t4 3 7 5 t4 a quantumja teljes hosszáig fut, a prioritása megint csökken eggyel, így visszaáll az eredeti értékre. A futás befejezése után visszakerül a megfelelő sor végére: 9 t t4 Az ütemező t-et választja ki futásra. 0 24 29 35 4 59 t 2 t2 2 0 2 0 9 t4 3 7 5
t a teljes quantumjáig fut. Érdemes megfigyelni, hogy mivel t az előtérben futó folyamathoz tartozik, neki sokkal hosszabb a quantumja. t-nek és t4-nek is -as a prioritása, de t4 van a sor elején, így t4 fog futni. 0 24 29 35 4 59 0 t 2 t2 2 0 2 0 9 t4 3 7 5 5 Az indulás után 20 tickkel (0 egység) t3 futásra kész lesz, így újra meg kell vizsgálni az ütemezőnek a rendszerben lévő szálakat. t3 prioritása -nál nagyobb, az úgynevezett real-time tartományban van, tehát az ő prioritása nem változhat futás közben, ezért hiába I/O műveletre várt, nem nő a prioritása. A futásra kész sorok: t3 9 t4 t Mivel t4-nek nem járt le a quantumja, hanem megszakították a futását, ezért ő a sor elejére kerül és a quantumja megmarad. t3-nak van a legnagyobb prioritása, így az fog futni. 0 24 29 35 4 59 0 t 2 t2 2 0 2 0 9 t4 3 7 5 5 Továbbra is t3-nak van a legnagyobb prioritása, így újra ő futhat.
0 24 29 35 4 59 0 72 t 2 t2 2 0 2 0 0 9 t4 3 7 5 5 t3 a quantumja lejártával be is fejezi a futását. Már csak két -as prioritású szál van a rendszerben, azok közül pedig t4 van a sor elején, így az futhat. 0 24 29 35 4 59 0 72 77 t 2 t2 2 0 2 0 0 9 t4 3 7 5 5 Miután lejárt t4 quantumja visszakerül a -as sor végére. A sor elején t van, így ő futhat. 0 24 29 35 4 59 0 72 77 9 t 2 0 t2 2 0 2 0 0 9 t4 3 7 5 5 t befejezi a futását, már csak t4 maradt, így ő futhat.
0 24 29 35 4 59 0 72 77 9 90 t 2 0 t2 2 0 2 0 0 9 t4 3 7 0 5 5 5 Az összes szál befejezte a munkáját.