OSY Flashcards
Ukoly operacniho systemu
- Spoustet a dohlizet na uzivatelske programy
- Efektivne vyuzivat HW
- Usnadnit uzivatelske problem
- Ucinit pocitac snadne pouzitelny
Obecna pohled na definici - co je operacni system a co poskytuje
Je to jakesi rozsireni/nadstavba pocitace, je to program krery ovlada hardware a ridi chod celeho systemu- zakryva komplikovane detaily hardware a uzivatelis poskytuje snadno ovladatelny virtualni stroj
Direguje systemove prostredky mezi programy - poskytuje prostredky a casovy rozvrhovani, prostor v CPU, pameti, periferiich…
Pyramida slozeni uzivatelske urovne, pres programatora az k hardware
- Aplikacni pgoramy - uviatelske aplikace
- Servisni programy - kody, programatorske
- Jadro op. systemu - syscally - prostredek mezi programatorem a HW, je to zabezpeceni, tedy komunikuje to s HW pomoci programatorskych programu, ALE NE PRIMO
- Hardware - komunikuje s op. systemem pomoci interruptu
Kdy “bezi” jadro operacniho systemu?
Jadro OS neni proces, ktery by aktivne bezel, ale je to mnoho funkci, spustenych pri preruseni, vyjimkach, syscally atd… Jadro OS vlastne dela vsechno, co muze pocitac vykonat…
Pri prerusenich, kdyz je potreba neco osetrit, vykonat rutinu. Tedy bud servisni program zavola read/write data treba, nebo nejaky vstupni HW zmacknul klavesi a posle preruseni, tehdy se JOS probudi a zacne zpracovavat, co se stalo
Muzu jako uzivatel nebo programator komunikovat primo s HW?
Ne, tato komunkace je z bezpecnostnich duvodu zprostredkovana JOS
Co se prida do 64-bitove adresy OS v x86?
Hodne ruznych flags, ktere uchovavaji vysledky predchozich vypoctu.
Dulezity je IOPL - I/O privilege level, tedy uroven privilegii, JOS bezi v nejprivilegovanejsi urovni - muze vykonavat vsechny instrukce, uzivatelske programy maji omezenou privilegii - muzou vykoanvat pouze nektere instrukce
Nekolik druhu privilegovane operace
Ovlivnuji stav celeho systemu - halt, reset, interrupt enable/disable, modifikace registru MMU, instrukce pro I/O…
Prechody mezi rezimy po spusteni pocitace
- Zapnuti stroje - bezi v systemovem rezimu (privilegovanem)
- Prejde se do uzivatelskeho (omezeneho)
- Prechod do systemoveho pouze pri prerusenich…
Par dulezitych registru x86
eax, ebx, ecx,… esp - stack pointer, epc - program counter…
Porovnani MIPS, RISC-V, ARM, x86, AMD
Jsou to vsechny odlisne architektury, ktere maji svoje sady instrukci a jejich specifikace.
- MIPS, RISC-V, ARM - RISC architektury, mensi, jednodussi, primitivnejsi - prvni pouziti, nebo konzole nejake…
- x86, AMD- CISC architektury, slozitejsi, komplexnejsi instrukce a specifikace… - hlavni pouziti v pocitacich
Co je obecne ochrana jadra OS?
Mechanismy pro kontrolu a rizeni pristupu k systemovym a uzivatelskym zdrojum, tedy pamet, HW, soubory…
System ochran prorusta vsemi vrstvami OS, detekuje chyby nebo neautorizovane pristupy.
Zamezuje fatalnim chybam, ktere by uzivatelske programy mohly vnest do celeho systemu
Jak z kodu programu prejit z uzivatelskeho rezimu do systemoveho?
- Bud specialni instrukci tohoto jazyka programovaciho - int, sysenter…
- Systemova volani - specialni isntrukce pro sluzby jadra (syscall)
Timto se rezim prepne do systemoveho rezimu a OS obsluhuje preruseni - koukne, jaky druh preruseni nastal (to jsem jako programator ulozil do specialniho eax registru a pak zavolalm obecny interrupt) a vybere podle lookup table ossetrovaci rutinu, pak se vrati do uzivatelskeho
Tedy:
1. nastavim do registru druh preruseni
2. zavolam interrupt
ABI
Application BInary interface - je to interface pro komunikaci programu s OS, tedy definuje rozhrani preruseni - do jakych registru nastavit typ, jak zavolat rperuseni atd…
Jak se predavaji data a parametry do/z syscally?
Vstupni argumenty ulozim do specialnich registru, pak zavolam preruseni, osetrujci rutina mi do nich zapise vysledky nebo hodi na zasobnik
Hlavni sluzby jadra OS - pro co se pouziva a kdy se zapne priilege mode
- Prace se soubory - open, close, read, write
- Sprava souboru a adresaru - mkdir, rmdit, chmod…
- Sprava procesu - fortk, wait, exit, kill, signal
Monoliticky vs mikrojaderni system
- Monoliticky - jadro OS je jeden celek a v systemovem rezimu se nachazeji vsechny komponenty krome uzivatelskych programu - tedy CPU, disky, souborovy system, sub ovladace, obecne ovladace atd…
Je to jedna velka bublina do ktere uzivatelske programy sahaji.
Tedy jadro je jeden velky program se vsim uvnitr.
Rizika - vsechny pod-komponenty uvnitr jadra se navzajem vidi amohou sahat na data, tedy treba USB ovladas ma pristup ke klici sifrovani disku a nejaky uzivatelsky program na to muze zautocit.
Tezko se v tom hledaji chyby.
- Mikrojadro - pristup, kdy jadro OS je velmi male a jednoduse se tam hledaji chyby. Pouze dierguje uzivatelske procesy, ktere pri ptrebe vstupu do systemoveho modu pozadaji mikrojadro a mikrojadro uz samo direguje tuto rutinu do pomocnych komponetn jako souborovy system nebo ovladace. ALE ZDE JSOU TYTO KOMPONENTY MIMO JADRO - tedy jsou to jakoby samostatne programy, ktere bezi jako procesy a mikrojadro k nim pristupuje a komunikuje s nim. Tedy je to rozbity system oproti monolitickemu celku.
Tedy vsechny komponenty jsou zvlast a pouze mikrojadro je spolecnym prunikem vsech a direguje jejich komunikaci. Tyto komponenty se nemohou videt navzajem tedy ani pristupovat k datum
Vyhody - modularnost, bezpecnost, distribuovanost, rozsiritelnost, prenositelnost
Priklad mikrojadra - Nova
pid fork()
rodic proces ma pid=100
Vytvori kopii daneho programu IDENTICKOU az na identifikator (kdy rodic ponecha svoje id, dostane id potomka a potomek dostane id=0), tedy ma skopirovanou historii - stack, promenne, registry atd a najednou ten samy program se vykonava paralelne dvakrat identicky az na rozlisitelne id.
Dvojity fork za sebou = vytvori se 4 programy: 1 program se rozdeli an dva, a pak kazdy z nich se dal rozdeli na dva atd…
Kazdy volani fork dalsi jen zvysuje puvodni id+1
f=fork() //zalozim potomka, pro rodice je f=101, pro potomka f=0
ff=fork() // potom i rodic udelaji dalsi 4 potomky
# pro rodice2 ff=102, pro potomka2 ff=0…
Tedy rodic dostava pid potomka, ale potomek to ma =0
pid wait()
Ceka na ukonceni libovolenho potomka, kam zadam jeho pid a rodic prijme jeho navratovou hodnotu
Proces
Neboli job,task - spusteny program, je identifikovatelny jednoznacnym cislem behem sve existence - process identifer
Tvori ho obsahy registru, otevrene soubory, ma svuj zasobnik, data a program.
Vlakna bezi v ramci procesu, tedy proces je vyssi level, ktery zaobaluje vlakna uvnitr
OS direguje procesy - jejich prideleni prostredku, vzajemnou komunikaci, spousteni a jejich ukonceni
- Spusteny proces je pri zapnuti systemu, pak skript rc spusti vsechny ostatni procesy, tedy kazdy proces az na prvni je potomkem rodice. Rodice a potomci se vetvi jako strom, sdileji vsechny zdroje rodice, muze nastat souber
Vytvorit mohu treba fork(). Proces konci bud syscallem exit(status), je to radne ukonceni, kdy proces preda svemu rodicu navratovou hodnotu status, jak byl treba ukoncen. V ten moment se radne uvolni jeho prostredky.
Nebo muze skoncit neradne - nemel dost pameti na alokaci, nebo se vyskyne vyjimka - deleni nulou, neprevilegovana operace…
Pokud se proces neukonci - je to zombie, neni ukonceny ale nemuze pracovat - tedy situace, kdy potomek odeslal exit(status) ALE RODIC SI TO ENPRECETL POMOCI wait(pid_potomek), tedy rodic ignoroval navrat potomka, potomek tedy neni ukoncenej ale uz uvolnil svoje prostredky
Stavovy automat procesu
- Novy - teprv zalozeny, jeste nema prirpavene nektere casti
- Prirpaveny - muze bezet, ale ceka frontu prideleni procesoru
- Bezici - prave rpacuje
- Cekajici - dokoncil praci a ceka na dalsi udalost
- Ukonceny - hotovy proces, co ale jeste uplne neuvolnil prostredky
Existuje smycka mezi 2-4, tedy bezici proces se stava pripravenym po dokonceni
Prepinani procesu - obrazek behu jednoho procesu a druheho
OS dierguje behy procesu, tedy pokud nastalo preruseni v P1 a ceka se treba na data, tak OS aby necekal, zapne P2, tedy ulozi stav P1, zmeni SP na jiny ukazatel P2 a pobezi mezitim P2, pak se treba zastavi, ulozi se jeho stav, zase se vrati SP na P1 a pobezi on, tedy stridave bezi…
Existuje vlastne fronta/nabidka ready procesu, ze kterych se vybere, ktery pobezi - je to fronta cekajicih procesu na spusteni
SP menim na stack daneho procesu, tedy ukazatel stacku zmenim na misto, kde je stack procesu, tim muze bezet ten proces
Vlakno
Vlakno je beh v ramci procesu, tedy proces je spusteny program a apriori je jednovlaknovy - tedy samotny ten beh procesu je vlakno.
Vlakno ma svuj stack a svoje registry. V ramci procesu muze byt nekolik vlaken, ktere maji jak svoje data vlastni - lok. promenne, zasobniky, registry, tak i sdilena data, ktera patri celemu procesu - globalni promenne, kod programu, otevrene soubory, prava atd…
Vlakna mohou bezet na ruznych jadrech CPU
Paralelni vlakna tedy vykonavaji v nejakem procesu treba ruzne funkce zaroven (pokud se dokonale neovlivnuji), rychleji se vytvori a ukonci
obecne vytvoreni procesu je mnohem narocnejsi operace pro OS, vlakno je jednoduche, muzeme paralelizovat nejake vypocty, algoritmy, zpracovani jednoho objektu zaroven.
Vsechna vlakna v ramci procesu sdileji stejny adresni prostor, havarie jednoho vlakna procesu ukonci i vsechna ostatni vlakna
v cecku pthread.h, create, join…
Stavy vlaken
Stejne jako procesu - bezici, pripravene, cekajici, existuje fronta, ze ktere se vybere, podle planovani, jaka vlakna pobezi
Co je program (terminologie vs proces vs vlakno)
- Program - soubor na disku, ma kod a data
- Proces - spusteny program, jadro OS provadi instrukce programu
- ma vlastni adresni prostor v RAM, ma jedno vi vice vlaken
- proces je kontejner vlakna, ale to vlakno je vlatne to, co bezi v procesu - Vlakno - soubor instrukci vykonavanych procesorem v ramci jednoho programu