1. Definice os, typy os, služby a vrstvy, systémová volání, virtuální počítač Definice: -softwarová nadstavba HW -společně s hw představuje virtuální počítač -je rozhraním mezi živitelem a systémem (laik, efektivní využití, programátorům – vývoj a ladění) -prostředí pro provádění programů (efektivně předává a odebírá řízení programům,chrání a izoluje programy a data) -zobecněné rozhraní pro přístup k systémovým prostředkům (poskytuje služby virtuálního počítače, řeší rozdíly jednotlivého hardware, programátorům zpřístupňuje paměť,soubory a VV zažízení) Typy OS: Mainframe os (mnoho IO),serverove (unix,windows 2000),viceprocesorove(clustery,paralelní),osobní počítače,real-time os (VxWorks),vestavěnéPalmOS(Pda, TV),smartcard OS Vrstvy: Koncový uživatel (aplikace, nástroje), programátor,systémové rozhraní(virtuální počítač),operační systém,návrhář os, hardware Služby: tvorba programů (editory, kompilátory), provádění programů (zavedení, spuštění,inicializace periférií,plánování pořadí),přístup k IO a souborům (provádění IO operací, konverze formátů dat),přístup k systému (správa a přidělování prostředků,ochrana přístupu k privátním prostředkům a datům),detekce chyb (hw,sw,neschopnost os splnit-nelze najít soubor),reakce na chyby(ohlášení,opakování operace,násilné ukončení programu),sledování činnosti systému(statistiky o použití prostředků,monitorování výkonnosti) Systémová volání: Volání jádra OS, většinou přes knihovnu (parametry na stack,volání fce v knihovně,nastavení registru na typ volání,TRAP-skok do jádra OS, jádro:dispatch,volání ovladače, návrat) Typy-procesy(vznik,nahrazení,čekání na ukončení, ukončení),soubory(otevření,zavření,čtení,zápis,stat),adresáře a souborové systémy(vytvoření,zrušení,odkazy),ostatní(změna práv,signál,zjištění času) Win32 API-vrstva mezi funkcemi a aplikacemi, založeno na událostech,extrémně veliké 2.Požadavky OS na hw pro jeho implementaci, procesor,správa, adresování paměti CPU-provádí instrukce programu,HW pro provádění programu(obsahuje programový čítač PC,instrukční registr IR(poslední načtená instrukce),dekodér instrukce a řídíčí obvody,registry s informacemi o stavu procesoru PSW),HW pro zpracování dat(registry pro krátkodobé uložení adres a dat, operační jednotku alu)+další pomocné registry a obvody -dva režimy user/kernel (instrukce TRAP – systémová volání) *registry os-program counter(adresa další instrukce),stack pointer,program status word(stav procesoru-pracovní režim,atd.) *registry user-datové (přechodné uložení dat),adresní(paměťové adresy dat a instrukcí) Paměť-uložení dat,registy-cache-ram-diskova cache-pevné disky-výměnná média *virtuální/fyzická adresa,memory management unit,kontext switch
IO-zařízení->řadič, OS práci s nim zjednodušuje,ovladače začleněny do jádra,spuštěny při startu/za běhu,přerušení (dokud požadavek nevyřízen je zaměstnán procesor jinou prací),registry zařízení, IO porty, direct memory acces 3. Provádění instrukce, porušitelnost programu a instrukce, události, signály, přerušovací systém -provádění instrukce:CPU ověřuje požadavky na přerušení vždy před načtením nové instrukce.pokud přerušení není povoleno nebo požadováno CPU načte následující instrukci, pokud je požadováno/povoleno-uloží se obsah PC a PSW např. do zásobníku a do PC a PSW se nahraje přerušovací vektor, tím se změní adresa příští instrukce a nastavení přerušovacího systému -přerušitelnost- IO program předá IO modulu povel a povolí přerušení, program může pokračovat dál dokud není třeba provést další IO operaci, v OS takový program pozastaven dokud IO operace není dokončena a procesor je zaměstnán jinou prací -start os, první proces (init), čeká se na událost (event) je signalizována přerušením -pokud neběží žádné uživatelské procesy, nejsou žádné IO operace,není žádný uživatel kterému by bylo nutno odpovídat je OS nečinný, když nastane událost->generuje se přerušení(signalizují různé události), generovány HW nebo SW Prioritní přerušovací systém-požadavek s vyšší prioritou může přerušit provádění obslužné rutiny přerušení s nižší prioritou, obsluha přerušení s nižší prioritou se dokončí až po obsloužení všech požadavků s vyšší prioritou (přerušení z LAN má přednost před přerušením z tiskárny, protože vyrovnávací paměť je nutné rychle uvolnit pro další data) 4. Časovač, sdílení času, víceúlohový a víceuživatelský OS. Časovač: časovač = timer = Časovač je čítač, který je zvyšován (resp. snižován) o jedničku vnitřním hodinovým signálem mikropočítače. Jeho účelem je tedy odměřovat čas. o
generuje přerušení v pravidelných intervalech, sdílení času, návrat procesů z delta listuobslužná rutina hlídá, kolik času procesu zbývá do naplnění přiděleného kvanta, zajistí přeplánování, opakované volání zajišťuje plnohodnotný multitasking z delta listu jsou procesy s nulovou deltou zařazovány do ready fronty
o o
obslužná rutina přerušení časovače, efektivní, assembler, pokud v jejím průběhu dojde k přeplánování, bude trvat nezanedbatelnou dobu
Sdílení času: multitasking neboli současný běh více úloh je mechanismus. Může být realizován různými způsoby (přepínáním kontextů, přidělováním časových kvant, jako kooperativní multitasking) a může sloužit různým účelům - tomu, aby více uživatelů sdílelo jeden počítač (pak jde o tzv. sdílení času), nebo tomu, aby si jeden uživatel mohl na svém počítači provozovat více úloh současně, případně oběma účelům současně. Víceúlohový (multitasking, multiprogramming, timesharing) o
OS umožňuje správu více procesů na jednoprocesorovém systému
o
běh více úloh (procesů) ve sdílení času
o
ochrana paměti, plánování procesů
Víceuživatelský (multi-user) o
možnost současné práce více uživatelů
o
identifikace a vzájemná ochrana uživatelů
o
OS uživateli vytváří virtuální prostředí tvářící se, jako by měl počítač sám pro sebe: nikdo
nebude bez jeho povolení číst jeho soubory, nikdo nebude zasahovat do běhu jeho programů, bude moci používat periferní jednotky počítače (tiskárny, vstupní jednotky,..) atd.
5. Vstupně výstupní zařízení, techniky programování vstupu a výstupu, dma IO moduly(řadiče, kanály, koprocesory..) -hw pro ovládání periferií, disky, klávesnice, display,tiskárna, komunikařní zařízení (lan modem) IO logika -zajišťuje interakci modulu s CPU přes řídící část sběrnice, je zde implementován protokol systémové sběrnice (PCI,AGP) IO operace IO program připraví IO modul pro požadovanou akci tím, že odešle potřebné příkazy a data, poté io program čeká na dokončení,testováním stavu IO modulu CPU provádí neproduktivní činnost,po dokončení operace předává IO program řízení zpět programu uživatele Techniky IO komunikace -programovaný io přenos-nepoužívá se,bez přerušení, cpu čeká Io přenos s přerušením-činnost CPU přerušena po dokončení IO operace,pro přenos se spotřebuje část času CPU -IO přenos s přímým přístupem do paměti (DMA)-data se přenášejí po blocích přío mezi IO modulem a pamětí (bez účasti CPU), program pouze iniciuje DMA (odkud, kam, kolik),CPU předá požadavek DMA modulu-> DMA provede přenos, CPU volné,o dokončení je CPU informován přerušením, omezuje přístup k operační paměti Sběrnice-komunikace částí počítače mezi sebou, CPU, AGP, PCI,IDE,USB; spravuje je os *plug n play, bios 6. Proces a program, kontext, stav procesu, třístavový a sedmistavový model Proces-konkrétní provedení určitého programu, program lze provádět opakovaně s různými daty, v daném okamžiku lze jeden program provádět vícekrát -označujeme také jako úkol Dávka->úloha+úloha->úkol+úkol -průběh procesu lze trasovat (analyzovat po provedení jednotlivých instrukcí) *dispečer-převádí procesor z jednoho procesu do druhého, brání okupaci CPU procesem,rozhodje který proces bude prováděn jako další, při přepnutí z A na B se v CPU vždy provádí dispečer *tabulka procesů, process kontrol block *signály (alarm, IO operace) ? sekvenční provádění/multiprgoramming Vznik procesu-v dávce,uživatelem,spuštěním služby pro obsluhu požadavků (tiskový server), vytvořením potomka existujícího procesu (sparing) Ukončení procesu-úloha v dávce vydá halt, odhlášením uživatele, proces předá systému požadavek na ukončení, dojde k chybě
Stav procesu-běžící (v CPU), připravený (pozastaven, fronta), blokovaný (čeká na vnější událost) 7-vový(nemá ještě všechny prostředky), připravený, bežící, blokovaný, ukončený (držíme v paměti jeho informace), blokovaný odložený(proces přesunut z RAM na swap disku), připravený odložený (událost nastala, ale proces stále ve swap) Přepínač kontextu-plánovač PCB (process table)-status,program counter,stack pointer,alokace paměti,otevřené soubory,údaje plánovače Při přerušení – uložení stavu, obsluha ovladačem v jádru, plánovač rozhodne co dál Proces-prostředky jako celek (adresní prostor,otevřené soubory,alarmy,obsluha signálů), vlákno-(samostatné: program counter, registry, stack,stav; ostatní sdílí s ostatními vlákny procesuu) Multithreading-možnost běhu více vláken (problém globálních proměnných) *thread_create,thread_exit,thread_wait (čeká na ukončení jiného vlákna),thread_yield(vzdá se cpu) 7. Implementace procesů v OS, co je proces pro OS Správa procesů: typická funkce jádra OS (Process management), vytváření a ukončování,plánování a spouštění,přepínání procesů,synchronizace procesů,podpora komunikace procesů,udržování řídících bloků procesů Tabulky Os udržuje tabulky-ovládání paměti, ovládání IO, ovládání souborů, ovládání procesů Tabulka ovládání procesů-Process image tvoří tyto komponenty:program,data,zásobník,atributy procesu(jedinečný numerický identifikátor,stav procesu(kontext),řídící informace procesu) Postup při vytvoření procesu-přídělení identifikátoru, alokování místa v paměti,inicializace řídícího bloku PCB,nastavení odkazů,uložení záznamu o aktivaci procesu Přepínání-při přerušení-proces vyčerpal kvótu, IO operace byla dokončena Pro OS-konkrétní provedení určitého programu -prokládat časově provádění mnoha procesů s cílem maximalizovat využití CPU,přidělení požadovaných systémových prostředků,podpora komunikace procesů a vytváření nových procesů uživatelem 8.Soutěžení procesů (o prostředky), vzájemné vylučování, kritická sekce ●
procesy si konkurují ve: - sdílení prostředků - alokaci času CPU - komunikaci - synchronizaci více procesů
●
problémy s konkurencí - pokud přístup ke sdíleným prostředkům není řízen, může dojít k porušení konzistence
dat ( výsledek akcí prováděných procesy může být závislý na pořadí, v jakém procesy dostanou přidělen procesor ) - přístup ke sdíleným prostředkům je nutno řídit! ●
soutěžení procesů o prostředky - provádění jednoho procesu může ovlivnit chování soupeřících procesů - pokud přístup k jednomu prostředku požaduje více procesů současně, lze prostředek přidělit jen jednomu z nich (ostatní procesy čekají) - nelze vždy zaručit, že blokovaný proces získá přístup k prostředku v budoucnosti (takový proces nikdy neskončí, bude bez omezení čekat ! )
●
problémy s řízením přístupu - vzájemné vylučování (v každém okamžiku smí mít přístup k prostředku pouze jeden proces) - smrtící obětí (Deadlock) (procesy vzájemně čekají na uvolnění prostředků, přidělených jiným procesům) - vyhladovění ( proces nemůže získat přístup k požadovanému prostředku v důsledku obsazení prostředku jinými procesy)
●
kooperace procesů sdílením - procesy používají a mění sdílená data (sdílené proměnné, soubory, databáze, atd.) - v daném čase může data měnit pouze jeden proces (např. textový soubor nesmí být otevřen pro zápis více editory současně) - k zajištění integrity(neporušenost) dat se používají kritické sekce
●
kritická sekce - proces je ve (své) kritické sekci (pro daný sdílený prostředek), jestliže provádí část programu, manipulující s (tímto) sdíleným prostředkem - provádění kritické sekce musí být vzájemně výlučné (mutually exclusive) (v každém okamžiku smí být v kritické sekci(pro daný prostředek) pouze jeden proces) - každý proces musí žádat o povolení ke vstupu do kritické sekce !
9.Techniky řízení přístpu k prostředkům (hw sw), popsat hw techniky, zákaz přerušení, setand-test Sw řešení pomocí aktivního čekání ●
petersonův algoritmus - vstupující procesy Pi a Pj, pouze jeden proces se nastaví na přístup do kritické sekce CS (splňuje vzájemné vylučování, plnění požadavků na pokrok a omezenost čekání(např. Pi nemůže vstoupit do cs pokud nevstoupí alespoň jednou Pj) toto řešení je odolné proti chybám ve zbytkové sekci (RS), protože chyba v RS je vlastně totéž, co neomezeně dlouhá sekce RS. Řešení není odolné proti chybám v CS (pokud chyba nastala v CS, pro ostatní procesy Pi zůstává v kritické sekci)
●
bakerův algoritmus - před vstupem do kritické sekce dostane každý proces číslo. Držitel nejmenšího čísla může vstoupit do CS, ve výstupní sekci nastaví proces Pi přidělené číslo na 0
●
nedostatky - Procesy požadující přístup do kritické sekce jsou v aktivním čekání (busy
waiting) a proto zbytečně spotřebovávají čas procesoru - Pokud jsou kritické sekce dlouhé, může být efektivnější čekající procesy blokovat HW řešení pomocí zákazu přerušení a metody TEST and SET ●
proces běží v procesoru kontinuálně, dokud nevyvolá službu OS nebo není přerušen . K přerušení procesu může dojít pouze na hranicích instrukcí (mezi dokončením jedné a zahájením další instrukce ). Přístup k paměťovému místu obvykle vylučuje současný přístup ostatních procesů k tomuto místu
●
zákaz přerušení - obecně proces běží, dokud nevyvolá požadovanou službu OS nebo není přerušen - princip spočívá v tom, je zakázán přerušení před vstupem procesu do CS po výstupu z kritické sekce je přerušení opět povoleno - u jednoprocesorového systému zákaz přerušení zaručuje vzájemné vylučování . U víceprocesorových systémů nezaručuje - nedostatky: jsou omezeny možnosti procesoru prokládat programy (vykonávání jednotlivých procesů s cílem maximálního využití procesoru) - zákaz přerušení může významně snížit efektivnost provádění programů(v době, kdy je některý proces v kritické sekci, nelze procesor přidělit jinému procesu) - obecně nevhodné řešení (prodlužuje se doba latence (doba mezi okamžikem příchodu požadavku na přerušení a okamžiku kdy se začne provádět příslušný obslužný systém))
●
instrukce test-and-set - instrukce procesoru přečte příznak a současně ho nastaví, pokud byl příznak už nastaven, tak se příznak nezmění => kritická sekce je obsazena proces musí čekat, pokud ale příznak nastaven nebyl instrukce ho nastaví a proces může vstoupit do kritické sekce. Po výstupu z kritické sekce je příznak inicializován. - nedostatky: jedná se o aktivní čekání zabírající čas procesoru - může dojít k vyhladovění (když proces uvolní kritickou sekci, jako další získá povolení proces, který první provede instrukci testování) - v systému může vzniknout deadlock ( nastává tato situace: proces s nízkou prioritou má kritickou sekci, proces s vysokou prioritou žádá o povolení . Procesor je přidělen procesu s vysokou prioritou, kde pak čeká na uvolnění , ale k tomu nemůže dojít, protože proces s nízkou prioritou nemůže získat procesor )
10.Synchronizace procesů pomocí semaforů a pomocí předávání zpráv semafory ●
nevyžaduje aktivní čekání ( pokud o přístup do kritické sekce usiluje některý proces v době, kdy je v ní jiný proces, případně o přístup usiluje v jednom okamžiku více procesů, je nutné některé z nich pozdržet. Toto pozdržení je možné realizovat smyčkou. Toto tzv. aktivní čekání (busy waiting) však zbytečně spotřebovává čas CPU ), celočíselná proměnná dostupná pomocí dvou atomických(nedělitelných) operací (wait/signal)
semafor celočíselný ●
je datová struktura record, která obsahuje frontu procesů a čítač procesů ve frontě.
●
princip: když proces čeká je blokován a zařezen do fronty, signal odstraní proces z fronty a přesune ho do seznam procesů připravených ke spuštění, funguje pro více procesorů
semafor binární ●
proměnná count je boolean, náročnější než použití čítacích semaforů
synchronizace pomocí semaforů: ● ●
máme dva procesy: P1 a P2 příkaz S1 v P1 musí být proveden dříve než příkaz S2 v P2, kde synch je definován jako semafor uP1: S1; signal(synch); uP2:
●
wait(synch); S2; Ukázka použití dvou semaforů S1 a S2: P1: init(S2,∞)
signal(S1) wait(S2)
P2: S1=0
signal(S2) wait(S1)
problémy ● wait(s) a signal(s) jsou rozděleny do více procesů a proto je obtížné porozumět jejich působení, použití musí být korektní ve všech procesech, jediný chybný proces může způsobit problémy s celým souborem procesů Synchronizace pomocí předávání zpráv ● předávání zpráv-nutné vzájemné vylučování,dochází k výměně informací synchronizace-vysílač nebo přijímač může(nemusí) být blokován, neblokující send i recive, neblokující send-blokující recive (vysílač po odeslání zprávy pokračuje,aby co nejrychleji připravoval zprávy. Přijímač je blokován dokud zpráva není doručena aby mohl okamžitě reagovat na doručení), blokující send i recive (na doručení čeká přijímač i vysílač – ranvedzvous) ●
adresace-send zahrnuje identifikátor cílového procesu
●
recive může určit od kterého procesu je zpráva očekávána (ostatní buď ignorovány, speciální adresa,0, určuje, že zpráva může přijít od kohokoli), recive může dostat parametrem hodnotu kterou předá(umožňuje zjistit, že zpráva dorazila)
●
- nepřímá - zprávy se zasílají do sdílené datové struktury z front (mailboxes)
11. Obrana před vzájemným blokováním deadlock a vyhladověním, problém objedvajících filozofů, algoritmus bankéře, problém pisatelů a čtenářů Deadlock-procesy vzájemně čekají na uvolnění prostředků, přidělených jiným procesům, vzniká konfliktem požadavků na prostředky od dvou nebo více procesů Podmínky vzniku-vzájemné vylučování(pouze jeden proces na prostředek),hold-andwait(proces může držet prostředek zatímco čeká na jiný), systém bez preempce(přidělený prostředek nemůže být procesu násilně odebrán),kruhové čekání(uzavřený řetězec procesů v němž každý drží prostředek který potřebuje následující proces v řetězci) *opakovaně použitelné prostředky-mohou být použývány pouze jedním procesem,deadlock nastává jestliže proces již nějaký prostředek drží a žádá o přidělení dalšího *spotřebitelné prostředky-prostředky vytvářené a ručené procesy(přerušení,signály,zprávy), deadlock může nastat když je příjem zprávy blokující,kombinace vedoucí k vzájemného zablokování může být velmi vzácná Prevence-vzájemnému vylučování se nelze vyhnout, hold-and-wait-lze proces blokovat dokud nemohou být všechny jeho požadavky na prostředky zajištěny současně, proces může čekat dlouho,kruhové čekání-pro prostředky definovat lineární uspořádání,jakmile je nějaký prostředek přidělen, mohou být jako další přiděleny již jen prostředky s vyšším pořadovým číslem, může bezdůvodně odmítnut přidělení prostředků Detekce-os může testovat(při příjmu požadavku na prostředky), spotřebovává CPU Vyloučení deadlock-nestartovat procesy, jejichž požadavky mohou způsobit deadlock,nepovolit inkrementální požadavky na prostředky procesům pokud můžou způsobit deadlock,není nutná preempce a rollback procesů Odstranění-násilné ukončení blokujících procesů,obnovit zablokované procesy z bodu před dreadlockem a restartovat (může se opakovat),postupně ukončovat jednotlivé procesy, dokud deadlock neodblokuji,násilně odebírat prostředky dokud nezmizí deadlock Kritéria ukončování-nejmenší dosud spotřebovaný čas,nejmenší objem vygenerovaných dat,nejdelší odhadnutý čas do dokončení,nejmenší počet dosud přidělených prostředků,nejnižší priorita
Starvation-při čekání na přidělení prostředků (kvůli obsazení jinými procesy),při komunikaci procesů(dva procesy komunikují, třetí čeká),typický důsledek nízké priority Problém filosofů-5 filosofů,2vidličky potřeba,5vidliček, filosof proces,vidlička prostředek Všichni uchopí(deadlock) -> semafor pro každou vidličku Začínají jíst 4 (1 jí, 3 čekají) -> semafor umožňující omezit počet filozofů Bankéř-exitstuje bezpečná sekvence (safe sequence), může ale nastat deadlock Pevný počet prostředků,pevný počet procesů,procesy předem deklarují požadavky,požadavky jsou akceptovány pouze pokud jeho maximální požadavky nepřekročí celkový počet prostředků,procesy mohou získat v daném okamžiku pouze jeden prostředek ->prostředek je alokován pouze pokud výsledkem alokace je opět bezpečný stavpředchází cyklickému čekání, má slabiny(nelze vždy garantovat pevný počet prostředků,v multiprogramovém prostředí nelze vždy zajistit pevný počet procesů, procesy nemohou vždy předem znát maximální požadavky na prostředky) Problém pisatelů -jakýkoli počet čtenářů může souběžně číst obsah soubor,může zapisovat jen jeden,pokud zapisujeme nelze ze souboru číst -dosažení vzájemného vylučování přenosem zpráv, vytvoření mailbox (mutex) sdíleného n procesy, send neblokující, Recife blokující když je mailbox mutex prázdný, inicializace send(mutex, „go“);, první proce Pi který provede recese může vstoupit do cs, ostatní procesy budou blokovány dokud Pi neodešle zprávu 12. Plánování-cíle,typy,kriteria Rozhoduje který proces má CPU Cíle:spravedlnost,dodržování politik,využití všech částí systému Interaktivní systémy: minimalizovat odezvu,proporcionalita(vyhověť očekávání uživatelů) Typy: nepreemptivní (proces se musí sám vzdát cpu), preemptivní(rozhoduje plánovač,efektivní pouze pokud k dispozici přerušení) First come first served-nové úlohy do fronty,po ukončení aktuálního přidělen nejdéle čekající,krátké procesy čekají dlouho, zvýhodňuje výpočtové procesy (procesy s IO čekají při každém dokončení) Shortest job first-nepreemptivní, spustí se proces s nejkratší očekávanou dobou provedení, závislé na dobrém odhadu délky běhu Shortest remaining time next-shortest remaining time next, vyžaduje odhad doby provádění, preemptivní varianta SJF Round-robin-preempce založená na časovači,procesu je přiřazeno časové kvantum cpu,přepnutí při vypršení kvanta nebo při volání blokovací systémové fce, je třeba optimalizovat délku kvanta Prioritní plánování-přednost proces s vyšší prioritou,nízká priorita může mít za následek vyhladovění (starvation), nutno prioritu přizpůsobovat v závislosti na době čekání nebo
historii běhu procesu Plánování se zárukou-např. časové kvantum dle 1/počet uživatelů Lottery scheduling-periodicky se losuje o čas CPU, kooperativní procesy si mohou čas předávat Fairshare-bere v potaz i uživatele Real-time systémy: hard RT-deadline musí být splněna; soft RT-občasný výpadek Události-periodické, aperiodické (nedají se předpovědět) -systém je plánovatelný pokud suma časů potřebných na obsloužení událostí dělená jeho periodou pro všechny události je <1 14. Plánovací algoritmy First come first served-nové úlohy do fronty,po ukončení aktuálního přidělen nejdéle čekající,krátké procesy čekají dlouho, zvýhodňuje výpočtové procesy (procesy s IO čekají při každém dokončení) Shortest job first-nepreemptivní, spustí se proces s nejkratší očekávanou dobou provedení, závislé na dobrém odhadu délky běhu Shortest remaining time next-shortest remaining time next, vyžaduje odhad doby provádění, preemptivní varianta SJF Round-robin-preempce založená na časovači,procesu je přiřazeno časové kvantum cpu,přepnutí při vypršení kvanta nebo při volání blokovací systémové fce, je třeba optimalizovat délku kvanta Prioritní plánování-přednost proces s vyšší prioritou,nízká priorita může mít za následek vyhladovění (starvation), nutno prioritu přizpůsobovat v závislosti na době čekání nebo historii běhu procesu Plánování se zárukou-např. časové kvantum dle 1/počet uživatelů Lottery scheduling-periodicky se losuje o čas CPU, kooperativní procesy si mohou čas předávat Fairshare-bere v potaz i uživatele Real-time systémy: hard RT-deadline musí být splněna; soft RT-občasný výpadek Události-periodické, aperiodické (nedají se předpovědět) -systém je plánovatelný pokud suma časů potřebných na obsloužení událostí dělená jeho periodou pro všechny události je <1 14. Relokace programů, alokace paměti, relativní adresování, pevné a proměnné dělení paměti, fragmentace paměti, typy fragmentace. Přidělování pevných bloků paměti OS MFT (Multitasking with Fixed nuber of Tasks) - IBM 360 v 60. letech.
paměť má velikost desítky KB až MB a při startu systému je pevně rozdělena na bloky (1MB se např. rozdělí na 1*256kB, 2*128kB, 2*64kB, 3*32kB, 2*16kB a 256kB pro OS) o každém programu jsou známy jeho paměťové nároky -> OS mu přidělí blok, jehož délka je větší nebo rovna nárokům programu
Strategie ukládání do pevných bloků
First fit procházejí se bloky paměti a přidělí se první blok délka je větší nebo rovna požadované paměti. Last fit vybere se poslední vyhovující Worst fit vybere se největší vyhovující u přidělovaných bloků proměnné velikosti (používá se u strategie přidělování bloků paměti proměnné velikosti pro omezení fragmentace viz dále) Best fit vybere se nejmenší vyhovující (pro přidělování bloků pevné velikosti se zpravidla používá tato strategie)
Výhody:
ve vnitřní paměti může být několik procesů současně jednoduchost
Nevýhody:
špatné využití paměti (fragmentace) je nutné předem znát paměťové nároky, proces jehož paměťové nároky jsou větší než velikost největšího bloku má smůlu (nelze ho odstartovat - jednomu programu není možno přidělit dva sousední bloky)
Adresování Není možné předem stanovit na jaké adrese bude program uložen -> program musí být relokatibilní. Máme dvě možnosti:
relokační tabulka v programu = tabulka s informacemi, kde jsou v programu adresní konstanty. Při zavádění program se všechny adresní konstanty upraví podle skutečné adresy na které je program. program, ve kterém jsou pouze relativní adresy. U skoků to jsou autorelativní adresy (skočit o + nebo - kolik bytů). U proměnných se používá bázování - určitý registr se naplní skutečnou adresou např. začátku programu a pro odkazy na proměnné se používá místo pevné adresy hodnota bázového registru + posunutí (offset). Je velmi žádoucí, aby procesor podporoval bázování a musí mít relativní skoky.
Ochrana paměti Nejčastěji se používá jedna z těchto metod:
mezní registry mechanismus zámků a klíčů (viz dále)
Pro použití každé z těchto metod je nutná podpora hardware -> používá se ta, která je dostupná na daném procesoru. Ochrana paměti pomocí mezních registrů Dva mezní registry udávají nejnižší a nejvyšší dostupnou adresu. Nastavuje je OS, když předává řízení procesu. Odkaz na paměť mimo způsobí vnitřní přerušení "porušení ochrany paměti". Nastavení mezních registrů musí být privilegovaná instrukce, jinak může program napsaný se špatným úmyslem číst nebo měnit paměťové oblasti jiných procesů.
Ochrana paměti pomocí mechanismu zámků a klíčů Paměť je rozdělena na stránky pevné velikosti (např. 4 KB). Každé stránce paměti je přiřazen zámek (= celé číslo). Procesor má speciální registr, který slouží jako klíč. Proces může používat pouze ty stránky paměti, které mají zámek nastavený na stejnou hodnotu, jako je klíč. OS může používat univerzální klíč číslo 0, který umožňuje přístup k libovolné stránce paměti. Bloku logické paměti Nejjednodušší je alokace úseku logické paměti. Obvykle používáme funkci kmalloc(), která je podobná známé funkci malloc(), ale má jeden argument navíc. Podívejme se na příklad: void* ptr = kmalloc(100, GFP_KERNEL);
Alokujeme 100 bajtů, a to způsobem implicitním pro jádro. Ve skutečnosti se alokuje víc - až dvojnásobek požadovaného množství, v tomto případě konkrétně 128 B. Nepoužívá se totiž klasická hromada (heap), místo toho si jádro předem připravuje zásobu bloků paměti různé velikosti (od 32 B do 128 KB), a z nich pak podle požadavků přiděluje. Druhou věcí, která nás zajímá, je zbývající parametr. V tomto případě jsme alokovali tím nejobvyklejším způsobem, ale možností je mnohem víc. Např. GFP_ATOMIC se používá v případech, kdy je nutná atomická alokace - za normálních okolností totiž kmalloc() může blokovat, což třeba při obsluze přerušení nesmíme připustit. Zajímat nás může také třeba __GFP_DMA pro omezení logických adres na rozsah použitelný pro DMA na sběrnici ISA. Další konstanty najdete v dokumentaci (s novými verzemi jádra občas přibývají). Proč kmalloc() může blokovat? Jednoduše proto, že paměť nemusí být k dispozici. Pak je nutné požadované množství uvolnit (např. odložením na disk), což zabere nějakou dobu. Atomicky volaná funkce se o nic takového nepokouší - buď se to povede hned, nebo vůbec. Maximální alokovatelný blok je 128 KB, což se někomu může zdát málo, ale není tomu tak. Obvykle totiž tak velký kus logické paměti nepotřebujeme. Paměť musíme po použití bezpodmínečně uvolnit zavoláním kfree(). Pokud by se tak nestalo, byla by ztracena až do restartu systému. Alokace bloku virtuální paměti Při větších požadavcích na množství paměti můžeme alokovat jako virtuální paměť jádra. Získáme stránkovanou paměť (nemusí být fyzicky souvislá) o prakticky libovolné velikosti. Vzhledem k alokaci po stránkách bude samozřejmě přidělený úsek zarovnán na celé stránky, navíc se pro každou stránku vytváří režijní datová struktura (položka v tabulce stránek) - proto nemá smysl používat tento postup pro alokaci malého množství paměti (lépe se hodí kmalloc()). Dalším omezením (zcela logickým) je použití takto získané oblasti paměti - nelze ji použít mimo jádro, zejména ne v žádném zařízení připojeném přes sběrnici. Týká se to jak pohledu ze zařízení do paměti (DMA apod.), tak obráceně (paměťová oblast ležící v zařízení). Pokud bychom přesto potřebovali, aby se podobným způsobem pracovalo s pamětí v zařízení, použili bychom funkci ioremap() - ale tím se teď zabývat nebudeme. Připomenu ještě, že alokace virtuální paměti není atomická a může blokovat. To ale není na závadu, správně napsaný modul by nikdy neměl vyžadovat alokaci většího množství paměti v kritických místech. Pro alokaci použijeme funci vmalloc(), pro uvolnění vfree(). Pracuje se s nimi stejně jako s funkcemi malloc() a free(): void* ptr = vmalloc(10000);if (ptr == NULL)
Opět připomínám nutnost paměť po použití uvolnit.
return -NOMEM;
...vfree(ptr);
Alokace celých stránek Předchozí způsoby alokace se hodí hlavně tam, kde předem neznáme potřebné množství paměti. Někdy ho ovšem známe již při v době implementace, čehož můžeme s výhodou využít ke snížení režie jádra při alokaci a uvolňování - zejména tehdy, jedná-li se o větší množství paměti. Máme dvě skupiny funkcí - první vrací adresu, druhé ukazatel na stránkovou strukturu. Podívejme se nejprve na ty první. Můžeme alokovat třeba jen jedinou stránku. K tomu slouží funkce __get_free_page() a get_zeroed_page(). Jejich jediným parametrem jsou příznaky v podobě známé od kmalloc(). Funkce se liší tím, že první vrací stránku "tak, jak je", kdežto druhá ji předem vynuluje. Po použití paměť uvolníme funkcí free_page(). Pozor - nepracuje se zde s ukazateli, nýbrž s čísly typu unsigned long! Přidělování bloků paměti proměnné velikosti Volná paměť není pevně rozdělena, ale při startu programu se přidělí paměť podle nároků programu (resp. přidělí se celý volný blok a program vrátí, co nepotřebuje). Najdeme u MS-DOS, OS-MVT (Multitasking with Variable nuber of Tasks). Operační paměť na počítačích PC kompatibilních v reálném režimu:
na začátku OS, buffery, proměnné pak volno až do 640kB (do tohoto prostoru se zavádějí programy) VRAM (128kB) Video RAM VROM (32kB) Video ROM (u adaptérů EGA, MCGA, VGA, SuperVGA, jinak volné) volné místo (toto místo mohou využívat přídavné adaptéry pro své paměti RAM nebo ROM) ROM BIOS (64 kB)
Výhody:
jako u předchozí strategie lepší využití paměti
Nevýhody:
součet paměťových nároků, které jsou současně v paměti musí být menší nebo roven velikosti paměti fragmentace paměti - procesy vyžadují souvislé úseky paměti. Může se stát, že není možné spustit další proces, protože má větší nároky na paměť než je velikost největšího volného bloku i přesto, že součet velikostí volných bloků je větší než paměťové nároky procesu
Pro odstranění fragmentace používají další strategie správy paměti následující metody:
setřásání bloků; problémy s adresními konstantami lze odstranit použitím segmentace stránkování = programu se jeví adresní prostor jako souvislý, přestože ve skutečnosti není
Odstranění fragmentace Procesy potřebují souvislý kus paměti -> setřásání segmentů. Provádí se zpravidla v okamžiku, kdy při startu nového procesu není žádný volný blok paměti dostatečné velikosti, ale součet volných bloků stačí (některé systémy v případě, že není dostatek volného místa, odkládají adresní prostory některých procesů na disk -> swapping, viz plánování procesů). Setřásání segmentů: překopírování adresného prostoru některých procesů + změna proměnné PCB, která slouží pro naplnění segment registru. Existují různé algoritmy, které se snaží minimalizovat velikost kopírované paměti.
některé procesory umocňují, aby každý proces mohl používat více segmentů
segmentace umožňuje, aby běžícímu procesu byla na žádost přidělena další paměť
15. Problém nedostatku operační paměti, odkládání obsahu paměti na disk, virtuální paměť.
Pro běh procesu je nutné, aby program, který ho řídí byl umístěn v operační paměti. Program se přetváří do formy schopné interpretace procesorem ve více krocích. V jistém okamžiku se musí rozhodnout kde budou kód a data umístěna ve vnitřní paměti. Cíl: Vazba adres instrukcí a dat na skutečné adresy v operační paměti. Vnitřní paměť uchovává data a programy právě běžící, popř. připravené procesy. Roli dlouhodobé paměti programů a dat plní vnější paměť. Správa paměti je nutně předmětem činnosti OS Potřeba relokace programů
–
Programátor nemůže vědět, ze které části paměti bude jeho program procesorem interpretován
–
Odkládání (swapping) umožňuje OS udržovat velkou sadu připravených procesů
–
Procesu může být dynamicky přidělována jiná (souvislá) oblast paměti – relokace
Odkládání obsahu paměti na disk: V operační paměti se uchovávají pouze ty instrukce a data, která jsou v daném časovém intervalu potřebná. Jedná se o činnost, ke které dochází, pokud nám dochází fyzická paměť. Nepoužívané procesy (lépe řečeno nepoužívané stránky procesů) jsou odkládány z paměti na disk a v případě potřeby jsou přesouvány zpět. Místu na disku, kam se data odkládají, se říká odkládací prostor (Swap Area). Alokace odkládacího prostoru Static Swap Area o
když je proces spuštěn, je pro něj rezervován alokační prostor
o
výhoda: procesy jsou odkládány na stejné místo na disku
nevýhody: o
alokujeme více, než je v daném okamžiku nutné
o
problém se zvětšujícími se procesy
Dynamic swap area o
pro každou stránku alokujeme místo na disku až při odkládání a dealokujeme ho při zpětném přesunu do paměti
nevýhody: o
proces může být ukončen při nedostatku odkládacího prostoru
o
složitější SW pro správu odkládacího prostoru
Virtuální paměť: Virtuální paměť nebo také adresování virtuální paměti je zvláštní způsob správy operační paměti počítače. Umožňuje operačnímu systému využívat vnitřní paměť, která je významně větší, než je skutečná fyzická velikost paměti. Děje se to tím, že se v danou chvíli nepotřebná paměť odkládá na pevný disk (nebo na jiný odkládací prostor) a v případě potřeby se opět zavádí do vnitřní paměti.
Výhody Paměť, kterou má běžící proces k dispozici, není omezena fyzickou velikostí instalované paměti. Bez virtuální paměti by musel operační systém přidělit i paměť, kterou proces ve skutečnosti nevyužije nebo ji začne využívat až později. Každý běžící proces má k dispozici svou vlastní paměťovou oblast, ke které má přístup pouze on sám a nikdo jiný. Metody správy paměti zabezpečují optimální výměnu paměťových stránek mezi fyzickou počítačovou pamětí a diskem. Málo používaná část paměti tak vůbec nemusí být zavedena ve vnitřní paměti. Paměť jednotlivým procesům lze tak organizovat, že se paměť z hlediska procesu jeví jako lineární, přestože ve skutečnosti může být umístěna na různých místech vnitřní paměti i odkládacího prostoru. Nevýhody Při špatném (malém) dimenzování reálné operační paměti může dojít ke ztrátě výpočetního výkonu, tzv. thrashing (probíhá neustálá výměna dat mezi pamětí a diskem namísto výpočtů). Pokud proces nemá v paměti dost stránek, často generuje přerušení výpadek stránky. To zaměstnává CPU a zpomaluje běh dalších procesů, ale hlavně tohoto procesu, neboť je v době načítání stránky pozastaven a nevykonává žadnou činnost. Dále jsou do paměti zaváděny další procesy, neboť procesor často čeká na ukončení V/V operace (právě zavádění a případné odkládání stránek). To vede k dalšímu zhoršení atd. V podstatě kladná zpětná vazba. Je ovšem nutné zmínit, že bez virtuální paměti by v takovém případě výpočet vůbec nemohl proběhnout. Základní principy virtuální paměti: Všechny adresy, které proces používá, jsou spravovány pouze jako virtuální – transformaci na fyzické adresy provádí správa virtuální paměti. Existují dvě základní metody implementace virtuální paměti – stránkování a segmentace. Při stránkování je paměť rozdělena na větší úseky stejné velikosti, které se nazývají stránky. Správa virtuální paměti rozhoduje samostatně o tom, která paměťová stránka bude zavedena do vnitřní paměti a která bude odložena do odkládacího prostoru (swapu). Při segmentaci je paměť rozdělena na úseky různé velikosti nazývané segmenty.
17. Segmentace paměti, výhody a nevýhody, podpora HW, kombinace se stránkováním Segmentová paměť Segment je skupina po sobě následujících paměťových míst, která může měnit svoji velikost až po určitou maximální hodnotu. Dalším rozdílem oproti stránkované paměti je to, že může být umístěna kdekoliv v paměti (nemusí to být násobek velikosti segmentu - segmenty jsou různě dlouhé). Tabulka segmentů obsahuje deskriptory segmentů, které nesou informaci o délce a poloze segmentu a platnosti tohoto údaje. Logická adresa se skládá z obsahu segmentového registru (báze) a offsetu. Báze segmentu může být uložena: V segmentových registrech (8086+ v reálném režimu – CS, DS, ES, ...). V tabulkách adresovaných segmentovými registry (číslo segmentu je selektorem do tabulky
segmentů). Segmentace: o
virtuální adresový prostor procesu je rozdělen na několik segmentů
o
segment je lineární posloupnost adres, od 0 do nějaké maximální adresy
o
různé segmenty mohou mít různé délky, délka segmentu se může měnit během výpočtu
o o
různé segmenty mohou mít rozdílnou ochranu a mohou být sdílené logická adresa se skládá ze dvou částí: čísla segmentu a offsetu (pro jednoduchou segmentaci)
Výhody – snadné odhalení potencionálních chyb v programech – offfset ukazuje mimo segmet – možnost sdílení kódu mezi úlohami (podprogramy – Sqrt). Nevýhody: o o o
poslední stránka procesu nebývá zcela využita -> velikost stránek nesmí být příliš velká (tzv. vnitřní fragmentace) nutné HW podpora součet paměťových nároků procesů v paměti nemůže překročit velikost fyzické paměti
Segmentace se stránkováním: o
virtuální adresový prostor je rozdělen na několik segmentů
o
každý segment se skládá z stejně velkých stránek, které jsou stejně velké jak rámce v hlavní paměti
o
z hlediska programátora se virtuální adresa skládá z čísla segmentu a offsetu uvnitř segmentu
o
z hlediska systému se offset segmentu skládá z čísla stránky a offsetu uvnitř stránky
o
segmentace se stránkováním se může používat společně s TLB
18. Soubor a jeho atributy, hierarchická organizace souborů, adresář, cesta, omezení přístupu k souboru, vlastnictví a přístupová práva Univerzální forma dlouhodobého uložení dat v sekundární paměti Pole(základní element dat, jedna hodnota-proměnná), záznam(seskupeni souvisejících polí-zaměstnanci), soubor(seskupení podobných záznamů, unikátní jméno,možnost omezeného přístup), databáze (seskupení vzájemně souvisejících dat, mezi elementy relace-logické vztahy) Organizace souborů Stoh(pile)-data shromážděna v pořadí v jakém přicházejí,cílem je data akumulovat a uložit,záznamy mohou obsahovat rozdílná pole,data nemusí být strukturovaná,přístup k záznamům úplným prohledáváním Sekvenční soubor-záznamy se stejným formátem a délkou, stejně tak i pole záznamů,atributem jména a délky polí,jedno pole záznamu představuje klíč (identifikace jedinečná) Sekvenční soubor-nové záznamy do logu nebo transakčního souboru, do hlavního souboru se záznamy zařazují dávkově,šetří čas (setčídí se pouze jednou),menší riziko ztráty dat(hlavní soubor se modifikuje méně často Index-sekvenční organizace-rychlejší přiblížení k záznamu, obsahuje pole s klíči a ukazateli na místo hlavního souboru, index nemusí obsahovat všechny klíče Indexový soubor-několik indexů pro různá klíčová pole, může obsahovat úplný (jedna položka pro každý záznam v hlavním souboru) i neúplný index Hashed file-přímý přístup k bloku na známé adrese,adresa z klíče hash-funkcí, každý záznam musí obsahovat pole s klíčem, více klíčů může dát stejnou adresu Adresář-mapování mezi jmény souborů a soubory samotnými, obsahuje informace o souborech (jméno, umístění, atributy..) Jednoduchá adresářová struktura Jeden(lineární) seznam-každý soubor má v seznamu záznam,nepodporuje potřebu uživatele na přehlednost,sekvenční soubor (klíčem jméno souboru),nelze použít pro dva různé soubory stejná jména Dvojúrovňové schéma adresáře-hlavní adresář a vněm adresáře jednotlivých uživatelů,hlavní adresář obsahuje záznam pro každého uživatele(může obsahovat informace pro řízení přístupu),více uživatelů Hierarchická struktura-jeden hlavní adresář, obsahující adresáře jednotlivých uživatelů, každý uživatel může hierarchicky tvořit podadresáře,počet úrovní může být omezen -položky souborů můžou být uloženy kdekoli, pathname-cesta od kořene k větvi se souborem(specifikovaná jmény adresářů a koncového souboru) -v různých větvích soubory se stejným jménem
-cestu k souboru možno vyjádřit relativně vzhledem k pracovnímu adresáři Přístupová práva-žádná,znalost (existence a kdo vlastní),provádění (může zavést do paměti a provádět, nesmí kopírovat) čtení (číst pro jakékoli účely, nesmí modifikovat a mazat), přidání (přidání dat na konec souboru), přepisování, změna ochrany (může měnit přístupová práva), mazání (zcela odstranit) Vlastník-všechna práva,může rozdělovat práva(jednotlivci,skupině,všem) 19. Souborový systém, jeho obecná struktura, způsoby alokace prostoru na paměťovém mediu (např. Disku) ●
Souborový systém (Filesystem) - je označení pro způsob organizace informací (ve formě souborů) tak, aby bylo možné je snadné najít a přistupovat k nim
●
Obecná struktura - pevné disky jsou obvykle logicky rozděleny na oddíly (partition), takže souborový systém se rozkládá jen na konkrétním oddílu a ne na celém disku. To umožňuje mít na pevném disku více nezávislých souborových systémů, které mohou být různého typu. -informace uložené v systému souborů dělíme na metadata a data. Metadata popisují strukturu systému souborů a nesou další služební a doplňující informace, jako je velikost souboru, čas poslední změny souboru, čas posledního přístupu k souboru, vlastník souboru, přístupová práva k souboru, seznam bloků dat, které tvoří vlastní soubor atd. Pojmem data pak míníme vlastní obsah souboru, který můžeme přečíst, když soubor otevřeme. - software, který realizuje souborový systém, bývá obvykle součástí operačního systému. Většina operačních systémů podporuje několik různých souborových systémů. Ve Windows nalezneme podporu pro souborové systémy FAT a NTFS. V Linuxu nalezneme kromě již zmíněných také ext2, ext3, ReiserFS, JFS, XFS a mnoho dalších.
●
Metody alokace - souvislá alokace - při vytváření je souboru přidělena jedna sada po sobě následujících bloků - stačí jedna položka v alokační tabulce(počáteční blok souboru, délka souboru) - dochází k vnější fragmentaci (po zrušení souboru se obvykle nepodaří do uvolněné oblasti umístit soubor stejné velikosti) - po zaplnění disku je obtížné nalézt souvislou sadu bloků potřebné délky
File Allocation Table File Name
0
1
2 FileA 3
4
5
6
7
8
9 FileB
10
11
12
13
15
16
17
18 FileC 19
20
21
22
23
24
25
26 FileE 27
28
29
33
34
30 FileD 31
32
14
Start Block Length
FileA FileB FileC FileD FileE
2 9 18 30 26
3 5 8 2 3
- řetězená alokace -alokují se jednotlivé bloky - každý blok obsahuje ukazatel na následující blok v řetězci - stačí jedna položka v alokační tabulce(počáteční blok souboru, délka souboru) - nedochází k vnější fragmentaci - kterýkoliv volný blok lze připojit na konec souboru (v případě potřeby lze snadno zvětšit velikost souboru) - logicky sousední bloky mohou být fyzicky umístěny značně daleko od sebe File Allocation Table
FileB 2
3
14
4
6
7
8
3
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 null 29
30
31
32
33
0
1
5
8
File Name ... FileB ...
Start Block Length ... 1 ...
... 5 ...
28
34
- indexová alokace - alokační tabulka obsahuje samostatný jednoúrovňový index pro každý soubor - index má jednu položku pro každý blok alokovaný souboru - alokační tabulka obsahuje číslo bloku pro indexaci -lze použít proměnou velikost bloků
File Allocation Table
FileB 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
File Name
Index Block
... FileB ...
... 24 ...
1 8 3 14 28
indexová alokace s bloky pevné délky File Allocation Table
FileC 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
File Name ...
...
FileC ...
24 ...
Start Block
Length
1 28 14
3 4 1
indexová alokace s bloky proměnné délky 20. Moderní koncepce os, jádro, monolitický systém, vrstevný systém, mikrojádro Jádro-základní součást os,hlavní odpovědností je zpráva zdrojů os (komunikace mezi hw a sw),poskytuje abstrakční vrstvu pro zdroje na nejnižším možném stupni (paměť,procesory,IO zařízení),aplikacím je poskytuje pomocí mechanismů komunikace mezi procesy a systémových volání,poskytuje prostředky pro nízkoúrovňové plánování procesů (process dispatching), komunikaci mezi procesy, synchronizaci procesů, přepínání kontextu,obsluhu přerušení,vytváření a ukončení procesů,pozastavení a obnovení procesů Hardware-firmware-assembler-jádro-os a aplikace Monolitický OS-obsahuje všechny funkce jádra v sobě, velké nesnadno přenostné nerozšiřitelné -dávkové počítače->poté mainframe (sálové počítače) s terminály, centralizace (snadná administrace,snadná implementace aplikací) nevýhodo monolitický software-uživatelské rozhraní,výkonná část a přístup k datům byly obsaženy v jedné
aplikaci (drobná změna s velikým dopadem) Distribuovaný operační systém (klient-server)-díky příchodu oop, zapouzdření,dědičnost,polymorfismus, klient může být zároveň serverem v jiném objektu Vrstvený systém-kvůli složitosti os jej dělíme na vrstvy,díky tomu můžeme složité problémy řešit jako počet snadnějších problémů,v každé vrstvě implementována vybraná podmnožina fcí systému,každá vrstva využívá primitivnějších funkcí následující nižší vrstvy, mezi sousedními vrstvami definována rozhraní umožňující modifikovat kteroukoli vrstvu bez nutnosti zásahu do ostatních vrstev Mikrojádro-jádro os plní pouze malý počet základních fcí (primitivní řízení paměti,komunikace procesů,základní plánování),ostatní služby poskytují procesy běžícími v uživatelském režimu(ovladače zařízení,souborové systémy,virtuální paměť), poskytuje jednotné rozhraní pro předávání požadavků procesem, modulární stavba usnadňuje vývoj a testování, Výhody:větší pružnost,rozšiřitelnost,přenositelnost Nevýhody:snížení výkonnosti v důsledku náhrady systémových volání výměnou zpráv mezi procesy RTOS(runtime OS)- operační systém pro počítače pracující v reálném čase Deterministické chování-operace se provádějí v pevných, předem určených časech nebo v předem určených časových intervalech (u každé operace je známo kdy nejpozději skončí) Doba odezvy-za jak dlouho systém reaguje na požadavek přerušení, skládá se z doby od příchodu požadavku na přerušení a doby obsluhy přerušení Spolehlivost-mission critical systém (katastrofální dopad poruchy),dependable systém (dostatečně spolehlivý) fault tolerant (priorita úloh, systém nesmí být vyřazen z provozu i když dojde k chybě) 21. Vlákna. Implementce vláken, výhody, nevýhody. Vlákno – je relativně nezávislá část aplikace vykonávaná sekvenčně, která má jeden tok řízení a může být plánována operačním systémem, existuje v procesu a může používat jeho prostředky. Implementace vláken v uživatelském prostoru Podpora vláken může být zabudována přímo do jádra operačního systému, anebo může být implementována na úrovni knihovních funkcí v uživatelském procesu. Podpora vláken na úrovni knihoven a jádra je v různých podobách dostupná na celé řadě systémů. Hlavním problémem, který bránil širšímu využití, byla vzájemná nekompatibilita těchto implementací. Ve světě otevřených operačních systémů nabývají stále většího významu normy IEEE POSIX 1003, které jsou podporovány jak v prostředí systémů Unix, tak ve specializovaných systémech (QNX, Lynx, apod.)
Run-time system: množina funkcí, která spravuje vlákna. Jádro nemá o vláknech žádné informace Výhody: vlákna mohou být implementována v OS, které nepodporuje vlákna rychlé plánování vláken každý proces může mít svůj vlastní plánovací algoritmus Nevýhody: pro implementaci blokujících systémových volání je třeba buď volat systémovou funkci select, nebo se tato volání musí změnit na neblokující problémy s výpadkem stránky žádný Clock Interrupt uvnitř procesu (jedno vlákno může okupovat CPU během celého časového kvanta procesu) 22. Síťový OS distribuovaný OS ●
Síťové operační systémy - Tyto systémy definují jak se bude počítačová síť chovat k jednotlivým uživatelům a prostředkům. - Síťové operační systémy jsou potřeba k zajištění provozu sítě a k možnosti ji využít. Poskytují možnosti pro nasazení a provoz podnikových systémů. - Tyto OS jsou také zapotřebí k provozu internetových serveru - princip jak se to nejčastěji využívá: pro uživatele je nainstalovaný operační systém Windows a na straně serverů je nějaká distribuce linuxu nebo freebsd. Tyto servery pak nejčastěji zajišťují tyto služby: 1. připojení sítě do internetu 2. firewall 3. souborový server (typický server SAMBA,dříve MARS) 4. při pomalejším připojení také cache server (SQUID) 5. databázový server (mysql,postgresql,oracle) 6. webový server(apache)
7. poštovní server(sendmail,postfix,qmail) 8. komunikační server(různé irc,icq,jabber) 9. tiskový server CPU
CPU
...
CPU
Těsně vázaný m u ltip r o c e s o r o v ý s y s té m
S b ě r n ic e P am ěť
●
Distribuovaný operační systémy - soubor nezávislých počítačů, které se jeví svým uživatelům jako jeden souvislý systém - lze sdílet zátěž (load-sharing), výpočty se tím zrychlují - zvyšuje se spolehlivost a komunikační schopnosti - každý samostatný procesor má svoji vlastní lokální paměť - vzájemně se komunikuje pomocí přenosových spojů (sítě) mechanismem výměny zpráv
K lie n t
K lie n t
...
K lie n t
D is tr ib u o v a n ý s y s té m ty p u k lie n t- s e r v e r
K lie n t
S íť o v á in f r a s t r u k t u r a S e rv e r
●
Shrnutí: Síťové systémy – více procesorů (tzv. Multiprocesory) – sdílí společný FAP (fyzický adresní prostor) – všechny procesory mohou „současně” vidět stav paralelně řešené úlohy udržovaný ve sdíleném FAP – paralelní systémy jsou řízeny paralelními algoritmy – někdy též „těsně vázané“ systémy (tightly-coupled systems) Distribuované systémy – více počítačů (ne nutně shodných) – každý má samostatný FAP – komunikují periferními operacemi (komunikační spoje, síť) – stav distribuovaně řešené úlohy si musí každý zúčastněný počítač postupně získávat výměnou zpráv řízenou distribuovanými algoritmy
– někdy též „volně vázané“ systémy (loosely-coupled systems) 23.Požadavky na OS pro práci v reálném čase RT, pojmy latence a odezva, vestavěné systémy ●
práce OS v reálném čase - složité řídící aplikace, které stanovují přísná časová omezení na provedení úloh umožňující prognózovat odezvu operačního systému. U RT systému, je kód každé úlohy dopředu znám, a tak může být analyzován za účelem určení jeho základních charakteristik jako jsou doba výpočtu, potřeba nejrůznějších zdrojů výpočetního systému nebo priority k ostatním úlohám. Úloha pak musí být zpracovaná v předem určeným intervalu(kritické úlohy musí plnit své časové termíny). Toto se nazývá deterministické chování(provádění v předem určených časech). -úlohy a procesy reagují na události pocházející zevně systému a navenek dodávají své výsledky (Nastávají v „reálném čase“ a potřebná reakce musí být včasná)
●
požadavky - extrémně rychlé přepínání mezi procesy či vlákny (řízení přepínání, resp. výměny, úloh je realizováno plánovačem a jeho složitost závisí na složitosti přijaté strategie přidělování procesoru procesům) - OS musí být malý - minimalizace časových úseků, kdy je vypnut přerušovací systém (pokud přerušovací systém nepovolíme, může v průběhu chodu systému dojít k chybám vznikajících z nesynchronizovaného chodu dvou úloh. Pořadí provedení instrukcí v kritických sekcích může být příčinou nesprávného, tzv. nedeterministického chování celého systému) - preemptivní plánování založené na prioritách (Preempce je akce, při níž operační systém přeruší aktuálně běžící úlohu a přidělí procesor jiné úloze. Preempce může být uskutečněna jen v určitých bodech chodu běžící úlohy anebo může být v určitých oblastech kódu zakázána) - odolnost vůči poruchám (Jednotlivé hardwarové nebo softwarové poruchy by neměly způsobit výpadek systému. Proto musejí být kritické komponenty systému navrženy tak, aby běžným poruchám odolaly) - zvláštní hardwarové vybavení (hlídací časovače (watch-dog timers) a alarmy) - časová přípustnost (výsledky musejí být správné nejenom numericky, ale i z hlediska jejich poskytnutí v čase. Proto musí operační systém obsahovat specifické mechanismy jádra pro časové řízení úloh)
●
latence - doba mezi okamžikem příchodu požadavku na přerušení a okamžikem kdy se začne provádět odpovídající obslužný program
●
doba odezvy - za jak dlouho systém reaguje na požadavek přerušení, skládá se z doby od příchodu požadavku na přerušení a doby obsluhy přerušení
●
vestavěné systémy - jsou součástí jiných technických systémů (obvykle jsou řídící složkou), schopnost práce v reálném čase, os transparentní(průhledný) pro uživatele (nevyžadují údržbu a zvláštní znalosti), vysoký podíl na trhu, existují např. V mobilních telefonech, PDA atd.
24. Návrh OS a jeho bezpečnost, důvody náročnosti implementace OS, zabezpečení, typy útoků, prevence, způsoby ochrany systému, uživatelů, procesů.
●
Cíle HW - definování správných abstrakcí (nejnáročnější procesy, soubory, atd.) - definice datových struktur a operací na nich (procesy, soubory, semafory) - separace a izolace uživatelů i procesů (izolace chyb) - správa HW (čipy pro přerušení, řadiče, IO zařízení)
●
principy: jednoduchost, úplnost, efektivnost
●
náročnosti implementace os - nesmí nastat chyby v synchronizaci (program čekající na I/O zařízení musí dostat ve správné době správný signál) - nesmí nastat chyby ve výlučném přístupu (v jednom okamžiku smí s určitými daty pracovat pouze jediný program) - smrtící smyčka (Deadlock) (nesmí se stát, aby 2 nebo více programů čekalo jeden na druhý)
●
bezpečnost a ochrana - řízení přístupu k prostředkům - dovolit vstup do systému pouze oprávněným uživatelům - dovolit uživatelským procesům přístup pouze k prostředkům, pro které mají oprávnění (operační paměť, soubory, periferní zařízení)
●
typy útkoků - útok hrubou silou (používají se password crackery. V podstatě jde o to, že tyto "louskače hesel" se vrhají na server a zkouší různé kombinace znaků jako hesla (či uživatelská jména), popř. berou hesla ze slovníku, velmi časově náročné) - odchytávání dat (útoky na hardware) - buffer overflow (Princip je v tom, že máte rezervovanou pro proměnnou určitou paměťovou oblast a zapíšete do ní něco většího. To se "prečnívá", může být vykonáno jako příkaz) - další typy útoků, zevnitř (např. trojské koně)
●
způsoby ochrany - systém – domény ochrany (stanovení domén a práv) - uživatel – acces control list (stanovení seznamu práv na objekty pro jednotlivé uživatele) - procesy - capabilty list (stanovení práv procesům)
25. Multiprocesorové systémy, rozdělení, alokace procesorů v smp-systémech Single instruction single data - jeden procesor zpracovává jednu množinu dat Single instruction multiple data - jedním proudem instrukcí se ve více procesorech zpracovává více různých množin dat Multiple instruction single data - jedna množina dat je předána více procesorům z nichž každý provádí jinou posloupnost instrukcí (nebylo realizováno) Multiple instruction multiple data - kombinace procesorů, které souběžně
zpracovávají odličnými posloupnostmi instrukcí odlišné množiny dat Klasifikace: Dle stupně vazby -s volnou vazbou(každý cpu má vlastní operační paměť a IO systémy, vazba přes sběrnice/disky/lan) - s těsnou vazbou(sdílejí operační paměť, řízeno jedním os) Dle symetrie SMP-procesory shodné,jádro os může provádět jakýkoli procesor,spustitelné procesy či vláka lze provádět v kterémkoli volném procesu Asymetrický MP-procesory funkčně specializované, systém řízen centrálním procesorem Granularita úlohy-rozčlenění úlohy na samostatně proveditelné úseky, pokud jeden úsek pro své dokončení potřebuje výsledky jiného musí čekat,čím jemněji granulovaná úloha tím jsou úseky kratší a požadavky na komunikaci a synchronizaci častější (hrubá-kooperující procesy,jemná-vlákna),čím je vazba MP volnější tím větší časové ztráty přináší komunikace a synchronizace Nezávislý paralelismus-na procesorech nezávislé procesy,bez synchronizace,zkracuje se střední doba odezvy pro uživatele Velmi hrubý paralelismus-distribuované zpracování rozptýlené do více uzlů sítě,clustery,vhodné když není častá interakce mezi procesy Hrubý paralelismus-jako provádění více procesů na jednom procesoru, ale rozdělené na více procesorů Střední paralelismus-paralelní zpracování nebo multitasking v rámci jedné aplikace,jedna aplikace tvořena více vlákny,interakce jsou časté Plánování procesů-buď jedna globální fronta nebo pro každou prioritu samostatná, společná zásobárna procesorů (proces se přiřadí prvnímu volnému procesoru), složitější algoritmy se při použití více procesorů obvykle nepoužívají *Plánování vláken-sdílení zátěže(žádný proces není výhradně přiřazen k procesoru),skupinové plánování(související vlákna jsou plánována tak aby běžela na různých procesorech současně),pevné přiřazení procesoru(vlákna jsou přiřazena specifickému procesoru), dynamické plánování(počet vláken se může během provádění měnit) Sdílení zátěže-zátěž se rozděluje mezi procesory náhodně, zajišťuje aby žádný procesor nezůstal nevyužitý,není potřebný centralizovaný plánovač,používá globální fronty, nevýhody:globální fronta vyžaduje výlučný přístup (úzký přístup pokud žádá více procesorů najednou),je nepravděpodobné že přerušené vlákno bude znova spuštěno ve stejném procesoru(snížení efektivity cache),jestliže v globální frontě čekají všechna vlákna nebudou všem vláknům jednoho procesu přiděleny procesy ve stejnou dobu Skupinové plánování-všem vláknům tvořícím jeden proces se přidělují procesory
současně, užitečné pro aplikace jejichž výkonnost by výrazně poklesla kdyby některá část aplikace neběžela, vlákna obvykle vyžadují vzájemnou synchronizaci Pevné přiřazení procesoru-když se plánuje spuštění aplikace jsou všem jejím vláknům napevno přiřazeny procesory,některé procesory mohou zůstat nevyužity, brání přepínání procesů Dynamické plánování-počet vláken v procesu se v aplikaci může dynamicky měnit, operační systém upravuje zátěž s cílem zlepšit využití systém (obsazuje volné procesory, nově příchozím může být přiřazen procesor obsazený úloho která právě využívá více než jeden procesor,požadavek trvá dokud není k dispozici volný procesor,nově příchozí dostanou procesor ještě před existujícími běžícími aplikacemi) 26. Procesy v linuxu, inicializace systému, proces init, příkaz ps, adresář /proc //red hat Inicializace systém: bios (inicializace a disk, najde boot disk,spustí zavaděč OS)LInuxLOader-načte jádro,dekomprimuje,spustí-vládu přebírá jádro-detekce zařízení,jejich inicializace,připojení kořenového souborového systému-spuštění procesu init Init-má číslo 1,rodič všech procesů, po spuštění nahlédne do /etc/initlab kde zjistí jaké další procesy spouštět (/etc/rc.d/rc.sysinit-inicializace – nastavení klávesnice,font pro textový režim,raid disky), poté přihlášení uživatele *runlevel-úroveň běhu systému (např. úroveň 5-multiuživatelský mód s podporou sítě a se spuštěním x window) ps ps –ef -> zobrazí všechny procesy PPID(čím spuštěn), STIME(čas spuštění), TIME(procesorový čas) pssterr-výpis návazností mezi procesy *top (seřazení dle zabraného procesorového času),ni (úprava priority), S (stavrunning, sleeping) procfs-virtuální souborový systém, v hlavní adresáři adresáře procesů(mají místo názvu číslo PID – process identifier, obsahuje soubory cwd-adresář v kterém se proces nachází, root-adresář nad jehož úroveň nemůže program přistupovat, cmdlineparametry s kterými byl spuštěn, fd-symbolické linky na soubory a síťová spojení které má program otevřené), adresáře a soubory jádra -> nejzajímavější /proc/sys – sysctl (system control) soubory, změnou těchto souborů je možné měnit nastavení jádra za běhu a ovlivňovat jeho chování 27. Časové plánování procesů, příkazy at a crontab. UN*Xové systémy podporují multitasking, který funguje na základě režimu sdílení času procesoru (timeshare). Procesorový čas je mezi jednotlivými procesy sdílen, procesy se ve svém běhu střídají podle určitých pravidel a vytváří se tak iluze, že více procesů běží současně. Rozvržení procesorového času mezi jednotlivé procesy obstarává plánovač procesů, který je součástí jádra systému. Funguje to tak, že plánovač přidělí procesor určitému procesu na určitou dobu a po jejím vypršení vykonávání procesu pozastaví a naplánuje
jiný proces - takový, který má nejvyšší prioritu, případně se nachází ve stavu připraven k běhu nejdelší dobu. V hodnotě priority, která je pravidelně přepočítávána, se negativně odráží i doba, po kterou proces běžel během posledního časového úseku, jehož délka je předem stanovena. Tak je zaručeno spravedlivé střídání procesů - priorita procesu, který je připraven k běhu roste (do určité meze) čím déle proces čeká na zpracování a naopak priorita procesu, který v nedávné době běžel nebo běží se snižuje. K práci s časem jádro využívá časovač, který je součástí hardware a v určitém neměnném intervalu pravidelně přerušuje procesor. Plánování na různých OS Unix: o
prioritní plánování s prioritními třídami
o
vyšší numerická hodnota priority zmanemá nižší prioritu
o
procesy dostávají přidělena "různě" velká časová kvanta
o
priorita každého procesu se přepočítává každou sekundu
o
CPUj(i) = ½CPUj(i - 1) a Pj(i) = Bj + ½ CPUj(i) + nicej, kde nicej je uživatelem modifikovatelná část priority a Bj umožňuje definovat prioritní úrovně
Windows XP: o
prioritní plánování s předbíháním
o
různě velká časová kvanta (normálně 2x Clock Interval)
o
úrovně priorit:
o
kernel (0 = System Level; 1-15 = Dynamic Levels; 16-31 = Real-Time Levels)
Typy plánování: o
dlouhodobé (Long-Term Scheduling) - určuje, které programy budou zpracovány systémem
o
střednědobé (Medium-Term Scheduling) - součást odkládací funkce
o o
krátkodobé (Short-Term Scheduling) - při přerušení od časovače nebo V/V zařízení, systémové volání, signály,... V/V (I/O Scheduling) - určuje, který V/V požadavek bude obsloužen volným V/V zařízením
Kriteria krátkodobého plánování: o
uživatelské hledisko
o
doba zpracování = doba, která uplyne od spuštění do uplynutí procesu
o
doba odpovědi = doba, která uplyne od okamžiku zadání požadavku do doby první reakce
o
dosažení meze = zaručení ukončení procesu do dané meze
o
předvídatelnost = proces by měl pokaždé běžet "stejně" dlouho bez ohledu na zatížení systému
systémové hledisko o
propustnost = počet procesů dokončených za jednotku času
o
využití procesoru
o
spravedlivost = zamezení vyhladovění (Starvation)
o
prosazení priorit = možnost uplatnit zvolenou plánovací strategii
o
vyvážení V/V = snaha udržet V/V prostředky maximálně vytížené
Strategie plánování plánování s předbíháním (Preemptive Scheduling) - real-time systémy o
běžící proces je zablokován automaticky po uplynutí časového kvanta
o
jediná možná strategie v RT-systémech a víceuživatelských systémech
plánování bez předbíhání (Non-Preemptive Scheduling) - dávkové systémy o
proces běží, dokud nepožádá o nějakou službu jádro nebo neskončí
o
proces může blokovat systém a musí „spolupracovat“ pouze když žádá službu jádra
o
používalo se v dávkových systémech
o
používá se v některých systémech pro speciální třídy procesů / vláken
periodicky/opakovaně "někdy později" - pomocí démonu "crond". Popis spouštění příkazů je uložen ve struktuře (souboru) zvané crontab. Globální systémový soubor popisu tohoto opakovaného spouštění je /etc/crontab, uživatelé mohou mít svůj popis - ten je pak uložen v souboru /var/spool/cron/jméno_uživatele. Globální specifikaci může ovlivnit pouze root a může ji tvořit/modifikovat přímo textovým editorem, uživatelská je přístupná pomocí příkazu "crontab". Prvních pět polí řádky popisu jsou specifikace času, kdy se má daný příkaz vykonat. V globální specifikaci je jako šestý parametr jméno uživatele, pod kterým je daný program (sedmý parametr) spuštěn, v uživatelské specifikaci není - šestý parametr je specifikace programu a program je vždy spuštěn s UID uživatele. Root může povolit/zakázat uživatele, kteří mohou používat spouštění úloh pomocí cron démonu, jejich vyjmenováním v souborech /etc/cron.allow a /etc/cron.deny. Zbytek řádky struktury crontab jsou parametry programu (tento zbytek je celý předán shell-u k vykonání, tzn. může to být zřetězení příkazů vč. přesměrování vstupů/výstupů). Implicitní shell je "/bin/sh", je možné specifikovat jiný shell deklarací proměnné SHELL. Speciální znak "%" bude démonem crond změněn na a vše za ním bude posláno na standardní vstup příkazu. jednorázově "někdy později" - pomocí démonu "atd". Úlohy (je možno je zadat jak ze stdin tak ze vstupního souboru) se zařadí do časové fronty démona - pomocí příkazu at nebo batch; je možné je kdykoliv vypsat příkazem atq nebo je z časové fronty smazat příkazem atrm. Příkaz at má řadu voleb specifikace data a času spuštění úlohy.
28. Vznik nového procesu, funkce fork, hierarchie procesů Vznik nového procesu. vznik nového procesu (cat) je na žádost volání jádra. Volání jádra, která znamenají vznik nového procesu jsou fork a exec. Běžící proces vytvoří kopii sebe sama, procesy vykonávají stejný kód. Rozlišení rodič a potomek na úrovni identifikátoru procesu. Segment kódu je explicitně spojen s novým procesem. Procesy vykonávají různý kód. Bez ohledu na vznik procesu je důležité, zda Rodičovský proces pozastavuje svou činnost po dobu běhu potomka. Rodič a potomek sdílí paměť. fork vytvoří klon jako nový proces. Jako kdyby se na jednom místě procesor rozhodl vydat se dvěma cestami v programu. Jeden proces pokračuje na jednu stranu, druhý proces pokračuje na druhou stranu. Oba mají v bodě rozdělení stejné výchozí podmínky. Avšak oba procesy získají kompletně svůj stav pro sebe. Operační systém zajistí, že při změně paměti obdrží každý proces svou kopii. Hierarchická struktura procesů Vznik nového procesu je iniciován jiným procesem. Vzniká tedy hierarchická struktura procesů z pohledu rodičů a dětí, protože každý rodič může mít teoreticky neomezený počet dětí. Každý proces přitom musí mít nějakého rodiče vyjma prvního, který je kořenem této stromové struktury běžících procesů. První proces vzniká při startu operačního systému z iniciativy jádra a má číselnou identifikaci 0. Proces je vždy pojmenován podle jména souboru s řídicím programem. První proces má obvykle jméno sched (nebo swapper) a jeho funkce je práce pro odkládací oblast (swap area) ostatních procesů. Jeho první aktivita je ovšem žádost o vznik nového procesu, ten má PID=1, jeho
jméno je init a je to proces označovaný jako prapředek všech dalších procesů. init je proces, který podle tabulky /etc/inittab startuje nové procesy zajišťující chod operačního systému (jde o procesy zajištění frontování požadavků na tiskárnu, obsluhy požadavků sítě, oživení terminálů uživatelů nebo grafických adaptérů atd.). init je proces, který řídí práci dvou základních režimů operačního systému: režimu víceuživatelského (multi user) nebo jednouživatelského (single user). Režim je zajištěn během odpovídajících procesů, tj. skupinou procesů. Režim víceuživatelský znamená běh procesů, které umožňují uživatelům přihlašovat se a pracovat se svými daty. Jednouživatelský je režim, který podporuje práci pouze jednoho uživatele (privilegovaného uživatele) na periferii systémové konzoly a všechny další aktivity systému pro práci periferií jsou utlumeny (je určen pro údržbu systému). Jiný režim ale neznamená žádné omezení práce jádra pro procesy, všechny funkce jádra jsou tytéž. 29.Signál, implicitní zpracování signálu, zpracování signálu programem ●
Signály -signály umožňují oznámit procesům výskyt událostí v systému - jde o krátké zprávy, kde se procesům oznámí číslo signálu - standardní rozhraní specifikuje POSIX. Čísla některých signálů závisí na HW, označují se symbolickými konstantami SIG -signály slouží dvěma hlavním účelům: - uvědomit proces, že nastala určitá událost - přinutit proces vykonat funkci na zpracování signálu (signal handler) - seznam všech signálu v POSIX vypíšeme v konzoly příkazem kill -n
●
implicitní zpracování signálu -na příchod signálu může proces nechat k vyřízení jádru, což ve většině případů znamená ukončení práce procesu (odtud zápis kill). Dále může signál ignorovat, anebo ho zachytit a reagovat na něj určitou akcí. Signál č. 9 (SIGKILL) nelze zachytit ani ignorovat. V případě ukončení procesu jádrem u signálů v tabulce označených znakem '*' jádro proces ukončí a v pracovním adresáři procesu vytváří obraz paměti procesu v době příchodu signálu a ukládá jej do souboru se jménem "core". Po příchodu signálu je funkci předáno řízení a pokud ona sama neukončí činnost práce procesu, po návratu z ní proces pokračuje od místa příchodu signálu
●
zpracování signálu programem -systémová volání umožňují programátorovi zasílat signály a určit jak budou použity
číslo
označení
implicitně
význam
1 2 3 4 5 6 7 8 9
SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT SIGEMT SIGFPE SIGKILL
ukončení ukončení * * * * * * ukončení
odpojení terminálu, přerušení z klávesnice, konec s uložením obrazu paměti, neznámá instrukce, ladící přerušení, ukončení z důvodu v/v, instrukce EMT, kolize reálného čísla, okamžité ukončení procesu,
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
SIGBUS SIGSEGV SIGSYS SIGPIPE SIGALRM SIGTERM SIGUSR1 SIGUSR2 SIGCHLD SIGPWR SIGWINCH SIGPOLL SIGSTOP SIGTSTP SIGCONT SIGTTIN SIGTTOU SIGXCPU SIGXFSZ
* * * ukončení ukončení ukončení ukončení ukončení ignorování ignorování ignorování ukončení pozastavení pozastavení ignorování pozastavení pozastavení * *
kolize sběrnice, selhání segmentace, chybný tvar volání jádra, zapisovanou rouru nikdo nečte, konec časového intervalu, ukončení, první signál definovaný uživatelem, druhý signál definovaný uživatelem, změna stavu synovského procesu, kolize zdroje, změna velikosti okna, příznak při práci s PROUDY, signál pozastavení procesu, pozastavení procesu uživatelem, pokračování v činnosti, čekání na vstup, čekání na výstup, konec časového kvanta procesoru, překročení stanovené délky souboru. Tabulka signálů
30. Komunikace procesů rourou, pojmenované a nepojmenované roury Roury (pipes) jsou nejstarsim komunikacnim prostredkem v unixu. Jsou podporovany vsemi typy unixu za techto omezujicich podminek: o
Mohou byt pouzity pouze v pripade, ze procesy maji spolecneho predchudce.
o
umožňují jednosměrnou komunikaci mezi dvěma procesy zpravidla mezi rodičem a potomkem
o
data zapisovaná do roury jedním procesem lze jiným bezprostředně číst
o
data jsou čtena přesně v tom pořadí jak byla zapsána
Komunikace dvou procesů na úrovni přenosu dat je možná pomocí roury (pipe), kdy procesy pracují podle schématu Pojmenované roury Co ale kdybychom chtěli nějakou rouru využívat opakovaně? Linux nám k tomu nabízí mechanismus zvaný pojmenovaná roura (named pipe). Pojmenovaná roura je speciálním typem souboru existujícího v souborovém systému. K jejímu vytvoření slouží program mkfifo. Syntaxe je jednoduchá. Stačí zadat jen její jméno, např. mkfifo roura. Že nejde o běžný soubor, si můžeme ověřit příkazem ls -l roura. Na začátku bloku s přístupovými právy vidíme "p" - pipe. Nyní můžeme do roury něco poslat, třeba přesný čas: date > roura. Nelekejte se, pokud se neobjevil prompt. To je v pořádku. Proces čeká na vyprázdnění roury. Spusťme tedy jinou konzoli nebo terminál, přejděme do adresáře, kde leží naše pojmenovaná roura a zadejme třeba cat roura. Ve druhém Bashi budou vypsány příslušné údaje a v prvním se objeví prompt. Funguje to i obráceně. Můžeme nechat nějaký proces číst z prázdné roury (cat roura). Ten bude čekat až do doby, kdy se roura zaplní. To provedeme třeba informacemi o našem systému (uname -a
> roura) na jiném terminálu. Až nyní cat svou práci dokončí. Tohoto chování lze využít v mnoha situacích. Dostaneme se k nim, až budeme tvořit skripty. Pracuje jako FIFO (fronta), tedy pri ctení jsou data mazána. Nepojmenovaná roura:pojmenovaná roura Roura muže být používána pouze procesy, které mají stejnéhopredchudce (obvykle shell, ze kterého byly spušteny), zapisovat a císt muže i více procesu. 31. POSIX threads. Synchronizace vláken, mutex, podmínková proměnná. •
Pthreads je POSIX-ový standard definující API pro vytváření a synchronizaci vláken a specifikace chování těchto vláken
•
Pthreads jsou základem pro vlákna v tradičních UNIX-ech
•
Knihovna Pthreads pracuje s uživatelskými vlákny, takže nepotřebuje podporu v JOS
•
Příklad: Samostatné vlákno, které počítá součet prvních n celých čísel
Synchronizace vláken: pravidla, pomocí kterých částečně kontrolujeme běh vláken, se souhrnně nazývají synchronizace vláken. Obecně existuje několik mechanismů synchronizace vláken (jedná se například o mutexy, semafory, monitory, mechanismus randez-vous a o některé další mechanismy) Mutexu Nejprve si položme otázku, co je to kritická sekce. Za kritickou sekci považujeme tu část kódu vlákna, která operuje nad sdílenými daty a hrozí, že paralelně může jiné vlákno operovat nad stejnými daty. Důsledkem může být nekonzistence dat. Například jedno vlákno zvýší sdílenou proměnnou A o jedna a dále s ní počítá, kdežto druhé vlákno proměnou A zmenší o dvě a dále s ní počítá. Pokud se poštěstí, tak se instrukce mohou proložit tak, že ani jedno vlákno nedá správný výsledek. Tomuto je třeba zabránit a to tím, že do té části, která pracuje s proměnnou A může vstoupit pouze jedno vlákno, druhé musí čekat až to první skončí. Takovéto kritické sekce, kde může být v jednom okamžiku pouze jedno vlákno, nazýváme MUTEX (MUTual EXclusion). Mutex má dva stavy - zamčený (locked - některé vlákno je uvnitř) a odemčený (unlocked - v mutexu nikdo není). Podmínková proměnná: Čekání na mutex v operaci mutex_lock() může být implementováno jako programová smyčka (tzv. busy-wait čekání), pročež nejsou mutexy (na rozdíl od semaforů) dobré pro čistě synchronizační účely (kdy jedno vlákno čeká neodhadnutelnou dobu na dosažení nějakého bodu v programu jiného vlákna). V takovém případě je lepší vyrobit semafor jako objekt kombinací zámek plus podmínková proměnná (viz dále). Objekt podmínková proměnná implementuje "kontejner pro čekání vláken" (tj. prostor-čekárnu, implementačně nějaký seznam vláken) na splnění příslušné podmínky. Čekání je "pasivní", tj. všechna vlákna nacházející se "v čekárně" jsou ve stavu waiting. 32. Komunikace procesů pomocí socketů, funkce pro sockety. Co jsou sockety Sockety můžeme chápat jako jeden z prostředků meziprocesní komunikace. Od jiných
komunikačních prostředků se liší především tím, že komunikující procesy nemusí být na stejném počítači. Co se týče terminologie, tak představíme-li si komunikaci jako rouru, kterou tečou data, socket by bylo pojmenování pro její konce. Při komunikaci si každý proces vytvoří svůj socket a nastaví jeho parametry tak, aby pomocí něj mohl komunikovat se socketem jiného procesu (na jiném počítači). Socket se vytvoří voláním funkce socket(). Tato funkce vrací file-descriptor stejně jako například funkce fopen(). Pro čtení ze socketu a zapisování do něj můžeme použít nízkoúrovňové funkce jako třeba read() a write(). Navíc máme k dispozici několik funkcí speciálně pro sockety. Programy můžeme rozdělit do dvou skupin podle toho, jak používají sockety (SOCK_STREAM). První skupinou jsou takzvané servery, což jsou programy, které vytvoří socket a pak čekají (poslouchají) až se k nim někdo připojí. Druhou skupinou jsou klienti, kteří po vytvoření socketu začnou aktivně navazovat spojení. Podle toho, do jaké skupiny daný program patří, volají se různé funkce uvedené níže. socket() int socket(int domain, int type, int protocol);
Vytvoří socket daného typu a vrátí file-descriptor. Používá server i klient. connect() int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
Slouží k navazování spojení. Používá klient. bind() int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
Sváže socket se jménem. Nejčastěji se používá v kombinaci s listen() pro určení čísla portu na kterém server poslouchá. Používá server. listen() int listen(int sockfd, int backlog);
Volá se po bind() a slouží k nastavení socketu do stavu čekání na příchozí spojení. listen() se okamžitě vrací. Vlastní čekání se děje až ve funkci accept(). Používá server. accept() int accept(int sockfd, void *addr, int *addrlen);
Je-li socket v čekacím stavu, funkce accept() čeká na příchozí spojení. Funkce vrátí parametry prvního spojení ve frontě a nový socket, který slouží ke komunikaci s druhou stranou. Původní socket sockfd se tak může opět použít pro čekání na další spojení. Používá server. Obrázek 1. Princip funkce accept()
close(), shutdown() Zavírá socket. Používá server i klient. Další funkce, které pracují se sockety jsou send(), recv(); sendto(), recvfrom() (pro SOCK_DGRAM) a mnohé další.