A mai program OPERÁCIÓS RENDSZEREK A CPU ütemezéshez fogalmak, alapok, stratégiák Id kiosztási algoritmusok VAX/VMS, NT, Unix id kiosztás A Context Switch implementáció Ütemezés és a Context Switch Operációs rendszerek 1 Operációs rendszerek 2 Fogalmak Er forrásokat Hozzárendelünk processzekhez (allokáció); A használatukat id ben beosztjuk (id kiosztás, scheduling); Kapcsoljuk azokat a kiosztott id pillanatban (dipatching és switch). Most a processzor üzemezésr l lesz szó (Az egyéb er forrás ütemezés kérdéskör a kölcsönös kizárás probléma kezelésénél el jön majd ) A CPU meglehet sen fontos (és jellegzetes) er forrás. Érdemes ütemezését külön tárgyalni. A probléma Több processz van, mint processzor A processzek osztozzanak egy CPU idején. (Tegyük fel: minden processzhez rendeltek (ez az allokáció) egy CPU-t.) Emlékezz a processz állapotokra: ha letelt az id szelete a futó processznek, Vagy ha maga blokkolt állapotba megy (ezzel lemond a CPU-ról), akkor a futásra kész processzekb l válasszunk ki egyet (ez a scheduling), és kapcsoljuk neki a CPU-t (ez a dispathing és a Context Switch második fele). Operációs rendszerek 3 Operációs rendszerek 4 Tágítjuk a problémát: ütemezési szintek Long-term-scheduling (hosszútávú) JOB ütemezés: JOB/taszk pool-ból melyiket válasszuk ki futásra. A multiprogramozási szintet befolyásolja. Medium-term-scheduling (középtávú) suspended (futásra nem kész, partially executed, outswapped) processzek közül melyeket helyezzük futásra késszé (memória igény is érdekes) Short-term-scheduling (rövidtávú) futásra kész processzek közül melyik kapja a CPU-t. A továbbiakban ezzel foglalkozunk. (Ezzel ismét sz kítünk.) Operációs rendszerek 5 Mit várunk el? Pártatlanság: minden processz (taszk) korrekt módon, de nem feltétlenül egyenrangúan kapja meg a processzort Hatékonyság: a CPU lehet leg legnagyobb százalékban legyen kihasználva Válaszid (interaktív felhasználóknak): elfogadható legyen (valósidej eseményekre: korlátos legyen) Fordulási id (kötegelt munkák): elfogadható legyen Teljesítmény: id egységre es JOB, taszk, processz feldolgozás (más, mint a CPU kihasználás!) jó legyen Látható ellentmondások! Operációs rendszerek 6
Technikai alapok Óraeszköz periodikusan megszakításokat generál Az id t szeletekre (time slice, quantum) bonthatjuk A CPU felhasználás idejét, a processzek életidejét stb. számon tarthatjuk Bizonyos id nként az állapotokat kiértékelhetjük, és CPU kapcsolást valósíthatunk meg Operációs rendszerek 7 Az óraeszköz A programozható óra 3 komponensb l áll: oszcillátor kristály: nagy pontossággal periodikusan jeleket generál (tipikusan 5-100MHz). Számláló (counter): ami dekrementálja az értékét minden a kristály által generált jelre. Mikor a számláló eléri a 0 értéket, IT generálódik. Tartó regiszter (holding register): az óra indulásakor (oneshot mode) vagy a counter 0-vá válásakor (square-wavemode) tartalma betölt dik a számlálóba, ezzel szabályozhatjuk, milyen gyakran keletkezzen IT (clock tick rate). Pl. egy 1MHz-es kristály (1μs-ként ad jelet), 16 bites regiszterekkel programozható 1μs-t l 65535 μs-ig tartó óra ütés (clock-tick) tartományba. Operációs rendszerek 8 Az óraeszköz IT kezel jének feladatai A napi id karbantartása, a futó processz által felhasznált CPU id számolására, a processz id kvantuma lejártának megállapítására, ütemez meghívására, alarm szignál generálására (amikorra azt egy processz igényelte), "watchdog timer"-t biztosíthat (pl. floppy kezelésnél: felpörgetés, lehet I/O; ugyanekkor indul a wd-timer, ami leállítja a pörgetést, ha nem jön újabb i/o kérés) Segíti a profiling-ot, monitoring-ot, statisztikáz. Napi id karbantartás Egy számláló (64 bites) a napi id t (time-of-day) nyilvántartja óra-ütésekben (clock-tick), vagy 2 számláló: sec-ben + "ütésszám a kurrens sec-ben" (32 bit a sec-nak, 16 bit tickeknek) egy fix id höz képest (Unix: 1970. jan 1. 00:00:00 UTC) a bootolási id t l (32 bit a tick-számlálónak, 32 bit a secben mért betöltési id nek). A rendszergazda által adott dátum-id átszámítódik clocktick-ekbe, és beíródik a számlálóba. Az óra kezel (clock driver, clock IT handler) ütésenként növeli ezt a számlálót (számlálókat) Operációs rendszerek 9 Operációs rendszerek 10 CPU id nyilvántartás A processzhez tartozó számláló ütésenként inkrementálódik, ha a processz futó állapotú. Megoldható, hogy külön számláljuk a felhasználói módú és a kernel módú CPU használatot (persze, kis hibák itt lehetnek). Az id -szelet nyilvántartása A quantum, time-slice nyilvántartáshoz a context switch esetén egy számlálót (akár processzenkénti számlálót) feltöltünk óra-ütésekben mért id szelet értékkel, majd ezt ütésenként dekrementáljuk. A számláló 0-vá válása jelzi a quantum lejártát Id zít (alarm, watchdog-timer) Id k lejártát ütésekben (tickek-ben) adott számlálók 0- vá válása jelezheti. Számlálók (órák) id ben rendezett láncolt listáját tartjuk fel, a számlálókban a következ szignál ideje (tick-ben). A lista elején lév számlálót dekrementáljuk. Pl. Kurrens id : 4200, S1:4203, S2:4207, S3:4213 Kurrens id 4200 Következ szignál 3 Clock header 3 S1 4 S2 6 S3 Operációs rendszerek 11 Operációs rendszerek 12
Vissza az ütemezéshez: technikai alapok Óraeszköz periodikusan megszakításokat generál Az id t szeletekre (time slice, quantum) bonthatjuk A CPU felhasználás idejét, a processzek életidejét stb. számon tarthatjuk Bizonyos id nként az állapotokat kiértékelhetjük, és CPU kapcsolást valósíthatunk meg Döntési stratégiák Nem beavatkozó (non-preemptive) run-to-completion jelleg együttm köd (kooperative) Szelektív beavatkozó Beavatkozó (preemptive): akkor is elveszik a CPU-t egy processzt l, ha az nem akar lemondani róla Operációs rendszerek 13 Operációs rendszerek 14 Ütemezési döntési helyzetek 1 Egy processz wait állapotátmenete. 2 Egy processz preemption állapotátmenete (pl. megszakítás bekövetkezése miatt). 3 Egy processz signal állapotátmenete. 4 Egy processz terminálódása. (4) exit running (1) sleep/wait/request (2) preempt (3) signal/assign blocked waiting schedule/run ready Operációs rendszerek Ütemezési döntési helyzetek 1 Egy processz wait állapotátmenete. 2 Egy processz preemption állapotátmenete (pl. megszakítás bekövetkezése miatt). 3 Egy processz signal állapotátmenete. 4 Egy processz terminálódása. A processz szempontjából az 1. és 4. helyzet nem döntési helyzet. Az viszont a 2. és a 3. számú. Ha ütemezési döntések csak az 1., 4. helyzetekben lehetségesek: nem beavatkozó az ütemezés. Operációs rendszerek 16 A leegyszer sített forgatókönyv A futó processz ideje lejárt (egy logikai óra, számláló lejárt, ütésére egy IT kezel m ködésbe lép), vagy a futó processz blokkolt állapotba menne; A kezel (a sheduler) kiértékel, és kiválasztja a futásra kész processzekb l a nyertest (ez egy prioritás számítás, optimum számítás); Majd megtörténik a kapcsolás Operációs rendszerek 17 Mi befolyásolhatja a kiválasztást? Prioritás = fontosság. Mi befolyásolhatja? A processzek memóriaigénye A processzek érkezési ideje vagy érkezési sorrendje Az eddigi CPU felhasználási id * Vö.: CPU lázas processzek szemben I/O lázas processzek A várható CPU felhasználási id * Vö.: Számolásigényes processzek szemben I/O igényes processzek. Vajon lehet-e id t becsülni? A processz id szer sége ** Vö.: interaktív processzek szemben kötegelt munkák, CPU lázas szakaszok szemben az I/O lázas szakaszok. Rendszer terhelés befolyása. Valós idej processzek problémája kezelend. Operációs rendszerek 18
Egy kis fogalom magyarázat A processz életében lehetnek CPU lázas id szakaszok (CPU burst) I/O lázas id szakaszok (I/O burst) Vannak Számolásigényes (CPU bound) processzek (hosszú CPU lázas szakaszokkal); I/O igényes (I/O bound) processzek (rövid CPU lázas szakaszok, sok I/O lázas szakasz). Melyik ütemezési prioritása legyen magasabb? Egy processz állapotátmenetei CPU lázas id szakában Blokkolt Fut Ready Egy processz állapotátmenetei I/O lázas id szakában Blokkolt Fut Ready Operációs rendszerek 19 Operációs rendszerek 20 Az ütemezési algoritmusok Mi (milyen) a prioritásfüggvény? Az igény-bejelentési sorrend (First Come, First Served) (Long- és Medium-term ütemezéshez) A legkisebb igény (Shortest Job First) (Long- és Mediumterm ütemezéshez) Valamilyen ígéret (ígéret-vezérelt id kiosztás) (Policy Driven Scheduling) Körkörös sorrend (Round-Robin Scheduling) Több összetev t l függ (Többszintes prioritás-sorokon alapuló visszacsatolásos) (Multilevel Feedback Queue Scheduling) First Come, First Served A processzek készletében (Process Pool) lév processzek a beérkezési sorrendjük szerint kapnak CPU-t. Egyszer a megvalósítás. Kialakulhat a convoy effect : korábban érkezett CPU lázas szakaszú processz lefogja a CPU-t. (Országúton lassú járm mögött sorban a gyorsabbak) Operációs rendszerek 21 Operációs rendszerek 22 Shortest Job First Régi, egyszer. A nyomtató kiszolgálási sorokból ütemezésre még ma is használják. Az átlagos fordulási id a legkisebb. CPU ütemezéshez: hogyan lehetne megmondani el re a várható id igényt? Id sorozatokkal jellemezhet munkákhoz az aging (öregedés) algoritmus. Aging algoritmus 0, 1, 2,,i,.. CPU lázas szakaszok ismétl dnek (nem egyforma id t igényelve). Becsülhetjük a következ idejét (T i : tényleges, mért; B i : becsült): B i+1 = a * T i + (1 - a) * B i ; ahol 0 <= a <= 1. Legyen a = 1/2, ekkor (a: súlyozó faktor) B i+1 = (T i + B i ) / 2 i i +1 i + 2 i + 3 T i B i 6 10 4 8 6 6 4 6 13 5 i + 4 13 9 i + 5 11 Operációs rendszerek 23 Operációs rendszerek 24
Policy Driven Scheduling Reális ígéret: n számú processz esetén 1/n-ed részét kapja egy processz a CPU-nak. Mérni kell az élet-id -t (a rendszerben eddig eltöltött idejét), és cpu-id -t (eddig felhasznált CPU id t), számítandó a jogosultsági-id = élet-id / n; prioritás = jogosultsági-id / cpu-id. Más ígéretek is lehetnek Az ígéret-vezérelt id kiosztás speciális esete a valós idej (Real Time) id kiosztás. Round Robin Egyszer, elég régi algoritmus. Id szeleteket (quantum) rendelünk a processzekhez. A kész állapotú processzek egy soron nyilvántartottak. Egy processz futhat, amíg a id szelete tart (ha blokkolódik, akkor addig sem fut). Lejárt szelet (preempted) processz a sor végére kerül. A sor elején álló kapja a CPU-t. A listán a processzek körben járnak. Operációs rendszerek 25 Operációs rendszerek 26 Multilevel Feedback Queue Scheduling Több ready sor van, a különböz prioritási szintekhez Elvileg lehet minden sorhoz más-más scheduling/prioritás algoritmus Pl. interaktív processzekhez preemptív FCFS, vagy MLFQ Batch processzekhez SJF Valós idej (Real Time) processzekhez fix prioritás Minden sorhoz rendelhetünk id szeletet Kell egy módszer: mikor, mennyivel csökkentsük a prioritást Kell egy módszer (algoritmus), mikor mennyivel növeljük a prioritást (visszacsatolás) Preempted/blocked/signaled processz a neki megfelel sor végére kerüljön Kell egy módszer, melyik sorról "kapcsoljunk" Pl. a legegyszer bb: a legmagasabb sorról az els t. Operációs rendszerek 27 VAX VMS scheduling Multilevel feedback jelleg, alkalmas real time-ra is. 32 prioritási szint. Nagyobb szám: nagyobb prioritás. 16-32: a valós idej processzek számára. Nem dinamikus! 0-: reguláris processzeknek, dinamikusan számítódik. A processz bázis-prioritása: minimális prioritása. Rendszerhívásokhoz rögzített prioritás növekmény. Mikor a processz futásra késszé válik, a növekmény hozzáadódik a bázis-prioritáshoz, és a megfelel sorra kerül processz. Scheduled processz prioritása egy szinttel csökken (határ a bázis-prioritás). Ha elveszik t le a CPU-t, erre az új sorra kerül. Sokáig várakozókat eggyel följebb emelik (no starvation). A scheduler a legmagasabb prioritás sor elejér l választ. Operációs rendszerek 28 0 Kernel mód prioritástartomány Küszöb prioritás User mód prioritástartomány n Unix id kiosztás Nem megszakítható Megszakítható Swapper Diszk I/O várakozás Várakozás bufferre Várakozás i-bögre Karakter I várakozás Karakter O várakozás Gyermek exitre várakozás U k szint U k +1 szint U k + 2 szint U k + 3 szint U k + 4 szint U n szint Operációs rendszerek 29 A Unix id kiosztása A processzeknek user-mode vagy kernel-mode prioritásértéke lehet. Az el z dinamikus, ezek lehetnek preempted processzek. Utóbbi fix érték. Ezekre nincs preempció. Küszöb prioritás szint elválaszt. A user-mode prioritások (p_usrpri) dinamikusan igazítódnak. A p_cpu mez a futó processznél a CPU használattal arányosan n. A p_cpu mez t quantumonkként öregbítik (aging): p_cpu = p_cpu / const1; (rendszerint const1 = 2). Operációs rendszerek
A Unix id kiosztása 2 Egy példa Quant um A processz p_uspri p_cpu B processz p_uspri p_cpu C processz p_uspri p_cpu 1 0 0 63 7 A prioritás kiszámítódik (kisebb érték jelenti a nagyobb prioritást!): p_usrpri=puser+p_cpu/const2 + p_nice/const3; (Rendszerint const2=const3=2;). A PUSER a processz bázis prioritása, küls prioritás. A p_nice a nice() rendszerhívással (felhasználói kontrollt lehet vé tev ) beállított érték. A p_usrpri a küszöb érték alá, egy beállított érték fölé nem mehet. Egy rendszerben a PUSER=. Ha egy processz megkapja a CPU-t és quantumában végig használja, a p_cpu növekmény legyen. Legyen 3 processz (A, B, C), induláskor a C p_cpu-ja 7, a másik kett é 0. Induláskor a p_uspri C-nél 63, a másik kett nél. Mindhárom processznél a p_nice érték 0 legyen. Követhetjük, hogyan változnak a prioritások, melyik processz kap CPU-t. 2 3 4 5 75 67 63 76 1 2 7 67 33 75 67 63 0 1. 7 8 61 75 67 7 3 3 1 2 61 Operációs rendszerek 31 Operációs rendszerek 32 BSD 4.3 Scheduling Quantum=0.1 sec; const2=4; const3=2; const1 dinamikusan számítódik: const1=(2*load+1)/(2*load); ahol load a run queue álagos hossza az utóbbi 1 percben Ugyanekkor a p_cpu öregbítés nem quantumonként, hanem 1 sec-enként történik csak! Az 1 sec-nél hosszabb ideig blokkolt processzeknél const1 a blokkolási id t l is függ! NT Scheduling a fonalakra Van standby állapot is: a legnagyobb prioritású futásra kész. A standby-t ütemezik ki. 32 prioritási szint, 16-31: valósidej, 0-: normál, változó (mint a VAX/VMS-nél) Lejárt quantumú fonál prioritás 1-gyel csökken (a bázisig). Kész állapotba jutó fonál prioritása növekszik, a blokkolódása típusától függ en A legmagasabb kész sor els fonala standby állapotúra változik. Ha nincs ilyen, az idle fonál lesz standby. Operációs rendszerek 33 Operációs rendszerek 34 Linux scheduling A POSIX 1003.4-nek megfelel en több ütemezési osztály van (processzenként beállítható) SCHED_FIFO, SCHED_RR, SCHED_OTHER A schedule( ) függvény hívódik ha processz blokkolt állapotba megy, Minden syscall és "slow" IT után, ha egy flag beállított. A schedule( ) függvény 3 dolgot csinál "szokásos" teend ket (miknek az óra IT kezel ben kellene lenniük, de "hatékonyság" miatt itt vannak) Legmagasabb prioritású processz meghatározása Context Switch A CPU allokálás: Context Switch A futó processz hardver kontextusát (dinamikus részét) lementjük valahová, a kiválasztott processz kontextusát felvesszük. Legfontosabb a programszámláló (PC, IP) lementése, felvétele. Lementés történhet wait (blokkolódás) állapot-átmenetnél, vagy preemption állapot-átmenetnél is. A felvétel schedule átmenetet okoz. Operációs rendszerek 35 Operációs rendszerek 36
Hova mentsük le a dinamikus kontextust? Lehetne a Process Table sorába (PCB-be). Hátrány: nagy lesz a tábla, a lementés/felvétel hardveresen nem támogatott. Veremtárba. El ny: hardveres push/pop is van. Felhasználói szint verembe? Nem. Közös kernel verembe? Processzenkénti kernel verembe? Egyes CPU-kban többszörös regiszterkészlet! Egyes CPU-knak van védett módú processz kapcsolás gépi instrukciójuk! Operációs rendszerek 37 Unix processz kontextus komponensek A kontextus statikus része Felhasználói szint kontextus Program szöveg Adatok Veremtár Osztott adatok Rendszer szint kontextus statikus része Process Table bejegyzése U Area Processzenkénti Region Table A kontextus dinamikus (volatile)része Keret a 3. rétegnek Keret a 2. rétegnek Keret az 1. rétegnek Felhasználói szint Operációs rendszerek 38 Egy lehetséges mechanizmus Lásd a Unix processz kontextus ábrát (el z dia): keretek a processz kernel veremben a dinamikus kontextus részére. Hány keret kell? Mikor keletkezik új réteg? rendszerhívással (trap) belépünk a kernelbe; megszakítással belépünk a kernelbe; preemption következett be. Megsz nik egy réteg, ha rendszerhívásból visszatérünk user szintre; megszakítás kiszolgálásból vissztérünk; schedule átment következett be. A kapcsolás lépései Döntés, legyen Context Switch. A save-context() algoritmussal a kurrens processz dinamikus kontextusának lementése; A legjobb processz kiválasztása (scheduling algoritmusok!) A resume-context() algoritmussal a kiválasztott processz kontextusának felvétele. Tételezzük fel: R0 regiszterben van a függvények visszatérési értéke, PC a programszámláló, PSW a státus regiszter. Ezekre van hardveres push/pop. Operációs rendszerek 39 Operációs rendszerek 40 Pszeudókódok 1 int save_context() { R0 0; SWIT { HW-PUSH(PC,PSW); PUSH (altalanos regiszterek); /* lement dött a keret, R0=0-val */ R0 (-1); JUMP Return-re; Return(R0); /* A HW-PUSH-nál a PC a Return-re mutat. Látjuk majd, két visszatérés van ebb l. El ször a JUMP Return miatt (R0=-1-gyel), másodszor a PC felvétele miatt (de akkor el tte az R0- t is felveszik, az meg 0 lesz, tehát R0=0-val). */ Operációs rendszerek 41 Pszeudókódok 2 int resume_context(pid_t pid) { A pid-del azonosított processz vermér l vedd vissza az általanos regisztereket; POP PSW; POP PC; /* ide a vezérlés nem juthat el */ /* Miért nem jut oda a vezérlés? Mert a visszavett PC a save_context Return-jére mutat! */ Operációs rendszerek 42
A Context Switch pszeudókódja if (save_context()){ Ütemezz másik processzt, ennek pid-je = new_pid; resume_context(new_pid); /* ide a vezérlés nem juthat el */ /* Innen futhat a visszavett kontextusú processz */ /* Ne feledjük, a save_context-b l két visszatérés is van: az ifnek el ször nem-nulla értéket ad (és belefut a schedulingba), másodszor 0-val visszatérve kikerüli azt. */ Operációs rendszerek 43 A vezérlés menete Dönt; if(save_context( )) { npid = Ütemez; A B Resume_context(npid); IT 2nd; D S Ü 2nd R IRET rendszerek Operációs 44 Volt már ilyen, emlékezzünk #include <setjmp.h> jmp_buf env; int i = 0; main () { if (setjmp(env)!= 0) { (void) printf("2nd from setjmp: i=%d\n", i); exit(0); (void) printf("1st from setjmp: i=%d\n", i); i = 1; g(); /*NOTREACHED*/ g() { longjmp(env, 1); /*NOTREACHED*/ Összefoglalás Foglakoztunk az Alapokkal, stratégiákkal Id kiosztási algoritmusokkal VAX/VMS, NT, Unix id kiosztással A Context Switch implementációval Operációs rendszerek 45 Operációs rendszerek 46 OPERÁCIÓS RENDSZEREK Ütemezés és a Context Switch Vége Operációs rendszerek 47