This is an old revision of the document!
Table of Contents
Operační systémy a jejich architektury. Systémová volání, vlákna, procesy. Správa virtuální a fyzické paměti, souborové systémy. Bezpečnost, virtualizace.
B4B35OSY Webové stránky předmětu
- Systémová volání – jak je implementována ochrana paměti jádra, jak se předávají parametry a data ze systémových volání, rozdíl mezi mikro jádrem a monolitickým jádrem.
- Vlákna, procesy – jak se vytvoří proces, jak lze předat data mezi procesy. Jaký je rozdíl mezi vlákny a procesy, která data sdílejí různá vlákna jednoho procesu (registry, zásobník, lokální proměnné, globální proměnné, dynamicky alokované proměnné).
- Synchronizace vláken – jaké jsou problémy při paralelním přístupu ke sdíleným datům, jaké existují synchronizační prostředky, co je to deadlock, kdy může nastat a jak se lze deadlocku vyhnout.
- Správa virtuální a fyzické paměti – co je a jak vypadá stránkovací tabulka, jaké jsou zásadní nevýhody stránkování, TLB (translation-lookaside-buffer), víceúrovňové stránkování v 32-bitovém a 64-bitovém systému, odkládání stránek na disk, algoritmy výběru oběti, metoda copy-on-write.
- Souborové systémy – jaké typy souborových systémů znáte, který je vhodný pro sekvenční čtení a který pro náhodné čtení souborů. Vysvětlete základní souborové systémy: FAT, systémy založené na inodech a systémy založené na extendech. Žurnálování – základní princip, kdy mohou vzniknout v souborovém systému chyby, jaké jsou úrovně žurnálování a jeho nevýhody.
- Bezpečnost – co je Trusted Computing Base, základní metody řízení přístupu, jak se provádí útok na přetečení zásobníku, jak se lze takovému útoku bránit.
- Virtualizace – softwarová virtualizace, metoda trap-and-emulate, virtualizace systémového volání, virtualizace stránkovacích tabulek, hardwarově asistovaná virtualizace.
Systémová volání
jak je implementována ochrana paměti jádra, jak se předávají parametry a data ze systémových volání, rozdíl mezi mikro jádrem a monolitickým jádrem.
Systémová volání jsou rozhraní mezi uživatelským a jádrovým režimem. Umožňují uživatelským aplikacím komunikovat s jádrem operačního systému a využívat jeho služby. Systémová volání se obvykle implementují pomocí přerušení nebo speciálních instrukcí (SYSCALL či SYSENTER), které přepínají procesor do jádrového režimu.
Jak se volají systémová volání
Jádro implementuje tzv ABI (Application Binary Interface), což je rozhraní, které definuje, jakým způsobem se volají systémová volání a jak se předávají parametry. Systémová volání mají čísla, která se uloží do registru (např. EAX v x86 architektuře) a parametry se předávají pomocí dalších registrů nebo na zásobník. Po provedení systémového volání jádro vrátí výsledek do registru a přepne procesor zpět do uživatelského režimu. Pokud potřebujeme předat velké množství dat, jako jsou struktury nebo pole, obvykle se používá ukazatel na paměť, který se předává jako parametr. Jádro pak může přistupovat k těmto datům přímo.
Ochrana paměti jádra
Hlavním způsobem ochrany paměti jádra je použití virtuální paměti. Každý proces má svou vlastní virtuální adresní prostor, což znamená, že každý proces vidí svou vlastní paměť a nemůže přistupovat k paměti jiných procesů nebo jádra. To se provádí pomocí stránkování, které mapuje virtuální adresy na fyzické adresy v paměti.
V moderních architekturách procesory implementují tzv. privilegované režimy (rings of privilege). Jádro OS běží v nejvyšším privilegovaném režimu (např. ring 0 v x86), s plným přístupem k hardwaru a paměti. Uživatelské aplikace běží v méně privilegovaném režimu (např. ring 3 v x86) s omezeným přístupem. Přechod z uživatelského do jádrového režimu je řízen (např. přes systémová volání). (Pozn.: Intel v r. 2024 oznámil útlum podpory pro ring 1 a 2 v x86, jelikož je moderní OS nevyužívají).
Mikro jádro vs. monolitické jádro
Mikro jádro a monolitické jádro jsou dva základní přístupy k návrhu operačního systému:
- Mikro jádro:
- Princip: Minimalizuje kód běžící v jádrovém režimu. Většina OS služeb (např. ovladače zařízení, souborové systémy) běží jako oddělené procesy v uživatelském prostoru.
- Výhody:
- Vyšší modularita a flexibilita.
- Lepší bezpečnost a stabilita (izolace chyb – pád jedné služby neohrozí celé jádro).
- Snazší vývoj, testování a přenositelnost jednotlivých komponent.
- Menší velikost samotného jádra.
- Nevýhody:
- Potenciálně nižší výkon kvůli režii meziprocesové komunikace (IPC) mezi službami a jádrem.
- Složitější návrh mechanismů komunikace mezi procesy.
- Monolitické jádro:
- Princip: Většina OS služeb (včetně ovladačů, správy paměti, plánovače procesů) běží v jednom velkém programu v jádrovém režimu.
- Výhody:
- Vyšší výkon, protože komunikace mezi komponentami probíhá pomocí přímých volání funkcí bez režie IPC.
- Jednodušší návrh (alespoň zpočátku, pro základní funkce).
- Nevýhody:
- Nižší modularita.
- Větší komplexita kódu s rostoucí velikostí, což ztěžuje údržbu a ladění.
- Chyba v jedné části může vést k pádu celého systému.
- Obtížnější přenositelnost.
- Větší bezpečnostní riziko, pokud je kompromitována část jádra.
- Hybridní jádro:
- Kombinuje prvky mikro jádra a monolitického jádra.
- Některé části jádra jsou implementovány jako samostatné procesy (jako v mikro jádře), zatímco jiné části běží přímo v jádrovém režimu (jako v monolitickém jádře).
Vlákna a procesy
jak se vytvoří proces, jak lze předat data mezi procesy. Jaký je rozdíl mezi vlákny a procesy, která data sdílejí různá vlákna jednoho procesu (registry, zásobník, lokální proměnné, globální proměnné, dynamicky alokované proměnné)
Vlákna
- Vlákno je lehká plánovací jednotka – sekvence instrukcí běžících na CPU.
- Vlákna jednoho procesu sdílejí jeho adresní prostor, heap, globální a statické proměnné, otevřené soubory a další kernel-objekty.
- Každé vlákno má vlastní:
- kontext CPU (registry včetně PC, SP, …),
- zásobník pro lokální proměnné a návratové adresy,
- thread-local storage (TLS),
- TCB (Thread Control Block) – kam se při přepnutí ukládá kontext vlákna.
- Tradiční „monolitický“ proces = proces s jediným vláknem.
- Stavy vlákna: Running (běží), Ready (připravené), Blocked/Waiting (čeká), Terminated (ukončené).
- Přepnutí (context switch) uloží registr + stack pointer do TCB a načte kontext jiného vlákna.
- OS plánuje vlákna podobně jako procesy; implementace může být kernel-level, user-level nebo hybridní (např. NPTL v Linuxu).
- PCB vs. TCB
- PCB (Process Control Block) – jádrová struktura procesu:
- PID, stav procesu, ukazatel na tabulky stránek (adresní prostor), otevřené soubory, bezpečnostní údaje (UID, GID, capabilities), signálová maska, limity zdrojů, statistiky CPU času atd.
- TCB (Thread Control Block) – lehčí záznam vlákna:
- uložené registry (PC, SP …), ukazatel na vlastní zásobník, TLS pointer, stav vlákna, priorita, CPU afinity, statistiky.
- Vztah: PCB udržuje seznam všech TCB patřících procesu.
- Přepnutí mezi vlákny téhož procesu mění jen TCB (rychlejší); přepnutí na vlákno jiného procesu ukládá navíc PCB (pomalejší).
Sdílená vs. privátní data ve vícevazebném procesu
Kategorie | Sdílí všechna vlákna | Jedinečné pro vlákno |
Kód (text) & globální data | ✔ | ✖ |
Heap (dynamicky alokovaná paměť) | ✔ | ✖ |
Otevřené popisovače souborů | ✔ | ✖ |
Programový čítač & registry | ✖ | ✔ |
Zásobník (stack) | ✖ | ✔ |
Thread-local storage (TLS) | ✖ | ✔ |
Přednosti:
- Vlákno se vytvoří i ukončí rychleji než proces
- Přepínání mezi vlákny je rychlejší než mezi procesy
- Dosáhne se lepší strukturalizace programu
Realizace: - knihovna PThread, Java - třída Thread
Procesy
Program:
- je soubor (např. na disku) přesně definovaného formátu obsahující instrukce, data, údaje potřebné k zavedení do paměti a inicializaci procesu
Proces:
- je spuštěný program – objekt jádra operačního systému provádějící výpočet podle programu
- je charakterizovaný svým paměťovým prostorem a kontextem (prostor v RAM se přiděluje procesům – nikoli programům!)
- může vlastnit (kontext obsahuje položky pro) otevřené soubory, I/O zařízení a komunikační kanály, které vedou k jiným procesům, ...
- obsahuje jedno či více vláken
Proces je identifikovatelný jednoznačným číslem v každém okamžiku své existence - PID (Process IDentifier)
Co tvoří proces:
- Obsahy registrů procesoru (čítač instrukcí, ukazatel zásobníku, příznaky FLAGS, uživatelské registry, FPU registry)
- Otevřené soubory
- Použitá paměť: Zásobník – .stack, Data – .data, Program – .text
Rodič vytváří nový proces (potomka) voláním služby fork - vznikne identická kopie rodičovského procesu až na:
- návratovou hodnotu systémového volání
- hodnotu PID, PPID – číslo rodičovského procesu
návratová hodnota určuje, kdo je potomek a kdo rodič (0 – jsem potomek, PID – jsem rodič a získávám PID potomka) potomek může použít volání služby exec pro náhradu programu ve svém adresním prostoru jiným programem
Stavy