9. přednáška služby správce procesů ( resched, ready, resume, suspend, kill, sleep, wakeup ) -Memory Management -cache paměť, adresové prostory -relokace -blokové přidělování -alokační strategie -Buddy System -stránkování Studijní materiály najdete na adrese:
Implementace služby RESCHED - bere v úvahu stav procesů a zajis- tí přepnutí kontextu - CURRPID - číslo aktivního procesu - nemusí dojít k přeplánování - realizováno jako nepřerušitelné - insert zařazuje proces na konec procesů se stejnou prioritou - pouhé volání služby zajistí střídání procesů podle sdílení času - je volána v rámci přerušení časovače - interní pomocná služba správce procesů - READY #include /* služba přeplánuje, spustí proces s nejvyšší prioritou */ int resched(void) { register struct pentry *optr; /* směrník na starý proces */ register struct pentry *nptr; /* směrník na nový proces */ if((optr=&proctab[CURRPID])->pstate==PRCURR) { if(firstkey(rdyqueue) pprio) return OK; optr->pstate=PRREADY; insert(currpid, rdyqueue, optr->pprio); } nptr=&proctab[(currpid=getfirst(rdyqueue))]; nptr->pstate=PRCURR; preempt=QUANTUM; lastsva=&(optr->svarea); newsva=&(nptr->svarea); ctxsw(); return OK; }
Služba RESCHED -přepnutí kontextu - kontrola nutnosti přepnutí - umístění procesu do prioritní fronty (na obecné místo) - přeznačení stavu procesů v PCB Služba READY - označení stavu procesu - parametr RESCHYES, RESCHNO - umístění procesu do prioritní fronty (na obecné místo) - přeplánování až po zařazení posledního procesu
- pid - identifikační číslo procesu pro frontu READY (rdyhead) - správně nastaví stavovou informaci v tabul- ce procesů, zařadí jej do fronty READY, vy- volá přeplánování - parametr resch - proti přeplánování po za- řazení jednotlivých procesů ze skupiny - priorita následujících procesů může být vyšší - resch se nastaví až při zařazování posledního procesu #include /* Služba READY, která převede proces do ready fronty a potom vyvolá přeplánování */ int ready(short pid, short resch) { register struct pentry *pptr; (pptr=&proctab[pid])->pstate=PRREADY; insert(pid, rdyhead, pptr->pprio); if(resch) resched(); return OK; } /* konec funkce */ RESCHYES definováno jako 1 RESCHNO definováno jako 0 Implementace služby READY
- slouží k převodu procesu do READY fronty - kontrola stavu procesu - proměnná PRIO - uschování priority procesu proti ztrátě během přeplánování #include /* služba převede proces ze stavu SUSPENDED do stavu READY a vrací prioritu procesu */ int resume(short pid) { struct pentry *pptr; int prio; if((pptr=&proctab[pid])->pstate!=PRSUP) return SYSERR; PRIO=pptr->pprio; ready(pid,RESCHYES); return PRIO; } Implementace služby RESUME
Služba RESUME - jestliže není stav SUSPEND, tak chyba - převedení procesu ze stavu SUSPEND - zařazení procesu do prioritní fronty - použit parametr RESCHYES, priorita procesu v lokální proměnné Služba SUSPEND - pouze ze stavu CURRENT (přeplánuje), READY (vyřadí z fronty) - nesmí být nulový proces - procesy ve stavu SUSPEND jsou bez fronty
Implementace služby SUSPEND - musí zpracovat proces ve stavu READY, CURRENT - ze stavu READY se vyřadí z fronty - ze stavu CURRENT (proces suspenduje sám sebe) se vyvolá přeplánování - ve stavové informaci aktivního procesu předáme službě RESCHED stav PRSUSP #include /* služba převede proces ze stavu READY nebo CURRENT do stavu SUSPEND */ int suspend(short pid) { struct pentry *pptr; int prio; if(pid==NULLPROC || (pptr=&proctab[pid])->pstate!=PRCURR&&pptr->pstate!=PRREADY) return SYSERR; PRIO=pptr->pprio; if(pptr->state==PRREADY) { dequeue(pid); pptr->pstate=PRSUSP; } else { pptr->pstate=PRSUSP; resched(); } return PRIO; }
Implementace služby KILL - musí zpracovat proces v libovolném stavu - snížení počítadla procesů - uvolnění paměti pro zásobník - označení položky v tabulce procesů PRFREE - odstranění procesu z fronty - úprava semaforu #include /********************************* KILL - odstraní proces ze systému *********************************/ int kill(short pid) { struct pentry *pptr; if ((pptr=&proctab[pid])->pstate == PRFREE) return SYSERR; -- NUMPROC; free(pptr->plimit, pptr->pstklen); switch(pptr->pstate) { case PRCURR: pptr->pstate=PRFREE; resched(); break; /* sebevražda, nikdy se nevrátí... */ case PRWAIT: semaph[pptr->psem].semcnt++; break; case PRSLEEP: case PRREADY: dequeue(pid); break; } pptr->pstate=PRFREE; return OK; }
Služba KILL - odstraní proces ze systému, musí existovat - při odstranění aktivního procesu musí být přeplánování - ze stavu SLEEP, READY a WAIT vyřazení z fronty - úprava stavu obecného semaforu Služba SLEEP - proces je uložen do DELTA listu - stav DELTA listu je uchován v globálních proměnných - přeplánování (uspává se vždy aktivní proces)
Implementace služby SLEEP #include void sleep(unsigned for_time) { if(for_time != 0) { insert(currpid, clockqueue, for_time); slnempty=1; sltop=DELTA(clockqueue);/* funkce vrací čas prvního procesu */ proctab[CURRPID].pstate=PRSLEEP; } resched(); } - proces je zařazen do delta listu - používá globálních proměnných CURRPID, slnempty, sltop - čas pro uspání předán jako parametr - jednotky záleží na implementaci
Implementace služby WAKEUP #include /**************************************** volána pouze v případě neprázdného delta listu ****************************************/ void wakeup(void) { while (nonempty(clockqueue) && firstkey(clockqueue) == 0) ready(getfirst(clockqueue),RESCHNO); if(slnempty=nonempty(clockqueue)) sltop=DELTA(clockqueue); resched(); } - není k dispozici vrstvám OS, pouze je volána v rámci obsluhy přerušení časovače - slnempty informuje o spícím procesu - sltop obsahuje čas do probuzení prvního procesu v delta listu
Memory Management - sledování stavu každého místa v operační paměti ( přiděleno, volné ) - určování strategie přidělování paměti ( komu, která část, kdy, v jakém rozsahu,... ) - realizace přidělení paměti ( zvolení příslušného paměťového místa, aktualizace informací o přidělení ) - realizace uvolnění paměti ( proces sám, odebrána násilně, aktualizace informací )
Cache paměť Main memory Cache CPU Block Transfer Word Transfer - drahá a velmi rychlá paměť - kontakt s pomalejší a větší hlavní pamětí - OS a uživatelské procesy ji nevidí - je v interakci s HW správy paměti (MMU) - hledání odkazovaného slova v cache - při neúspěchu přesun dalšího bloku dat - prostorová lokalita
Adresové prostory RAM LAPFAP procesorRAM la n la 1 la 0 DAT - MMU fa n fa 1 fa 0 Logický adresový prostorFyzický adresový prostor LAP - logické adresy, instrukční soubor procesoru FAP - fyzické adresy, HW řešení DAT - Dynamic Address Translation MMU - Memory Management Unit správa adresových prostorů (oddělení LAP a FAP pro jednotlivé procesy, rozdělení FAP pro LAP)
Zobrazení LAP do FAP relokací LAP OS LAP2 LAP1 AP2 AP1 FAP nevyužito AP1 AP2 RR zachování spojitosti LAP ve FAP - DAT – relokační registr RR - obraz RR je součástí PCB - LAP -> FAP se provádí dynamicky za běhu
Fragmentace paměti – hlavní nevýhoda, důsledek přidělování nestejně velkých bloků paměti a jejich uvolňování v různých okamžicích, pro omezení externí fragmentace se přidělují stejně veliké bloky (zvýšení režie), spojování více bloků, pro úplné zamezení - uvolňování v opačném pořadí než se alokuje, nepřijatelný diktát chování procesů, některé procesy si OP potřebují držet stále, drasticky by se snižovala průchodnost OS, musí být vnitřní věcí správce OP. Externí fragmentace – dost volné paměti, není dostupná v souvislé díře Interní fragmentace – přidělená oblast je větší, než bylo požadováno Redukce externí fragmentace – slučování nesousedních děr posuvem obsazených oblastí (bliter). Při přesouvání bloků dat je nutné zachování transparentnosti pro procesy - požadavek na překlad adres, pokud je k dispozici, není důvod nepoužít virtualizaci - virtuální paměť. strategie pro jednoduché OS nebo jednorázové a krátkodobé úkoly, proces musí vědět, kolik OP potřebuje a explicitně si ji vyžádat (požadavek je buď akceptován, nebo odmítnut), je třeba udržovat informace o vlastnících bloků, o volných blocích (tabulky s informacemi), potřebná znalost délky bloku, adresa dalšího bloku nemusí být explicitně uvedena (bloky navazují) Blokové přidělování
P4 P3 P1 P3 P2 P1 volná fragmentováno defragmentováno Odstranění fragmentace - setřásání
Informace o blocích v datových strukturách správce, potřeba další paměti a zvýšení režie, počet bloků předem neznáme, řešením je přidělení většího bloku, do volného místa uložit informace o samotném bloku i o adrese následujícího. Nevýhodou je promíchání systémových informací a paměťových bloků. Při nedokonalé ochraně paměti hrozí zhroucení OS. Proces1 15KB Proces2 10KB Proces3 25KB Proces1 Proces2 Proces3 Informace ve zvláštní struktuře Proces1 Další blok Data P1 Proces2 Další blok Data P2 Informace v bloku Blokové přidělování
Pevná velikost přidělovaných bloků – umožňuje umístění procesu menšího nebo stejného, pokud jsou všechny bloky obsazené je možné paměťové požadavky (procesy) odkládat 8 MB 2 MB 4 MB 8 MB 12 MB 16 MB bloky stejné velikosti - statické přidělování - nezáleží na tom, který blok se použije (jsou stejné) - nabízený prostor je nedostatečný, nutnost zavedení překryvů - využití paměti je extrémně neefektivní - i malý požadavek čerpá celý blok - vzniká interní fragmentace bloky nestejné velikosti - dynamické přidělování - existují dvě možnosti čerpání bloků
Způsob obsazení bloků - jedna fronta procesů pro každý blok – pro každý blok je jedna plánovací fronta procesů, výhodou je omezení interní fragmentace - jedna fronta procesů pro všechny bloky – možnost stanovit preferenci mezi odkládáním malých procesů a jejich umístění ve větším prostoru (zvýšení interní fragmentace versus zvýšená průchodnost operačního systému) 8 MB 2 MB 4 MB 8 MB 12 MB 16 MB nové procesy nové procesy 8 MB 2 MB 4 MB 8 MB 12 MB 16 MB
Díra – blok dostupné paměti, díry mají různý rozměr, jsou roztroušeny po FAP, při vzniku procesu se procesu přidělí dostatečně velká díra, OS udržuje informaci o přidělených oblastech a dírách OS proces 5 proces 8 proces 2 volné OS proces 5 volné proces 2 volné OS proces 5 proces 9 proces 2 volné OS proces 5 proces 9 proces 2 volné proces 10 volné Blokové přidělování
First fit - přidělí oblast v první díře, která má dostatečnou velikost, zbytek je novou dírou, jednoduchá, rychlá, nemá vliv na fragmentaci Best fit - přidělí oblast v nejmenší díře, která má ještě dostatečnou velikost, mírně omezuje fragmentaci, pomalá, větší režie, zanechává malé díry, šetří velké díry pro velké požadavky Worst fit – přidělí oblast v největší díře, pomalá, zanechává největší díru Last fit – obsazuje paměť od nejvyšších adres, někdy výhodný způsob (místo pro zásobník) Next fit – prohledává paměť za posledním umístěním Quick fit – informace o dírách je udržována v několika oddělených seznamech, každý obsahuje informace o dírách, jejichž velikost je v určitém intervalu, rychlé nalezení díry Alokační strategie alokovaný volný nově alokovaný poslední alokovaný Poslední first fit best fit last fit worst fit next fit
Systém „blíženců“ - zajímavým kompromisem mezi statickým a dynamickým přidělováním bloků je tzv. „Buddy System“ (Unix SVR4). Dostupné jsou paměťové bloky o velikosti 2 K, L <= K <= U, kde představuje: 2 L – nejmenší velikost alokovaného bloku 2 U – největší velikost alokovaného bloku (dostupná paměť) Řešení požadavku na přidělení bloku o velikosti S: - začne se s celým blokem velikosti 2 U. Jestliže platí 2 U-1 < S < 2 U, přidělí se celý blok délky 2 U, jinak se blok rozdělí na dva „blížence“ o rozměrech 2 U-1. Jestliže platí 2 U-2 < S < 2 U-1, přidělí se jeden z blíženců, jinak opět dojde k rozdělení. Postup se opakuje, dokud se nezíská nejmenší možný blok s velikostí větší nebo rovnou s požadavkem S. Jakmile se „blíženci“ uvolní, tak splývají. Operační systém udržuje několik seznamů děr: - i-tý seznam je seznam děr o velikosti 2 i - kdykoliv se v (i+1) seznamu vyskytne pár „blíženců“, jsou z (i+1) seznamu odstraněny, sloučeny a vloženy do i-tého seznamu. Když se požaduje oblast o velikosti k, kde 2 i+1 < k < 2 i, nejprve se zkoumá i-seznam a je-li prázdný, zkoumá se (i+1) seznam...
Buddy System volná přidělená Req. B – 240K Req. A – 100K
Stránkování procesor RAM fyzická adresa logická adresa p p d d f f LAP se dělí na logické stránky, FAP na fyzické stránky (frame), oboje má pevnou délku, délka je mocninou 2, zobrazení LAP do FAP se děje pomocí tabulky stránek, technika trpí vnitřní fragmentací, logickou adresu generuje procesor, číslo stránky (p – index do tabulky stránek, indexovaný řádek obsahuje číslo rámce f), offset (d – adresa ve stránce, dohromady s f tvoří fyzickou adresu), použito u virtuální paměti