Operační systém UNIX (zejména Linux) Jan Cvejn Technická univerzita v Liberci, Fakulta mechatroniky Použitá literatura: Linux – Dokumentační projekt 1998 Computer Press Luděk Skočovský – Principy a problémy OS UNIX Science, 1993
Ken Thomson, Dennis Ritchie, společnost Bell – počátek sedmdesátých let • návrh OS UNIX o co nejmenší, aby se vešel na počítače PDP • Ritchie – vytvořil jazyk C o jako jazyk speciálně určený pro tvorbu oper. systémů • UNIX přepsán do C (aby byl portabilní) Linux – licenční podmínky GPL (GNU General Public Licence) • GNU – Free Software Foundation o za distribuci programů GNU si lze účtovat cokoliv, ale nelze nařizovat za kolik je má distribuovat dál o s distribucí je nutno dát i zdrojové texty Standardy UNIX: • BSD • Unix V • POSIX – sada standardizačních dokumentů úřadu pro standardizaci IEEE LINUX podporuje zejména BSD, něco z UNIX V a většinu POSIX
Rysy Linuxu Správa paměti Linux pracuje s virtuální pamětí založenou na stránkování ! stránkování na žádost • používá i pro nahrávání obrazů spustitelných souborů o =mapování souboru do paměti sdílená paměť – mechanismus IPC Unixu V vyrovnávací paměti – pro urychlení • buffery pro bloková zařízení • vyrovnávací paměť stránek – při načtení stránek z disku zůstávají v této paměti o výpadky stránek jdou nejprve přes tuto paměť, načítá se ze souboru jen když tam není • odkládací paměť – odkládají se pouze modifikované stránky • hardwarové vyrovnávací paměti o TLB – v procesoru • předpokládají se 3 úrovně tabulky stránek o každá platforma musí zajistit překladová makra pro průchod tabulky stránek (jádro nemusí znát formát položek tabulky stránek ani jejich uspořádání) Alokace stránek • tzv. Buddyho algoritmus: o seznam free_area obsahuje bloky stránek velikosti násobku 2 (vlastní pole seznamů pro různé počty stránek v bloku) o stránky se alokují v blocích velikosti násobku 2 o hledá se blok o velikosti stejně velké jako požadovaný, pokud není, vezme se první větší o větší blok se rozdělí a zbytek se vrátí do free_area (- lze opět rozložit na součet mocnin 2) • dealokace • rekombinuje bloky do větších Virtuální paměť procesu • realizována jako posloupnost bloků vm_area_struct (celek =mm_struct), kde každý obsahuje začátek a konec dané oblasti • při výpadku stránky – nutno vyhledat odpovídající záznam vm_area_struct o vyhledání musí být velmi rychlé – proto záznamy vm_area_struct ve vyváženém (AVL) stromu Taktika nahrazení =LRU (least recently used) ! odkládání stránek – démon (systémový proces) kswapd ! zajišťuje, aby v systému byl dostatek volných stránek
!
když je málo stránek, démon postupně: • redukuje vyrovnávací paměť stránek – nejjednodušší • odkládá sdílené stránky • odkládá a ruší normální stránky o přednostně stránky, které lze zrušit (nemodifikované) o démon měří věk stránek (při přístupu se číslo zvyšuje o 3, při spuštění démona se všechny dekrementují) – odstraňují se ty s nejnižší hodnotou
Procesy •
základní stavy procesu: • running • waiting (čeká) • stopped – zastaven (obvykle vydáním signálu) • zombie - mrtvý
Každý proces – identifikátory uživatele a skupiny • uid, gid – jehož jménem proces běží 2 skupiny procesů: • reálného času – pokud nějaký takový je připraven, je vždy spuštěn o mají rt_priority – priorita proc. reál. času • normální o priorita =zároveň množství času, které může proces běžet o každý proces – má čítač, který se při přepnutí nastavuje na hodnotu priority, a pak se dekrementje s hodinami Plánovač – spouští se : o po převedení aktuálního procesu do fronty čekajících procesů (čekání na nějakou událost) o když čítač procesu došel do 0 o z jiných míst v jádře Výběr procesu – dle hodnoty čítače (u real-time counter+1000) ! tj. jestliže už nějaký proces vypotřeboval nějakou část svého kvanta, je v nevýhodě před ostatními procesy se stejnou prioritou ! aktuální proces zařazen na konec fronty ! bere se vždy první z fronty Vytvoření procesu ! Nové procesy vznikají klonováním starých ( fork() nebo clone()) • obsah struktury task_struct se zkopíruje do nové, může si ponechat i identifikátor rodič. procesu • sdílí se prostředky (soubory, obsluha signálů a virtuál. paměti) o kopírování paměti až při zápisu
Po spuštění – existuje jediný proces – init • id procesu init=1 • spustí inicializační program (/etc/init, /bin/init nebo /sbin/init ) • skriptový soubor pro vytváření bnových procesů - /etc/inittab • všechny procesy jsou přímo nebo nepřímo potomky init Meziprocesní komunikace Signály • pro signalizaci asynchronních událostí • proces rozhoduje, které bude přijímat a které ignoruje (až na SIGSTOP a SIGKILL, které vždy) • u přijímaných signálů lze definovat způsob obsluhy, nebo nechat na jádru • počet možných signálů – dán velikostí slova (32 - Intel n. 64 bitů – Alpha, AXP) ! !
všem procesům může posílat signály jen jádro a superuživatel jinak proces může poslat signál jen procesům se stejným uid a gid (uživatel. id, skupin. id) nebo procesům ve stejné skupině procesů
!
signály - neposílají se okamžitě, ale čekají do příštího přidělení procesoru nebo volání jádra
IPC mechanismy UNIX V • přístupová oprávnění k synchronizačním objektům podobně jako u souborů !
3 typy: o Fronty zpráv o umožnují posílat zprávy, které jeden nebo více procesů může číst o při čtení se kontrolují oprávnění a čtenář si může vzít první na řadě nebo si vybrat dle typu ! jestliže žádná nevyhovuje kritériiím, proces se uspí a vzbudí se při zápisu nové správy o Semafory o operace testování a nastavení – vrací součet aktuální hodnoty semaforu a nastavované hodnoty (kladná nebo záporná) o podle výsledku operace může být proces uspán, dokud hodnota semaforu není změněna jiným procesem o typicky: ! před kritickou sekcí inicializace semaforu (např. na 3) ! za začátkem krit. sekce – operace test s parametrem –1 ! na konci test s parametrem +1 o Jestliže by byl proces ukončen nebo zhavaroval, dokud je v kritické sekci, problém ! vzniklo by zablokování
!
proto se udžuje seznam změn semaforu daným procesem, aby se jeho stav dal obnovit
o Sdílená paměť o přístup řízen pomocí klíčů a přístup. práv (stejně jako pro všechny IPC objekty) o pro synchronizaci nutno použít např. semafory o bloky sdílené paměti mají počítadlo přístupů – uvolní se, pokud klesne na 0 o lze uzamknout v paměti, aby nešlo vystránkovat Časovače • reálné – v reálném čase, když doběhnou, proces dostane signál SIGALARM • virtuální – v času existence procesu – signál SIGVTALARM • profilové – když běží proces nebo systém dělá něco ve jménu procesu Spouštění programů • pomocí tzv. příkazových interpreterů (=shell) o např. sh, bash, tcsh o mají sadu vestavěných příkazů + provádí vykonání externích programů o hledá se v cestě dané prom. PATH o spuštění – příkaz. interpret vytvoří svůj klon (fork()) a binární obraz zamění s spouštěným programem o zastavení – Ctrl+Z – pošle signál SIGSTOP, opět aktivuje shell o příkaz bg – pošle SIGCONT, který opět obnoví běh procesu Formát spustitelných souborů : o a.out o ELF • pružný formát jak pro exe, tak i dynamické knihovny Skriptové soubory • spustitelné soubory, které potřebují interpret (např. perl, wish, tcsh) • standardní konvence: o první řádek obsahuje jméno interpretru ( např. #!/usr/bin/wish) – spustí se tak, že skript je jako parametr 0 Roury • =propojení dvou procesů na uživatelské úrovni o např. $ ls | pr | lpr (pr – dělí na stránky, lpr -tiskne) o propojují std. výstup procesu se std. vstupem jiného o dočasné roury zajišťuje příkazový interpter • 2 datové struktury file, které ukazují na stejný dočasný inode, který ukazuje na sdílenou stránku ve fyzické paměti
•
nutno synchronizovat přístup - pro zajištění koordinace se používají signály+ zamykání o LINUX – umožňuje rovněž tzv. pojmenouvané roury • existují v souborovém systému, vytváří se příkazem mkfifo • na principu FIFO • na rozdíl od dočasných existují trvale Jádro Mechanismy jádra • tzv. bottom-half obsluha o jako DPC u WinNT o fronty odložených úloh • časovače • čekací fronty – čekání na systém. prostředek • zámky – pro kritické sekce v jádře – jen jeden proces, ostatní čekají v cyklu • semafory – urč. počet procesů, ostatní ve stavu Wait (na rozdíl od zámku) Ovladače zařízení • chápou se jako součást jádra • mohou být nahrány a odstraněny dynamicky • některé ovladače lze vestavět do kódu jádra •
zařízení o znaková – bez bufferů (např. sériové porty) o bloková – čtení pouze po celých blocích (disky), náhodný přístup o síťová – přístup přes rozhraní BSD
•
každé zařízení – reprezentováno jako soubor (např. /dev/hda = první disk) o tj. stejné operace jako normální soubory (otevření, zápis, atd.) o vytvářejí se příkazem mknod • síťová zařízení vytváří Linux sám
o každé zařízení má o hlavní číslo – zařízení se steným hlavním číslem řídí jeden ovladač o vedlejší číslo – odlišení různých zařízení řízených jedním ovladačem (např. partitiony disku) •
signalizace dokončení operace o buď generování přerušení o nebo dotazování (pooling) ! jádro používá časovač
Souborový systém LINUX podporuje mnoho souborových systémů • nejčastěji ext2 Souborový systém – vždy v jediné hierarchické stromové struktuře • po připojení soubor. systému – přidá se podstrom na určené místo (=připojovací adresář) Každý soubor – reprezentován jedním inode: • mód – co inode popisuje (soubor, FIFO ,…) a přístupová práva • informace o vlastníkovi • velikost • časové značky • datové bloky – ukazatel na data o prvních 12 přímo ukazuje na bloky dat o 13. – ukazatel na blok ukazatelů na data (2. úroveň) o 14. ukaz.- na blok ukaz. na blok ukaz. na data (3.úroveň) o 15. – 4. úroveň o smysl – na kratší soubory se lze dostat rychleji než na delší Buffery (vyrovnávací paměti) – pro urychlený přístup k datům • jestliže počet modifikovaných bufferů v systému přesáhne určitou hodnotu, volá se démon bdflush, který uloží na disk – lze nastavit příkazem update Každý proces – vlastní seznam otevřených souborů • deskriptor souboru – odkazuje na strukturu file o popisuje otevřený soubor: - režim přístupu - pozici v souboru - ukazatel na inode souboru (každý soubor má svůj inode) - ukazatel na vektor adres rutin pro práci se souborem • je jiný pro každý typ systému souborů, roury apod. Souborový systém /proc • virtuální s.s, obsahuje místo souborů informace o aktuálních dat. strukturách jádra Struktura adresářů: • dělí se na svazky (větš. odpovídají diskům – souborovým systémům) o root – kořenový adresář - většinou malý, obsahuje kritické soubory - /bin – soubory pro zavedení systému - /etc – konfigurační soubory pro počítač - /root – domovský adresář superuživatele - /lib - /dev – speciální soubory –zařízení - /tmp - /boot – soubory pro zavaděč (LILO)
o /usr o /var -
většinou velký- sem jsou nainstalované všechny programy /usr/x11r6 - XWindows /usr/bin – téměř všechny spustitelné příkazy /usr/man , /usr/info, /usr/doc – dokumentace /usr/include /usr/lib pro soubory, které se mění např. • /var/log – log soubory různch programů • /var/spool – pro tiskové fronty • /var/tmp
o /proc – aktuál. informace o jádře –viz výše Soubory: • atributy zobrazí ls –l soubor o např. –rw-r----- první znak : • - obyč. soubor • d adresář • l nepřímý odkaz • c znakový speciální soubor • b blokový speciální soubor -
•
dále tři skupiny znaků znaků (pro vlastníka souboru; skupinu, do které vlastník patří; ostatní uživatele), kde: • r .. čtení povoleno • w ..zápis povolen • x .. lze spustit • - přistup zakázán
jména soubory začínající znakem . =speciální, nejsou normálně zobrazovány o zobrazí ls –a –l soubor
Adresáře: – chápou se jako speciální soubory, které obsahují odkazy k jednotlivým souborům • aktuální adresář - změna cd, zobrazí pwd o znak . • domovský adresář – implicitně nastaven jako aktuální pro každého uživatele o znak ~ • nadřazený adresář o o úroveň výš v stromu o znak .. • kořenový adresář
o znak / Cesta k souborům • absolutní – začíná znakem / • relativní – relativně k aktuálnímu adresáři