Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
statnice:bakalar:b4b35osy [2025/05/26 13:59] – [Ochrana paměti jádra] prokopstatnice:bakalar:b4b35osy [2025/06/09 20:32] (current) – [5. Souborové systémy] zapleka3
Line 11: Line 11:
   * **Virtualizace** – softwarová virtualizace, metoda trap-and-emulate, virtualizace systémového volání, virtualizace stránkovacích tabulek, hardwarově asistovaná virtualizace.   * **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í =====+===== 1. 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. ** ** 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. 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í ==== ==== 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.  +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  +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.   
-režimu.  +Pokud potřebujeme předat větší množství dat, jako jsou struktury nebo pole, používá se ukazatel na paměť, který se předává jako parametr. Jádro pak může přistupovat k těmto datům přímo
-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.+ 
 +==== Předávání parametrů a návratových hodnot ==== 
 +Parametry systémového volání se předávají různými způsoby podle architektury a konkrétního API: 
 + 
 +  * **Jednoduché hodnoty** (čísla, příznaky, velikosti atd.) se ukládají do registrů – např. v Linuxu na x86-64 se používají registry **rdi, rsi, rdx, r10, r8, r9**. 
 +  * **Složitější struktury nebo pole** se předávají pomocí **ukazatelů**, které jádro validuje a dereferencuje. 
 +  * **Výsledky systémových volání** se obvykle vrací do jednoho registru (např. **rax**) – typicky návratový kód nebo počet zpracovaných bajtů. V případě chyby se vrací záporný návratový kód (např. `-EINVAL`, `-EPERM`, ...). 
 + 
 +**Předávání přes paměť** je bezpečnější, protože jádro ověří přístupová práva (např. zda proces může číst/zapisovat do dané oblasti).
  
 ==== Ochrana paměti jádra ==== ==== 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á svůj 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. +Hlavním způsobem ochrany paměti jádra je použití **virtuální paměti**. Každý proces má svůj 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 moderních architekturách procesory implementují tzv. **privilegované režimy** (*rings of privilege*). Jádro OS běží nejvyšším privilegovaném režimu (**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 (**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í.
  
-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 ístupem hardwaru a paměti. Uživatelské aplikace běží v méně privilegovaném režimu (např. ring 3 v x86) s omezeným í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í).+  * **Důsledek:** Uživatelský kód nemůže přímo istupovat jádrové paměti – ípadný pokus vede k výjimce (segfault).
  
 +**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 vs. monolitické jádro ====
Line 56: Line 69:
     * 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).     * 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 =====+===== 2. 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é)** **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é)**
  
Line 69: Line 82:
   * Tradiční „monolitický“ proces = proces s jediným vláknem.   * Tradiční „monolitický“ proces = proces s jediným vláknem.
   * **Stavy vlákna:** Running (běží), Ready (připravené), Blocked/Waiting (čeká), Terminated (ukončené).   * **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.+  * Přepnutí (context switch) uloží registry + 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).   * OS plánuje vlákna podobně jako procesy; implementace může být kernel-level, user-level nebo hybridní (např. NPTL v Linuxu).
  
Line 84: Line 97:
  
 | Kategorie                         | Sdílí všechna vlákna | Jedinečné pro vlákno | | Kategorie                         | Sdílí všechna vlákna | Jedinečné pro vlákno |
-| Kód (text) & globální data        | ✔                    | ✖ | +|----------------------------------|-----------------------|-----------------------| 
-| Heap (dynamicky alokovaná paměť)  | ✔                    | ✖ | +| Kód (text) & globální data       | ✔                     | ✖ | 
-| Otevřené popisovače souborů       | ✔                    | ✖ | +| Heap (dynamicky alokovaná paměť) | ✔                     | ✖ | 
-| Programový čítač & registry       | ✖                    | ✔ | +| Otevřené popisovače souborů      | ✔                     | ✖ | 
-| Zásobník (stack)                  | ✖                    | ✔ | +| Programový čítač & registry      | ✖                     | ✔ | 
-| Thread-local storage (TLS)        | ✖                    | ✔ |+| 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.
  
-<markdown> +**Realizace:** 
-**Přednosti** +  knihovna **PThread** 
-- Vlákno se vytvoří i ukončí rychleji než proces  +  * v jazyce Java pomocí třídy **Thread**
-- 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 
- 
-</markdown> 
 ==== Procesy ==== ==== Procesy ====
-<markdown> +  * **Program** – soubor (např. na disku) definovaného formátu obsahující instrukce, data údaje potřebné k inicializaci procesu. 
-**Program**+  * **Proces** – spuštěný program, spravovaný operačním systémem: 
--  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 +    * má vlastní virtuální adresní prostor, otevřené soubory, systémové prostředky, ..., 
 +    * může obsahovat více vláken (multithreadovaný proces), 
 +    * je identifikovatelný **PID** (Process IDentifier), 
 +    * paměť procesu: `.text` (kód), `.data` (globální), `.stack`, heap.
  
-**Proces**:  +  * Proces je objekt s vlastním kontextem: 
-je spuštěný program – objekt jádra operačního systému provádějící výpočet podle programu +    registry procesoru (čítač instrukcí, ukazatel zásobníku, příznaky FLAGS, uživatelské registry, FPU registry) 
-- je charakterizovaný svým paměťovým prostorem a kontextem (prostor v RAM se přiděluje procesům – nikoli programům!)  +    * přidělený paměťový prostor 
-- 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, ...  +    * seznam otevřených souborů 
-- obsahuje jedno či více vláken  +    * komunikační kanály (pipes, sockets...) 
-  +    * použitá paměť: Zásobník – .stack, Data – .data, Program – .text
-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:  +==== Vytváření procesů a předávání dat ==== 
-- návratovou hodnotu systémového volání  +  * Proces vytváří nový proces voláním systémového volání **fork()**
-- hodnotu PID, PPID – číslo rodičovského procesu  +    * vznikne téměř identická kopie rodičovského procesu. 
- +    * rozdíly: návratová hodnota (0 pro dítě, PID pro rodiče), nový PID. 
-návratová hodnota určuje, kdo je potomek a kdo rodič (0 – jsem potomek, PID – jsem rodič a získávám PID potomka+  * Dítě může použít **exec()** k přepsání svého kódu jiným programem. 
-potomek může použít volání služby **exec** pro náhradu programu ve svém adresním prostoru jiným programem +  * Předání dat mezi procesy: 
-</markdown> +    pomocí **sdílené paměti** (např. `shm_open`, `mmap`) 
-**Stavy**+    * **potrubí (pipes)** – unidirekcionální datový tok 
 +    * **sockets** – obousměrná komunikace, i mezi různými stroji 
 +    * **signály** – pro jednoduchou asynchronní notifikaci 
 +    * **souborový systém** – zápis do souboru čitelný jiným procesem
  
 +==== Stavy procesů ====
 {{:statnice:bakalar:pasted:20250524-114645.png}} {{:statnice:bakalar:pasted:20250524-114645.png}}
  
-Přepnutí od jednoho procesu k jinému nastává výhradně v důsledku nějakého přerušení (či výjimky) Procesy mohou čekat v různých frontách na vykonání (na přidělení procesoru, na dokončení I/O, na přidělení místa v hlavní paměti, na synchronizační událost, na zvětšení adresního prostoru)+  * Přepnutí mezi procesy nastává po přerušení, výjimce nebo explicitním uvolnění CPU. 
-**Meziprocesní komunikace**+  * Proces může čekat v různých frontáchna CPU, na I/O, na synchronizaci, na alokaci paměti atd
 + 
 +==== Meziprocesní komunikace ====
 {{:statnice:s_cbd745353e168c5cf1a67e4fa2573e59a956a598a03b4e79ea21df1273428276_1559044521854_image.png}} {{:statnice:s_cbd745353e168c5cf1a67e4fa2573e59a956a598a03b4e79ea21df1273428276_1559044521854_image.png}}
  
 +  * IPC je klíčová pro spolupráci procesů.
 +  * Výběr prostředku závisí na požadavcích (rychlost, bezpečnost, rozsah).
  
-===== Synchronizace vláken =====+ 
 +===== 3. 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.** **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.**
  
Line 144: Line 163:
   * Data race – situace, kdy výsledek operace závisí na pořadí provedení vláken, což může vést k nečekaným výsledkům.   * Data race – situace, kdy výsledek operace závisí na pořadí provedení vláken, což může vést k nečekaným výsledkům.
   * False sharing – situace, kdy více vláken přistupuje k různým částem stejného cache řádku, což může vést k neefektivnímu využití cache a snížení výkonu. (není kritické, ale může hodně zpomalit)   * False sharing – situace, kdy více vláken přistupuje k různým částem stejného cache řádku, což může vést k neefektivnímu využití cache a snížení výkonu. (není kritické, ale může hodně zpomalit)
 +
 +==== Problémy při paralelním přístupu ====
 +  * **Deadlock** – situace, kdy dva nebo více procesů čeká na uvolnění zdrojů, které jsou drženy jinými, a žádný nemůže pokračovat.
 +  * **Data race** – výsledek výpočtu závisí na pořadí přístupu k proměnným → nekonzistentní chování.
 +  * **False sharing** – více vláken přistupuje k různým částem stejného cache-řádku → výkonnostní problém (neporušuje správnost, ale zpomaluje).
  
 ==== Deadlock ==== ==== Deadlock ====
-<markdown> +Deadlock (uváznutí) nastává, když skupina vláken čeká na zdroje způsobem, který vytvoří cyklus a nikdo nemůže pokračovat.
-**Deadlock** (uváznutí) nastává, když skupina procesů (nebo vlákenčeká na zdroje takovým způsobem, že žádný ze zúčastněných nemůže pokračovat.   +
-Formálně se musí současně vyskytnout **čtyři Coffmanovy podmínky**:+
  
-1. **Vzájemné vyloučení (Mutual Exclusion)** – alespoň jeden zdroj lze v každém okamžiku držet jen jedním procesem.   +**Coffmanovy podmínky pro vznik deadlocku:** 
-2. **Hold-and-Wait** – proces drží už přidělený zdroj a současně čeká na další.   +  - **Vzájemné vyloučení** – zdroj ždržet jen jedno vlákno. 
-3. **Neodnímatelnost (No Preemption)** – zdroje nelze aktivně odebrat; uvolní je jen proces, který je drží  +  **Hold and wait** – vlákno drží jeden zdroj a čeká na další. 
-4. **Cyklické čekání (Circular Wait)** – existuje kruhové pořadí proces → zdroj → proces …, kde každý drží zdroj, na který ten další čeká.+  **Neodnímatelnost** – zdroje nelze násilně odebrat. 
 +  **Cyklické čekání** – vznikne kruh, kde každé vlákno čeká na zdroj jiného.
  
 Pokud všechny čtyři podmínky platí zároveň, vznikne deadlock. Pokud všechny čtyři podmínky platí zároveň, vznikne deadlock.
  
- +**Jak se deadlocku vyhnout:** 
- +  * **Prevence** – např. nepovolíme Hold-and-Wait nebo nastavíme globální pořadí zámků. 
-### Jak se deadlocku vyhnout +  * **Vyhýbání (Avoidance)** – algoritmus bankéřesystém ověřuje, zda přidělením zdroje nevznikne nebezpečný stav
-* **Prevence:** zrušit některou z Coffmanových podmínek – např. zakázat Hold-and-Wait (nejdřív si musím vyžádat vše) nebo definovat **globální pořadí zámků**.   +  * **Detekce + obnova** – detekce cyklů v grafu čekání; obnova ukončením nebo restartem procesu.
-* **Vyhýbání (Avoidance):** algoritmus Bankéře – systém dynamicky ověřuje, zda existuje **bezpečný stav** před přidělením zdroje.   +
-* **Detekce + Obnova:** periodicky procházet graf přidělení/čekání, najít cyklus a některý proces ukončit nebo odblokovat. +
- +
-</markdown>+
  
 <tikzjax> <tikzjax>
 +
 +\usepackage{amsmath}      % for \text inside $
 \usepackage{tikz} \usepackage{tikz}
-\usetikzlibrary{arrows.meta, positioning}+\usetikzlibrary{positioning,arrows.meta}      % <— the missing bits! 
  
 \begin{document} \begin{document}
-\begin{tikzpicture}[>=stealth, node distance=35mm, every node/.style={font=\small}] + 
-  % Procesy+\begin{tikzpicture}[>=Stealth          % arrow head 
 +                    node distance=35mm,  % default distance for “of=” syntax 
 +                    every node/.style={font=\small}] 
   \node[draw, rectangle, rounded corners, fill=blue!15] (A) {Proces A};   \node[draw, rectangle, rounded corners, fill=blue!15] (A) {Proces A};
   \node[draw, rectangle, rounded corners, fill=blue!15, right of=A] (B) {Proces B};   \node[draw, rectangle, rounded corners, fill=blue!15, right of=A] (B) {Proces B};
  
-  % Zdroje 
-  \node[draw, circle, fill=orange!20, below left of=A, yshift=-2mm] (R1) {$\,\text{Zámek }1\,$}; 
-  \node[draw, circle, fill=orange!20, below right of=B, yshift=-2mm] (R2) {$\,\text{Zámek }2\,$}; 
  
-  % Hrany „žádá“+  \node[draw, circle, fill=orange!20, below left of=A, yshift=-2mm] (R1) {$\text{Zámek }1$}; 
 +  \node[draw, circle, fill=orange!20, below right of=B, yshift=-2mm] (R2) {$\text{Zámek }2$}; 
 + 
   \draw[->, thick] (A) -- node[left, xshift=-2pt] {žádá} (R2);   \draw[->, thick] (A) -- node[left, xshift=-2pt] {žádá} (R2);
   \draw[->, thick] (B) -- node[right, xshift=2pt] {žádá} (R1);   \draw[->, thick] (B) -- node[right, xshift=2pt] {žádá} (R1);
  
-  % Hrany „drží“+
   \draw[->, thick] (R1) -- node[left] {drží} (A);   \draw[->, thick] (R1) -- node[left] {drží} (A);
   \draw[->, thick] (R2) -- node[right] {drží} (B);   \draw[->, thick] (R2) -- node[right] {drží} (B);
Line 190: Line 215:
 \end{document} \end{document}
 </tikzjax> </tikzjax>
 +
 ==== Synchronizační prostředky ==== ==== Synchronizační prostředky ====
-<markdown> 
-* **Mutex (mutual exclusion)** – zámek, který umožňuje pouze jednomu vláknu přístup do kritické sekce. Pokud jedno vlákno zámek získá, ostatní musí čekat, dokud ho neuvolní. 
  
-* **Semafor** – základní vlastností je celočíselná proměnná. Dvě základní operace:   +  * **Mutex (mutual exclusion)** – zámekkterý umožňuje pouze jednomu vláknu přístup do kritické sekce. Pokud jedno vlákno zámek získáostatní musí čekatdokud ho neuvolní.
-  * **wait** – čeká, pokud je hodnota ≤ 0poté snižuje hodnotu semaforu (pro vstup do kritické sekce)  +
-  * **signal** – zvyšuje hodnotu semaforu a probouzí čekající vlákno, pokud existuje.   +
-  * Na rozdíl od mutexu může semafor zařídit, že se vlákno *vždy* časem dostane do kritické sekce; u mutexu platí „kdo dřív přijdeten dřív bere“, což může vést ke kompletnímu zablokování některých vláken.+
  
-* **Podmínkové proměnné (condition variables)** – synchronizační objekt určený k „čekání na stav“. +  * **Semafor** – celočíselná proměnná s operacemi: 
-  * **Princip:** vlákno držící *mutex* otestuje predikát (např. „fronta není prázdná“)  +    * **wait** – pokud je hodnota ≤ 0, vlákno čeká; jinak se hodnota sníží
-    Pokud predikát není splněn, **uloží se do čekací fronty cond-proměnné a *atomickyuvolní mutex** → ostatní vlákna mohou predikát změnit  +    * **signal** – zvýší hodnotu a probudí čekající vlákno, pokud existuje
-    Jakmile jiné vlákno predikát splní, **probudí čekající** pomocí `signal` (jedno) nebo `broadcast` (všechna). +    * Na rozdíl od mutexu může semafor zaručit, že se vlákno *vždy* časem dostane do kritické sekce; u mutexu může dojít ke *hladovění*.
-  * **Hlavní operace** (`pthread` API):+
  
-    | Operace | Efekt | +  * **Podmínkové proměnné (condition variables)** – slouží k čekání na konkrétní stav: 
-    |---------|-------| +    * Vlákno držící mutex otestuje predikát (např. "fronta není prázdná"). 
-    `pthread_cond_wait(&cond, &mutex)` | *Atomicky* odemkne `mutex`, uspí vlákno, po probuzení `mutexznovu zamkne (posun do fronty plánovače)| +    * Pokud predikát neplatí, vlákno se přesune do čekací fronty a *atomicky* uvolní mutex. 
-    `pthread_cond_signal(&cond)` | Probudí **jedno** čekající vlákno (pokud nějaké)| +    * Po splnění predikátu může jiné vlákno zavolat `signal` (probudí jedno) nebo `broadcast` (všechna). 
-    `pthread_cond_broadcast(&cond)` | Probudí **všechna** čekající vlákna. |+ 
 +    * **Hlavní operace (`pthread` API):** 
 +      * `pthread_cond_wait(&cond, &mutex)` – atomicky odemkne mutex, uspí vlákno, po probuzení mutex znovu zamkne. 
 +      `pthread_cond_signal(&cond)` – probudí jedno čekající vlákno. 
 +      `pthread_cond_broadcast(&cond)` – probudí všechna čekající vlákna.
  
   * **Spurious wake-ups:** vlákno se může probudit i bez `signal` → **vždy testuj predikát v `while` smyčce**, ne v `if`.   * **Spurious wake-ups:** vlákno se může probudit i bez `signal` → **vždy testuj predikát v `while` smyčce**, ne v `if`.
  
-    ```+<code c> 
-    pthread_mutex_lock(&m); +pthread_mutex_lock(&m); 
-    while (queue_empty)         // test v *while*! +while (queue_empty)         // test v *while*! 
-        pthread_cond_wait(&cond, &m); // uvolní m, uspí, znovu zamkne m +  pthread_cond_wait(&cond, &m); // uvolní m, uspí, znovu zamkne m 
-    dequeue_item(); +dequeue_item(); 
-    pthread_mutex_unlock(&m); +pthread_mutex_unlock(&m); 
-    ```+</code>
  
   * **Rozdíl vůči semaforu:**     * **Rozdíl vůči semaforu:**  
Line 233: Line 257:
   * **Nevýhody:** vyžaduje disciplínu (predikát v `while` + mutex), signály se mohou ztrácet, pokud nejsou korektně použity.   * **Nevýhody:** vyžaduje disciplínu (predikát v `while` + mutex), signály se mohou ztrácet, pokud nejsou korektně použity.
  
-* **Spin-lock** – zámek, který místo uspání **aktivně točí procesor** (busy-wait), dokud se neuvolní. Hodí se jen pro opravdu krátké kritické sekce.+  * **Spin-lock** – zámek, který místo uspání **aktivně točí procesor** (busy-wait), dokud se neuvolní. Hodí se jen pro opravdu krátké kritické sekce. 
 +    * **Princip (krok za krokem)**   
 +      * **Sdílená proměnná `lock`** je inicializována na `0` = neobsazeno.   
 +      *  Vlákno provede ***atomickou*** instrukci `test-and-set` (TAS) nebo `compare-and-swap` (CAS) 
 +    * **Výsledek atomické operace**   
 +      * návratová 0 → zámek byl volný, vlákno ho právě získalo ⇒ vstup do kritické sekce;   
 +      * návratová 1 → zámek je držen někým jiným ⇒ vlákno **spinuje**: opakuje krok 2 (obvykle s `pause` či exponenciálním back-off, aby nezahltilo sběrnici).   
 +    * **Uvolnění**: vlákno po dokončení kritické sekce prostým zápisem nastaví `lock = 0`. (Operace zápisu je pro uvolnění bezpečná, protože z 1 → 0 není podmíněná.)   
 +      * U vícejádrových CPU se přidá *release memory fence* (`mfence`, `std::atomic_thread_fence(std::memory_order_release)`), aby se změny v kritické sekci *nejprve* propagovaly do paměti. 
 +   
 +**TAS**: „ulož do `lock` hodnotu 1 **a vrať mi předchozí obsah**“.   
 +<code c> 
 +tas:     mov  $1, %eax       ; pokusím se zapsat 1 
 +         xchg %eax, lock    ; ATOMICKY vyměním registr ↔ paměť 
 +         ; pokud %eax == 0 → zámek byl volný a mám ho 
 +</code>
  
-  * **Princip (krok za krokem)**   +**CAS**: „pokud je `lock == 0`, zapiš 1; jinak nedělej nic a dej mi současnou hodnotu“.   
-    1. **Sdílená proměnná `lock`** je inicializována na `0` = neobsazeno.   +<code c> 
-    2. Vlákno provede ***atomickou*** instrukci `test-and-set` (TAS) nebo `compare-and-swap` (CAS):   +bool acquired = __sync_bool_compare_and_swap(&lock, 0, 1); 
-       *TAS*: „ulož do `lock` hodnotu 1 **a vrať mi předchozí obsah**“.   +</code> 
-         ```asm +Tyto instrukce jsou **atomické**, protože CPU uzamkne cache-line / sběrnici a zaručí, že během operace *nikdo jiný nemůže mezitím měnit* tutéž buňku paměti.  
-         tas:     mov  $1, %eax       ; pokusím se zapsat 1 +
-                   xchg %eax, lock    ; ATOMICKY vyměním registr ↔ paměť +
-                   ; pokud %eax == 0 → zámek byl volný a mám ho +
-         ```   +
-       - *CAS*: „pokud je `lock == 0`, zapiš 1; jinak nedělej nic a dej mi současnou hodnotu“.   +
-         ```+
-         bool acquired = __sync_bool_compare_and_swap(&lock, 0, 1); +
-         ``` +
-       Tyto instrukce jsou **atomické**, protože CPU uzamkne cache-line / sběrnici a zaručí, že během operace *nikdo jiný nemůže mezitím měnit* tutéž buňku paměti.   +
-    3. **Výsledek atomické operace**   +
-       - návratová 0 → zámek byl volný, vlákno ho právě získalo ⇒ vstup do kritické sekce;   +
-       - návratová 1 → zámek je držen někým jiným ⇒ vlákno **spinuje**: opakuje krok 2 (obvykle s `pause` či exponenciálním back-off, aby nezahltilo sběrnici).   +
-    4. **Uvolnění**: vlákno po dokončení kritické sekce prostým zápisem nastaví `lock = 0`. (Operace zápisu je pro uvolnění bezpečná, protože z 1 → 0 není podmíněná.)   +
-       - U vícejádrových CPU se přidá *release memory fence* (`mfence`, `std::atomic_thread_fence(std::memory_order_release)`), aby se změny v kritické sekci *nejprve* propagovaly do paměti.+
  
   * **Proč „atomické nastavení“?**     * **Proč „atomické nastavení“?**  
-    Kdybychom dělali `if(lock==0) lock=1;`, dva thready mohou *současně* přečíst `0` a oba vstoupit – **race condition**.   +    Kdybychom dělali `if(lock==0) lock=1;`, dva thready mohou *současně* přečíst `0` a oba vstoupit – **race condition**.   
-    Atomická instrukce provede **čtení, test i zápis jako jedinou nepreemptovatelnou transakci**; hardware garantuje, že jen jeden zvítězí.+    Atomická instrukce provede **čtení, test i zápis jako jedinou nepreemptovatelnou transakci**; hardware garantuje, že jen jeden zvítězí.
  
   * **Kdy se vyplatí**     * **Kdy se vyplatí**  
-    Kritická sekce ≤ ~100 CPU cyklů: inkrement globálního čítače, push/pop z velmi krátkého freelistu.   +    Kritická sekce ≤ ~100 CPU cyklů: inkrement globálního čítače, push/pop z velmi krátkého freelistu.   
-    OS kernel & interrupt context, kde uspání není možné.   +    OS kernel & interrupt context, kde uspání není možné.   
-    Vícejádrové systémy, kde je šance, že držitel zámku běží paralelně a brzy skončí.+    Vícejádrové systémy, kde je šance, že držitel zámku běží paralelně a brzy skončí.
  
   * **Nevýhody / na co si dát pozor**     * **Nevýhody / na co si dát pozor**  
-    Na jednojádru může spin-lock místo zrychlení vyvolat *hladovění* (drží CPU a nepustí vlákno, které má zámek uvolnit).   +    Na jednojádru může spin-lock místo zrychlení vyvolat *hladovění* (drží CPU a nepustí vlákno, které má zámek uvolnit).   
-    Dlouhé držení zámku = plýtvání CPU → raději mutex, který vlákno uspí.   +    Dlouhé držení zámku = plýtvání CPU → raději mutex, který vlákno uspí.   
-    Bez férového algoritmu (ticket, MCS) může některé vláknou točit výrazně déle (*starvation*). +    Bez férového algoritmu (ticket, MCS) může některé vláknou točit výrazně déle (*starvation*).
-* **Monitor** – „třída + vestavěný zámek + čekací fronta“, která **zapouzdřuje sdílená data a pravidla používání**: +
-  * Voláš-li *veřejnou metodu* monitoru, **vstupuješ do monitoru** – systém ti **automaticky zamkne vnitřní mutex**.   +
-    Žádné jiné vlákno se dovnitř nedostane, dokud z metody nevrátíš – tím se zámek zase uvolní.   +
-    → Všechny změny dat uvnitř monitoru jsou atomické vůči ostatním vláknům. +
-  * Potřebuje-li metoda čekat na nějaký **stav** (např. „fronta není prázdná“), zavolá `wait(cond)`   +
-    - vlákno se přesune do **čekací fronty** dané podmínky a **současně opustí monitor** (uvolní vnitřní zámek),   +
-    - jiná vlákna mohou stav změnit.   +
-    Když někdo zavolá `signal(cond)`, jedno čekající vlákno se probudí, znovu vstoupí do monitoru a pokračuje – zámek už drží. +
-  * Důsledek: **uživatel monitoru nikdy ručně nemanipuluje se zámkem ani s podmínkovými proměnnými** – ty jsou schované „pod kapotou“.   +
-    Programátor píše jen logiku metod a test predikátů. +
-  * **Rozdíl proti „mutex + podmínková proměnná“ samostatně:**   +
-    - s monitorem nemůžeš omylem zapomenout zámek odemknout nebo přistoupit k datům bez ochrany;   +
-    - data jsou *soukromá*, dostupná výhradně skrze metody monitoru → jasně vymezená kritická oblast a platnost invariantů.   +
-    V podstatě jde o **bezpečnější a samo-dokumentující obal** nad dvojicí „mutex + cond-var“. +
-</markdown>+
  
-===== Správa virtuální a fyzické paměti =====+  * **Monitor** – „třída + vestavěný zámek + čekací fronta“, která **zapouzdřuje sdílená data a pravidla používání**: 
 +    * Voláš-li *veřejnou metodu* monitoru, **vstupuješ do monitoru** – systém ti **automaticky zamkne vnitřní mutex**.   
 +    * Žádné jiné vlákno se dovnitř nedostane, dokud z metody nevrátíš – tím se zámek zase uvolní.   
 +      * Všechny změny dat uvnitř monitoru jsou atomické vůči ostatním vláknům. 
 +    * Potřebuje-li metoda čekat na nějaký **stav** (např. „fronta není prázdná“), zavolá `wait(cond)`   
 +      * vlákno se přesune do **čekací fronty** dané podmínky a **současně opustí monitor** (uvolní vnitřní zámek),   
 +      * jiná vlákna mohou stav změnit.   
 +    * Když někdo zavolá `signal(cond)`, jedno čekající vlákno se probudí, znovu vstoupí do monitoru a pokračuje – zámek už drží. 
 +    * Důsledek: **uživatel monitoru nikdy ručně nemanipuluje se zámkem ani s podmínkovými proměnnými** – ty jsou schované „pod kapotou“.   
 +    * Programátor píše jen logiku metod a test predikátů. 
 +    * **Rozdíl proti „mutex + podmínková proměnná“ samostatně:**   
 +      * s monitorem nemůžeš omylem zapomenout zámek odemknout nebo přistoupit k datům bez ochrany;   
 +      * data jsou *soukromá*, dostupná výhradně skrze metody monitoru → jasně vymezená kritická oblast a platnost invariantů.   
 +      * V podstatě jde o **bezpečnější a samo-dokumentující obal** nad dvojicí „mutex + cond-var“. 
 + 
 +===== 4. 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.   * 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.
  
 ==== Názvosloví ==== ==== Názvosloví ====
-** FAP ** – Fyzický adresní prostor, skutečná paměť počítačevelikost závisí na možnosti základní desky a osazených modulech RAM. +  * **FAP** – Fyzický adresní prostor, skutečná paměť počítače; její velikost je dána technickým limitem základní desky a kapacitou osazených RAM modulů
-** LAP ** Logický adresní prostor, virtuální paměť, kterou vidí procesy, velikost závisí na architektuře procesoru operačním systému (32-bit, 64-bit)+  **LAP** – Logický (virtuální) adresní prostor, který vidí každý běžící proces.   
-  * 32-bit: 4 GiB (2^32+    * Adresy v LAP jsou překládány OS na odpovídající místa ve FAP pomocí tabulek stránek a dalších struktur. 
-  * 64-bit: 16 EiB (2^64– v praxi omezeno na 256 TiB (2^48) kvůli TLB a stránkovacím tabulkám+    * Velikost LAP závisí na architektuře CPU OS
 +      * 32-bit: 4 GiB (2³²– většinou celý prostor nelze využít kvůli dělení jádra a uživatelského prostoru. 
 +      * 64-bit: teoreticky 16 EiB (2⁶⁴), ale prakticky bývá omezeno (např. na 48 bitů = 256 TiB), hlavně kvůli velikosti TLB a implementaci stránkování. 
 + 
 +==== Segmentace ==== 
 +  * Segmentace je jedna z metod správy paměti, kde se paměť dělí na logické bloky – **segmenty** (např. pro kód, data, zásobník). 
 +  * Adresy v programu jsou tzv. **selektory**, které odkazují na konkrétní záznam v segmentové tabulce. 
 +  * Segmentový záznam obsahuje: základní adresu, délku segmentu, přístupová práva. 
 +  * Procesor pak fyzickou adresu vypočítá jako: `fyzická adresa = základna segmentu + offset`.
  
-==== Segmentace ====  
-V programu používáme adresy zvané "selektory", existuje tabulka, která mapuje selektory na fyzické adresy. 
 {{statnice:bakalar:segmentace.png}} {{statnice:bakalar:segmentace.png}}
  
-<markdown>+**Výhody segmentace** 
 +  * Délka segmentu odpovídá skutečné potřebě – **úspora paměti** (menší vnitřní fragmentace). 
 +  * Při přístupu mimo segment dojde k **výjimce** – typicky **segmentation fault**. 
 +  * Přesuny v paměti jsou **transparentní** – změna základny segmentu neovlivní kód procesu. 
 +  * Každý segment může mít samostatná **přístupová práva** – lepší ochrana paměti (např. nelze spustit data).
  
-Výhody segmentace  +**Nevýhody segmentace** 
-- Segment má délku uzpůsobenou skutečné potřebě  +  Alokace paměti je složitá – segmenty mají různou délku, takže jejich správné rozmístění není triviální
-    - minimum vnitřní fragmentace  +  Při častém vytváření a rušení segmentů dochází k **externí fragmentaci** – malé mezery mezi segmenty nelze využít
-    - Lze detekovat přístup mimo segment, který způsobí chybu segmentace – výjimku typu „segmentation fault“  +  * Větší **režie při přístupu do paměti** – nutnost kontroly segmentového záznamu a výpočtu fyzické adresy.
-- Lze nastavovat práva k přístupu do segmentu  +
-- Lze pohybovat s daty i programem v fyzické paměti – posun počátku segmentu je pro aplikační proces neviditelný a nedetekovatelný  +
- +
-Nevýhody segmentace  +
-Alokace segmentů v paměti je netriviální úloha  +
-    - Segmenty mají různé délky.  +
-    Při běhu více procesů se segmenty ruší a vznikají nové → problém **externí fragmentace**.  +
-- Režie při přístupu do paměti +
- +
-**Fragmentace**   +
-  *Externí (vnější) fragmentace* – Celkové množství volné paměti je sice dostatečné, aby uspokojilo požadavek procesu, avšak prostor není souvislý, takže ho nelze přidělit  +
-  *Interní (vnitřní) fragmentace* – Přidělená díra v paměti je o málo větší než potřebná, avšak zbytek je tak malý, že ho nelze využít. +
-</markdown>+
  
 +**Fragmentace**
 +  * *Externí (vnější)* – V paměti je dost místa, ale rozděleného na malé části – **nelze přidělit větší blok**.
 +  * *Interní (vnitřní)* – Segment je větší, než proces reálně potřebuje → vzniká **nevyužitý zbytek** uvnitř segmentu.
  
 ==== Stránkování ==== ==== Stránkování ====
-<markdown> 
  
-**Stránkování** (paging) rozděluje logický adresní prostor procesu na pevně velké bloky – **stránky** – a fyzickou paměť na stejně velké **rámce** (frames). Překlad stránka → rámec zajišťují **stránkovací tabulky** uložené v pamětijádro je udržuje, hardware (MMU) je čte. +**Stránkování** (paging) rozděluje logický adresní prostor procesu na pevně velké bloky – **stránky**a fyzickou paměť na stejně velké **rámce** (frames).   
-</markdown>+  * Překlad stránka → rámec zajišťují **stránkovací tabulky**, které spravuje jádrohardwarová jednotka MMU je využívá k překladu adres.
  
 === Základní pojmy === === Základní pojmy ===
-<markdown> 
  
-**Velikost stránky** – 4 KiB na x86 / ARM (často i větší: 2 MiB „huge-pages“, 1 GiB „gigapages“).   +  * **Velikost stránky** – obvykle 4 KiB (x86/ARM), ale lze použít i větší: 2 MiB „huge-pages“, 1 GiB „gigapages“. 
-**Page Frame Number (PFN)** – index rámce ve fyzické paměti.   +  **Page Frame Number (PFN)** – index rámce ve fyzické paměti. 
-**Virtuální adresa** = ⟨index stránky, offset ve stránce⟩.   +  **Virtuální adresa** = ⟨index stránky, offset ve stránce⟩. 
-**Page fault** – přerušení při přístupu na stránku, která není (zatím) namapována do RAM. +  **Page fault** – přerušení při přístupu na stránku, která není (zatím) namapována do RAM. 
-</markdown>+ 
 +=== Stránkovací tabulka === 
 + 
 +  * Každý proces má svou **stránkovací tabulku** – strukturu mapující virtuální adresy na fyzické rámce. 
 +  * Záznam o stránce obsahuje např.: 
 +    * PFN cílového rámce (pokud je stránka přítomná), 
 +    * přístupová práva (RWX), 
 +    * příznaky (valid/dirty/accessed), 
 +    * info pro cache / TLB. 
 +  * V moderních architekturách (např. x86_64) je tabulka **víceúrovňová** (typicky 4 nebo 5 úrovní) – pro každou část adresy existuje jedna tabulka.
  
 === Eliminace externí fragmentace === === Eliminace externí fragmentace ===
-<markdown> 
  
-Fyzická paměť je rozdělena na **stejně velké rámce** – OS udržuje jen bitmapu nebo volný seznam rámců  +  * Fyzická paměť je rozdělena na **stejně velké rámce** – OS udržuje bitmapu nebo volný seznam. 
-- Jakákoli stránka může být umístěna do libovolného volného rámce ⇒ **žádné děravé „díry“ různé velikosti**.   +  * Každá stránka může být umístěna do libovolného rámce ⇒ **nevznikají nespojité díry** jako u segmentace. 
-- Zbytková nevyužitá paměť se omezuje jen na *vnitřní* fragmentaci (max. 1 stránka na segment) – velikost je tedy **pevně ohraničená** volbou page size.   +  * Vzniká pouze **vnitřní fragmentace** (max. 1 stránka na segment). 
-- Oproti **segmentaci** tak kernel nemusí provádět drahou kompakci/relokaci velkých bloků a nedochází k postupnému „rozkouskování“ RAM.   +  Výběr volného rámce je efektivní (bitmapa – O(1)); není nutné relokovat paměť.
-- Díky jednotné velikosti rámců i stránek je výběr volného místa jednoduchý (O(1) bitmapaa predikovatelný. +
-</markdown>+
  
 === Překlad adresy – krok za krokem === === Překlad adresy – krok za krokem ===
-<markdown> 
  
-1. **TLB lookup** – MMU hledá záznam prospektivní (Virt → Fyz) ve *Translation Lookaside Bufferu* (malá L1 L2 cache uvnitř CPU).   +  - **TLB lookup** – MMU nejprve hledá překlad (Virt → Fyz) *Translation Lookaside Bufferu* (L1/L2 cache). 
-2. **Miss v TLB** ⇒ hardware čte položku ze stránkovací tabulky v paměti (víceúrovňově).   +  **Miss v TLB** ⇒ hardware načte záznam ze stránkovací tabulky v paměti (víceúrovňový průchod podle částí adresy). 
-3. Pokud tabulky říkají „stránka není v RAM“, vyvolá se **page fault** → kernel vybere rámec (oběť)případně zapíše jeho obsah na disk (**swap**), načte požadovanou stránku, aktualizuje tabulku, zopakuje instrukci. +  Pokud záznam říká, že stránka není v RAM ⇒ **page fault**
-</markdown>+    * jádro zvolí volný rámec (nebo oběť, kterou swapne na disk), 
 +    * načte požadovanou stránku (např. z binárkysouboru nebo swappu), 
 +    * aktualizuje tabulku a TLB, zopakuje instrukci.
  
-=== Víceúrovňové tabulky === +=== Nevýhody stránkování ===
-<markdown>+
  
-| Architektura | Úrovně | Dekompozice virtuální adresy (íklady| +  * **Vícenásobný ístup** při TLB miss – může být třeba 4–5 čtení z paměti (1–4 úrovně tabulek + samotná data). 
-|--------------|-------|-----------------------------------------| +  * **Vnitřní fragmentace** – poslední stránka segmentu často není plně využita. 
-**x86 32-bit** | 2 (PDE, PTE) | 10 bit index PDE • 10 bit index PTE • 12 bit offset | +  * **TLB thrashing** – pokud pracovní set přesahuje kapacitu TLBdochází ke zpomalujícím TLB missům. 
-**x86-64 (48 bit LAP)** | 4 (PML4PDPTE, PDE, PTE) | 9 + 9 + 9 + 9 + 12 | +  * **Správa swappu** přináší I/O režii a může vést ke *thrashingu* celé RAM.
-**x86-64 (57 bit LAP, „5-level“)** | 5 (PML5…) | 9 × 5 + 12 |+
  
-> Více úrovní tabulky jsou samy stránkované ⇒ menší rezidentní režie, protože se alokují jen podstromy skutečně používané procesem. +=== TLB (Translation Lookaside Buffer) ===
-</markdown>+
  
-=== Nevýhody stránkování === +  * Malá, **plně asociativní cache** překladů Virt → Fyz (desítky až stovky záznamů na CPU jádro). 
-<markdown>+  * Výrazně zrychluje přístup – při TLB hit není třeba sahat na stránkovací tabulky. 
 +  * **TLB shootdown**: při změně mapování (např. `mmap()`, `fork()`) musí OS invalidovat TLB záznamy všech CPU, které daný proces používají – pomocí IPI. 
 +  * **ASID (Address Space ID)** nebo **PCID (Process Context ID)**: 
 +    * značka v TLB, která umožňuje udržovat překlady i po přepnutí procesu, 
 +    * zabraňuje nutnosti flush TLB při každém context switchi.
  
-- **Vícenásobný přístup** na jednu virtuální adresu: TLB miss → až 4–5 čtení z paměti, pak teprve data.   +=== Víceúrovňové tabulky ===
-- **Vnitřní fragmentace**: poslední stránka segmentu bývá ne plně využita.   +
-- **TLB thrashing** u pracovních setů větších než TLB.   +
-- **Režie správy swapu** (I/O latence) ⇒ thrashing celé RAM. +
-</markdown>+
  
-=== TLB (Translation Lookaside Buffer=== +| Architektura               | Úrovně překladu                 | Dekompozice virtuální adresy (bitové pole    | 
-<markdown>+|----------------------------|----------------------------------|------------------------------------------------| 
 +| **x86 (32-bit)**           | 2 (PDE, PTE)                     | 10 bit index PDE • 10 bit index PTE • 12 bit offset | 
 +| **x86-64 (48bit LAP)**     | 4 (PML4, PDPTE, PDE, PTE)        | 9 + 9 + 9 + 9 + 12                             | 
 +| **x86-64 (57bit LAP)**     | 5 (PML5, PML4, PDPTE, PDE, PTE)  | 9 × 5 + 12                                     |
  
-- Maláplně asociativní cache překladů (desítky až stovky záznamů na jádro).   +  * Každá úroveň odpovídá stránkovací tabulce (page table)která se používá pro překlad části virtuální adresy. 
-**Shoot-down**: když kernel změní mapování, musí invalidovat TLB všech CPU (IPI).   +  * Jednotlivé části virtuální adresy slouží jako indexy do těchto tabulek – z každé se vybere záznam ukazující na tabulku další úrovně. 
-**ASID/PCID**: značka procesu v TLB zmenšuje nutnost flush při přepnutí procesu. +  Poslední úroveň obsahuje **Page Table Entry (PTE)** s fyzickým rámcem, ve kterém stránka začíná
-</markdown>+  Díky stránkování stránkovacích tabulek (samy jsou rozděleny na stránky) systém **alokuje jen části stromu**, které proces skutečně používá ⇒ **úspora paměti**. 
 +  * Nejčastější hloubka tabulek dnes je 4 (x86-64), pátá úroveň se používá při větších LAP (např. 57bit v Linuxu).
  
 === Odkládání stránek na disk (swapping) === === Odkládání stránek na disk (swapping) ===
-<markdown> 
  
-**Swap area** na HDD/SSDstránky se zapisují při tlaku na RAM.   +  * **Swap area** – vyhrazená část disku (HDD/SSD), kam se ukládají stránky, které nejsou často používané, aby se uvolnila RAM. 
-**Lazy** a **demand paging**: kód i data se načítají až při prvním ístupu (page fault)  +  * **Demand paging** – stránky se načítají do paměti **až při pokusu o ístup** → efektivnější využití RAM
-**Thrashing**když se pracovní set nevejde do RAM a proces tráví víc času swapováním než výpočtem. +  **Thrashing** – situace, kdy proces spotřebuje tolik stránek, že dochází k **častému swapování** a výkon dramaticky klesá (systém více swapuje než počítá).
-</markdown>+
  
 === Algoritmy výběru oběti (page replacement) === === Algoritmy výběru oběti (page replacement) ===
-<markdown> 
-*„Oběť“ (victim) = stránka/rámec ve fyzické RAM, který jádro vyhodí (popř. odsune do swapu), když je nutné uvolnit místo pro jinou stránku po page faultu. Neplést s TLB – tam probíhá samostatný HW replacement – ani s celými stránkovacími tabulkami; ty se pouze upraví podle výsledku algoritmu výběru oběti.* 
  
-| Algoritmus | Idea | Poznámky | +  * „Oběť“ = stránka ve fyzické paměti, kterou kernel vyhodí (nebo uloží do swapu), aby mohl přinést novou stránku (např. po page faultu). 
-|------------|------|----------| +  * Cílem je vybrat stránku, která **nebude brzy znovu potřebná**, což je těžké odhadnout → používají se heuristiky. 
-| **FIFO** | vyhoď nejstarší stránku | jednoduchýtrpí Beladyho anomálií | + 
-| **Second-Chance (Clock)** | FIFO + 1 bit „referenced“ | linuxový základ (`CLOCK-Pro`) | +| Algoritmus                 | Idea                                 | Poznámky                                      
-| **LRU / Aproximované LRU** | vyhoď nejméně nedávno použitou | přesné LRU drahé; používají se bitmapy časová okna +|----------------------------|--------------------------------------|-----------------------------------------------| 
-| **Working-Set** | drž stránky aktivní v posledním intervalu ∆ | dobré, ale žké měřit +| **FIFO**                   Vyhoď nejstarší stránku              | jednoduchýtrpí **Beladyho anomálií** (větší paměť ⇒ horší výkon) 
-| **Adaptive (e.g., ARC)** | kombinuje LRU a LFU | v moderních OS/DB | +| **Second-Chance (Clock)** | FIFO s dodatečným bitem „referenced“ | základní Linuxová varianta (`CLOCK-Pro`), stránka dostane „druhou šanci“ 
-</markdown>+| **LRU / Approx. LRU**      Vyhoď nejméně nedávno použitou       | přesný LRU je drahý na implementaciOS často používají approximace (bitmapy, počitadla) 
 +| **Working-Set**            Drž stránky aktivní v posledním čase ∆ | přesnější, ale dražší na výpočet 
 +| **Adaptive (např. ARC)**   Kombinace LRU a LFU                  používá se v moderních OS (Windows, ZFS) i databázích |
  
 === Copy-On-Write (COW) === === Copy-On-Write (COW) ===
-<markdown> 
  
-1. Při `fork()` dostanou parent child stránky **jen pro čtení** a ukazují na *stejný rámec*.   +  * Mechanismus pro **efektivní sdílení paměti** mezi procesy. 
-2. První zápis vyvolá **page fault**. Kernel:   +  * Při volání `fork()` nedochází hned ke kopírování všech stránek – místo toho: 
-   - alokuje nový rámec,   +    * Proces **rodič potomek sdílejí stejné rámce**, označené jako **read-only**. 
-   - zkopíruje obsah původní stránky,   +    * Jakmile jeden z nich provede **zápis**, vyvolá se **page fault**. 
-   - přemapuje zapisující proces na nový rámec (RW).   +    * Kernel: 
-3. Šetří kopírování při `fork+exec`, sdílí read-only data (např. `.text`, sdílené knihovny). +       * alokuje nový rámec, 
-</markdown>+       * zkopíruje obsah původní stránky, 
 +       * přemapuje novou stránku jako RW. 
 +  * Výhody: 
 +    * výrazné **zrychlení `fork()`**když následně proces provede `exec()`, 
 +    * efektivní **sdílení statických dat** – např. kód (`.text`), knihovny apod.
  
 === Shrnutí výhod stránkování === === Shrnutí výhod stránkování ===
-<markdown> 
  
-**Eliminace externí fragmentace** – všechny rámce mají stejnou velikost, takže OS vždy najde volný rámec bez „děr“; na rozdíl od segmentace není nutná kompakce.   +  * **Eliminace externí fragmentace** – všechny rámce mají stejnou velikost, takže OS vždy najde volný rámec bez „děr“; na rozdíl od segmentace není nutná kompakce. 
-Snadný růst haldy/stacku – nové stránky se prostě namapují do dalších rámců.   +  * **Snadný růst haldy/stacku** – nové stránky se prostě namapují do dalších rámců. 
-Izolace procesů – ochranné bity (R/W/X, User/Supervisor).   +  * **Izolace procesů** – ochranné bity (R/W/X, User/Supervisor) zajišťují oddělení paměti mezi procesy
-Sdílení kódu a knihoven mezi procesy (stejný rámec mapovaný do více LAP).   +  * **Sdílení kódu a knihoven** – více procesů může mapovat stejný fyzický rámec (např. `.text` segment) do svého LAP. 
-- Podpora virtuální paměti větší než fyzická (swapdemand paging)  +  * **Virtuální paměť > fyzická** – systém může využít swap demand paging pro rozšíření dostupné paměti
-Mechanismus pro COW, mmap souborů, lazy allocation.+  * **Podpora moderních technik** – Copy-On-Write`mmap()` pro soubory, lazy allocation.
  
-Nevýhody (víceúrovňové ístupy, TLB missswap latence) se řeší větší TLB, huge-pages, lepším algoritmem náhrady a dostatkem RAM. +  *Nevýhody(víceúrovňový eklad, TLB missy, latence při swapu) se zmírňují pomocí: 
-</markdown>+    * větších TLB (ASID/PCID), 
 +    * použití **huge-pages**, 
 +    * lepších algoritmů výběru oběti, 
 +    * dostatku fyzické paměti (RAM).
  
-===== Souborové systémy ===== +===== 5. 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.+** 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.**
  
-FATFAT32exFATNTFSext2/3/4, btrfs, ZFS+Způsob organizace dat na disku – data jsou uložena v souborechsoubory jsou strukturované v adresářích (hierarchická struktura). 
 +  * Souborový systém určujejak jsou data fyzicky a logicky organizovánajak se přistupuje ke souborůmjaká metadata jsou vedena apod.
  
-možnosti uložení obsahu: +==== Příklady souborových systémů ====
-  * uložení souboru jako souvislý úsek bloků +
-    * posobné alokace paměti, rychlý přístup k datům +
-    * způsobuje fragmentaci a nutnost přesunů souborů +
-  * spojové seznamy +
-    * každý blok obsahuje i ukazatel na další blok (adresář obsahuje odkaz na 1. blok) +
-    * výhodné pro sekvenční přístup k souborům, ne pro vše ostatní +
-    * není možné data mapovat přímo z disku +
-    * jeden špatný sektor na disku může způsobit ztrátu celého souboru +
-  * indexové struktury +
-    * indexový blok obsahuje ukazatele na mnoho jiných bloků +
-    * vhodnější pro náhodný přístup, stále poměrně dobré pro sekvenční +
-    * může být potřeba použít více indexových bloků+
  
 +  * **FAT, FAT32** – jednoduché, široce kompatibilní (např. USB disky), bez žurnálování, náchylné na poškození při výpadku.
 +  * **exFAT** – nástupce FAT32, podporuje větší soubory a disky, stále bez žurnálu.
 +  * **NTFS** – moderní FS pro Windows, podporuje práva, šifrování, kompresi, žurnálování.
 +  * **ext2/3/4** – nejpoužívanější na Linuxu; ext3/4 podporují žurnál, ext4 má rychlejší přístup a větší limity.
 +  * **Btrfs** – pokročilý FS s podporou snapshotů, kontrolních součtů, RAIDu, dynamické alokace.
 +  * **ZFS** – kombinace FS a správy disků, silné kontroly integrity dat, snapshoty, samoopravné mechanismy.
 +
 +==== Možnosti uložení obsahu souboru ====
 +
 +  * **Souvislý úsek bloků**
 +    * Podobné jako alokace paměti – rychlý sekvenční přístup.
 +    * Nevýhoda: fragmentace a nutnost přesunů při zvětšení souboru.
 +    * Typicky vhodné pro **sekvenční čtení** (např. média, logy).
 +
 +  * **Spojové seznamy**
 +    * Každý blok obsahuje i ukazatel na další blok; adresář obsahuje odkaz na první blok.
 +    * Jednoduchá implementace, vhodné pro **sekvenční přístup**, ale:
 +      * Nevhodné pro náhodný přístup – nutné projít celý seznam.
 +      * Nemožnost přímého mapování souboru do paměti.
 +      * Jediný poškozený sektor může znepřístupnit celý soubor.
 +
 +  * **Indexové struktury**
 +    * Používá se samostatný **indexový blok**, který obsahuje ukazatele na datové bloky.
 +    * Umožňuje rychlý **náhodný přístup** (random access), stále dobrý i pro sekvenční čtení.
 +    * Při velkých souborech může být potřeba víceúrovňový index.
 +    * Používají např. ext a NTFS.
 +
 +==== Základní souborové systémy ====
  
 === FAT (File Allocation Table) === === FAT (File Allocation Table) ===
-  * starý souborový systém s mnoha omezeními +  * Starý, jednoduchý souborový systém s mnoha omezeními. 
-  * něco mezi spojovými seznamy a indexovou strukturou +  * Konstrukčně něco mezi spojovými seznamy a indexovou strukturou. 
-  * základní jednotka je cluset (4-32 KiB), max počet clusterů pro FAT16: $2^16$, pro FAT32: $2^{28}$, exFAT: $2^{32} - 10$ +  * Základní jednotka alokace je **cluster** (432 KiB)
-  * disk je rozložen na MBR (master boot record, informace o file systému - velikost, jméno, počet kopií FAT tabulek, etc.)FAT1, FAT2, root directory, data (má dvě FAT tabulky pro zajištění redundance) +  * Maximální počet clusterů
-  * v tabulce FAT jsou uloženy položky, kdy každá odpovídá jednomu clusteru na disku (hodnota položky udává číslo následujícíhonebo $-1pro konec souboru) +    * FAT16: 2¹⁶ 
-  * nevýhodou je fragmentaceomezená velikost a nutnost procházet FAT položky sekvenčně+    * FAT32: 2²⁸ 
 +    * exFAT: 2³² − 10 
 +  * Disková struktura: 
 +    * **MBR** (Master Boot Record) – informace o FS (velikost, jméno, počet FAT tabulek, apod.) 
 +    * **FAT1, FAT2** – dvě redundantní tabulky 
 +    * **Root directory** 
 +    * **Data** 
 +  * každé položce FAT je číslo následujícího clusteru nebo hodnota `-1pro konec souboru. 
 +  * Nevýhody: 
 +    * silná **fragmentace** 
 +    * **sekvenční přístup** k FAT tabulce při čtení souboru 
 +    * **omezená velikost souboru i disku** 
 +    * chybí žurnálování
  
 === Inodový souborový systém === === Inodový souborový systém ===
-  * metadata jednotlivých souborech jsou uložena v inodech (Index Node)položka adresáře obsahuje kromě jména souboru i číslo inode +  * Metadata o souborech jsou uložena ve **struktuře inode** (Index Node)
-  * inode obsahuje pevný počet odkazů na datové bloky (z offsetu (pozice souboru) lze jednoduše vypočítat, který odkaz použít pro přístup k datům), několik inode se vejde do jednoho bloku +  * Adresářová položka obsahuje jméno a číslo inode. 
-  * když je soubor větší než počet odkazů na datové bloky inode, odkat na další bloky je nepřímo přes blok odkazů+  * Každý inode obsahuje
 +    * několik přímých odkazů na datové bloky 
 +    * nepřímé odkazy – jednoduchý, dvojitý, trojitý (pro větší soubory
 +  * Výpočet pozice bloku je snadný – dle offsetu souboru.
  
 {{statnice:bakalar:osy_inode.png?500}} {{statnice:bakalar:osy_inode.png?500}}
  
-rozložení na disku: +Rozložení na disku: 
-  * pevný počet inodů, samotný inode lze nalézt pomocí jeho indexu v tabulce +  * **Pevný počet inode** – jsou uloženy inode tabulce. 
-  * v superbloku je uložena informace o souborovém systému(celková délka, počet inode, počet volných blokůodkaz na záložní superblok) +  * **Superblok** – obsahuje informace o FS (velikost, počet inode, volné bloky, záložní superblok). 
-  * kořenový adresář+  * **Kořenový adresář** – výchozí místo připojení FS.
  
-hledání volného místa +Hledání volného místa: 
-  * sekvenčním procházením (neefektivní) +  * Sekvenční procházení – neefektivní. 
-  * poznání volného místa je obtížné (blok nul může být validní obsah souboru) +  * Blok s nulou může být validní obsah souboru ⇒ obtížné určit volný blok. 
-  * řešení jsou bitové mapy, kde každý bit udává obsazenost inodu nebo datového bloku +  * Řešení
-  místo prohledávání inodů se prohledává tato bitová mapa+    * **bitové mapy** (bitmapy) pro inode i datové bloky. 
 +    Vyhledávání je pak rychlé a efektivní.
  
 {{statnice:bakalar:osy_inode_bit.png?750}} {{statnice:bakalar:osy_inode_bit.png?750}}
  
-ext2-+ext2/3/4
-  * při práci se souborem je potřeba pracovat s bitmapouinodem datovými bloky + 
-  * disky (hlavně rotační) přistupují rychleji k blokům blízko sebepokud budou datové bloky až na konci disku, hlavičky disků budou stále jezdit mezi inody a datovými bloky (pomalé) +  * Při práci se souborem je potřeba přístup k bitmapěinodu datovým blokům. 
-  * proto jsou data organizována do skupin, kde se FS snaží alokovt datové bloky ve stejné skupině jako inody+  * rotačních disků je výhodnékdyž jsou bloky blízko sebe. 
 +  * FS dělí disk na **skupiny bloků**, které obsahují inody i data ⇒ snížení latence přístupu.
  
 {{statnice:bakalar:osy_inode_skupiny.png?750}} {{statnice:bakalar:osy_inode_skupiny.png?750}}
  
 === Extents === === Extents ===
-  * tabulky bloků nejsou efektivní pro obrovské soubory, je potřeba velká režie 
-  * moderní FS mohou odkazovat místo na jednotlivé bloky na celé souvislé skupiny bloků 
-  * odkazovaná skupina s více než jedním blokem se nazývá extent 
-  * implementováno v ext4, NTFS, btrfs 
-   
-{{statnice:bakalar:osy_extents.png?500}} 
  
 +  * U velkých souborů je indexace po jednotlivých blocích neefektivní.
 +  * Moderní FS používají **extenty** – odkazy na **souvislé skupiny bloků** (namísto jednotlivých).
 +  * Každý extent: ⟨začátek, délka⟩
 +  * Výhody:
 +    * Méně režie než při uložení všech odkazů zvlášť.
 +    * Lepší výkon u sekvenčního i náhodného přístupu.
 +  * Používá se např. v **ext4**, **NTFS**, **btrfs**.
 +
 +{{statnice:bakalar:osy_extents.png?500}}
  
 === Žurnálování === === Žurnálování ===
-  před tím než se začne souborový systém modifikovat, uloží se seznam potřebných změn na vyhrazené místo (žurnál) + 
-  * pokud dojde k pádu systému, zkontroluje se žurnálzměny disku se provedou dostatečně +  Před tímnež se začne měnit obsah souborového systému, uloží se plánované změny do zvláštní oblasti disku – **žurnálu**. 
-  * implementováno v NTFS, ext3/4+  * Pokud dojde k pádu systému, při startu OS se kontroluje žurnál změny se podle j **dokončí nebo zahodí** tak, aby byl FS v konzistentním stavu. 
 +  * Běžné moderních FS: **NTFS****ext3**, **ext4**, **btrfs**, **ZFS** (ten má místo žurnálu transakční model se snapshoty).
  
 {{statnice:bakalar:osy_journal.png?500}} {{statnice:bakalar:osy_journal.png?500}}
  
-bezpečný způsob změny FS +Bezpečný postup změny FS (tzv. transakční protokol):
-  - Commit +
-  - Checkpoint +
-    - aktualizace bloků v souborovém systému (inode, bitmapy, data) +
-    - odstranění transakce z žurnálu+
  
-Možné scénáře při pádu: +  * **Commit** – ukončení transakce zápisem speciálního záznamu (`TxE`). 
-  - do žurnálu se zapíše pouze část transakce +  * **Checkpoint*– změny v inodech, datechbitových mapách se zapíšou na správná místa na disku. 
-    souborový systém je konzistentní, ale obsahuje původní data +  Po úspěšném dokončení se transakce **odstraní** ze žurnálu.
-    při startu O se zjistí, že transakce v žurnálu není kompletní a ignoruje se +
-  - do žurnálu se zaíše celá transakce, ale neaktualizují se bloky +
-    při startu OS se bloky aktualizují podle informací v žurnálu +
-  - zapíše se celá transakce, aktualizují se bloky ale transakce ze žurnálu není odstraněna +
-    při startu OS se bloky přepíší ze žurnálu +
-  - do žurnálu se zapíše pouze část transakce (např. $TxB$, $I_\text{v2}$ a $TxE$, bez $B_\text{v2}$ a $D_\text{v2}$+
-    problém - HW disků se snaží provádět optimalizacemůže změnit pořadí vykonávání příkazů zalaných OS +
-    OS musí poslat speciální příkaz (bariéry), aby se data skutečně zapsala ve skutečném pořadí (garance vykonání všech příkazů před bariérou před pokračováním) +
-    sekvence je tedy: $TxB$, $I_\text{v2}$, $B_\text{v2}$, $D_\text{v2}$, bariéra, $TxE$+
  
-nevýhodou je overhead, komplexnost, zpomalení zápisu+==== Scénáře při pádu systému ====
  
-Flash paměti +  * **Pouze část transakce** zapsaná do žurnálu: 
-  zapisovat lze pouze do vymazaného bloku +    * FS zůstává konzistentní, ale obsahuje původní (nezměněná) data. 
-  * zapsat lze pouze jednoupak se musí vymazat +    OS při startu zjistí neúplnou transakci a ignoruje ji. 
-  mazací blok bývá větší (např 4 MiB+  * **Celá transakce** je v žurnáluale **blogy na disku se nezmění**: 
-  * každý blok garantuje pouze určitý početpřepsání (např. 100 000) +    OS je použije k dokončení změ(tzv. *roll-forward*). 
-  často se měnící data (např. bitmapyči FAT tabulkadrasticky snižují životnost paměti +  * **Transakce i bloky jsou zapsány**, ale transakce není odstraněna: 
-  změna jednoho bytu v souboru znamená smazání a znovu zapsání 4 MiB+    * OS je znovu aplikuje (*idempotentní* operace – nezmění výsledek, když se provedou víckrát). 
 +  * **Pouze část transakce** – např. `TxB`, `I_v2`, `TxE`, ale **chybí `B_v2` a `D_v2`**: 
 +    Riziko způsobeno optimalizacemi disku – **změna pořadí zápisů**. 
 +    * OS musí použít tzv. **write barriers** (paměťové/IO bariéry), aby donutil disk dodržet pořadí: 
 +      * Správná sekvence: `TxB`, `I_v2`, `B_v2`, `D_v2`, *bariéra*, `TxE`. 
 +  
 + * **Nevýhody žurnálování**: 
 +    * Režie navíc (dvojnásobné zápisy: nejprve do žurnálupak do FS)
 +    * Složitost implementace. 
 +    Zpomalení zápisových operací.
  
-řešením je nepoužívat Flash čipy samostatně, ale v kombinaci s řadičem - Flash Translation Layer +=== Flash paměti === 
-  * použití speciálních souborových systémů (UBIFSJFFS2, NILFS)+  * **Flash bloky** lze pouze přepsatpokud jsou nejprve **vymazány**. 
 +  * **Zápis je jednorázový** – změna jednoho bajtu znamená smazání celého bloku (např. 4 MiB). 
 +  * **Omezený počet přepisů** – typicky 100 000 až 1 000 000 cyklů na blok. 
 +  * Často měněná data (bitmapyFAT tabulkymohou výrazně zkrátit životnost paměti. 
 +  * Důsledkem je **write amplification** – malá změna vyžaduje velkou operaci.
  
 +==== Řešení pro flash paměti ====
 +  * Nepoužívají se přímo, ale s řadičem, který implementuje **Flash Translation Layer (FTL)**:
 +    * Skryje omezení zápisu, přemapovává fyzické bloky, spravuje wear-leveling.
 +    * Typické u SSD, eMMC, SD karet.
 +  * **Speciální souborové systémy pro flash**:
 +    * **UBIFS** – pro NAND flash, umí journal, garbage collection.
 +    * **JFFS2** – log-strukturovaný, pro malé embedded systémy.
 +    * **NILFS** – log-based, kontinuální snapshoty, optimalizovaný pro SSD.
  
  
- +===== 6. Bezpečnost =====
-===== 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.   * 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.
  
-=== Trusted Computing Base === +=== Trusted Computing Base (TCB) === 
-je množina všech entit kterým systém **věří** => pokud selžou, systém už nemusí být bezbečný+  * Množina všech komponent, kterým systém **musí důvěřovat**, aby zaručil bezpečnost. 
-Příklady: hardware, Jádro OS (nezbytně), administrátor serveru+  * Pokud selže některá část TCB**celý systém žbýt kompromitován**
 +  Příklady: hardware, jádro OS, správce systému (root), hypervisorfirmware, kryptografické klíče.
  
 === Základní metody řízení přístupu === === Základní metody řízení přístupu ===
-Základní princip  je **Matice řízení přístupu** - definuje stav ochrany v daném čase.+  * Základním teoretickým modelem je **matice řízení přístupu** – popisuje, kdo má jaká oprávnění k čemu v daném čase.
  
 {{statnice:bakalar:osymatrix.png?200}} {{statnice:bakalar:osymatrix.png?200}}
  
-  * Objekty jsou např. soubory +  * **Subjekty** – např. uživatelé, procesy. 
-  * Subjekt je např. uživatel +  * **Objekty** – např. soubory, zařízení, síťové sockety. 
-  * Subjekty mohou být zároveň objekty+  * Subjekty mohou být zároveň objekty (např. pokud lze nastavit práva k procesu).
  
 **Ukládání stavu ochrany** není typicky jako matice (moc „řídké“, neefektivní, dynamické). **Ukládání stavu ochrany** není typicky jako matice (moc „řídké“, neefektivní, dynamické).
Line 557: Line 637:
     - Každý takový řádek je nazýván „seznam schopností“ (**capability list**)     - Každý takový řádek je nazýván „seznam schopností“ (**capability list**)
  
-== Seznamy pro řízení přístupu (ACL) == +=== Seznamy pro řízení přístupu (ACL) === 
-Implementováno skoro ve všech běžných OS + 
-Subjekty jsou obvykle sloučeny do tříd +  * Nejrozšířenější model, implementován v UNIX, Linux, Windows... 
-  * např. v UNIXu: majitel, skupina, ostatní+  Subjekty bývají seskupeny do tříd (např. majitel, skupina, ostatní). 
 +  
 <code bash> <code bash>
 $ ls -ld /var/spool/cups $ ls -ld /var/spool/cups
 drwx--x--- 1 root lp 6754 Nov 22 00:00 /var/spool/cups drwx--x--- 1 root lp 6754 Nov 22 00:00 /var/spool/cups
 </code> </code>
-  obecnější seznamy ve Windows či v současném Linuxu + 
-    (příkazy get/setfacl) +  Moderní systémy (Linux, Windows) podporují **rozšířené ACL** – více individuálních pravidel. 
-  * mohou obsahovat „negativní“ oprávnění – např. pro +  * Podpora **negativních oprávnění** – např. zakázat ístup členům určité skupiny. 
-    vyloučení ístupu několika uživatelů ze skupiny +  * **Metaoprávnění** – např. oprávnění měnit ACL nebo členství ve skupinách.
-Meta-oprávnění+
-  * řízení členství ve třídách +
-  * dovolují modifikaci ACL+
  
 {{statnice:bakalar:osyacl.png?150}} {{statnice:bakalar:osyacl.png?150}}
-== seznamy Schopností (capability lists) ==  + 
-**Schopnost** je prvek seznamu schopností (duh)+=== Seznamy schopností (Capability Lists=== 
 + 
 +  * **Schopnost (capability)** = token, který **pojmenovává objekt a uděluje oprávnění**. 
 +  * Držitel schopnosti může s objektem manipulovat podle udělených práv. 
 +  * Nevyžaduje centrální seznam přístupů – **decentralizovaný model přístupu**.
  
 {{statnice:bakalar:osycap.png?250}} {{statnice:bakalar:osycap.png?250}}
  
-**Pojemnovává objekt**aby s ním program mohl zacházet (Obj2**uděluje** k objektu práva (RW)+  Typicky se používá v systémechkde se upřednostňuje bezpečnostní izolace a modularita (např. mikrojádrá, sandboxy, některé OS pro embedded zařízení)
 +  Objekty jsou **neviditelné** bez příslušné schopnosti ⇒ důležitý princip *least privilege*.
  
-Všichni kdo vlastní „schopnost“ mají právo s objektem pracovat+=== ACL vs Capability List ===
  
-Méně časté použití běžných systémech (ale pomalu se to mě)+| Seznamy řízení přístupu (ACL) | Schopnosti (Capabilities) | 
 +|-------------------------------|-----------------------------| 
 +| Tradiční model; proces musí dět, **jaký objekt chce**, a systém mu řekne, jestli má přístup. | Objekty jsou přístupné **pouze skrze předané schopnosti** – uživatel je *nemůže najít sám*. | 
 +| Oprávnění určena podle identity subjektu (UID, skupina, …). | Proces **dostane pouze schopnosti**, které mu byly explicitně předány (např. přes socket, fork, init). | 
 +| Problém **ambientní autority** – proces má automaticky všechna práva uživatele. | **Neexistuje ambientní autorita** – práva se předávají cíleně a omezeně. | 
 +| Nelze snadno omezit práva potomků (děděná práva). | Nikdo nemůže předat právo, které **sám nemá**. | 
 +| Linux částečně řeší pomocí **namespaces**, ale není to univerzální ani bezpečnostně dokonalé. | Princip *objektově orientované bezpečnosti*, čistší a škálovatelnější řešení. |
  
-== ACL vs capability list ==+=== Stack Overflow – how to attack === 
 +  * **Přetečení zásobníku** nastane, když program zapíše více dat do bufferu (pole, proměnné) na zásobníku, než je jeho velikost. 
 +    * ⇒ přepíší se další položky na zásobníku – např. sousední proměnné, uložený rámec (frame pointer) nebo **návratová adresa funkce**. 
 +  * Útočník může do bufferu vložit tzv. **shellcode** – malý strojový kód, který může např. spustit shell a umožnit vzdálenou kontrolu systému. 
 +  * Pokud útočník přepíše **návratovou adresu**, může přesměrovat běh programu na vlastní kód (shellcode) nebo jinou část programu. 
 +  * Útoky se zaměřují na programy v C/C++, kde chybí **automatická kontrola hranic polí**. 
 +  * **Omezení shellcodu** – nesmí obsahovat binární nuly (`\0`), protože řetězce jsou jimi ukončovány. ⇒ používají se techniky kódování. 
 +  * Moderní techniky: **Return-Oriented Programming (ROP)** – nevpichují nový kód, ale skládají útočný řetězec z již existujících instrukcí v programu (**gadgety**).
  
-| Seznamy řízení přístupu (ACL) | Schopnosti | +=== Stack Overflow – how to defend === 
-|-----------------------------------|----------------| +  * **Nespustitelný zásobník (NXXD bitARM UXN)** – zakáže spuštění kódu datové části zásobníku
-| - Tradičnívšeobecně známéale... | Lepší vlastnosti pohledu bezpečnosti| +  * **ASLR (Address Space Layout Randomization)** – náhodné rozmístění paměťových oblastí (zásobník, knihovny, binárky) každém spuštění programu. 
-| - Proces musí být schopen **zjistit jaké objekty existují** (pojmenovánía pak teprve je může používat (a nebo mu je k nim ístup odepřen) | - Neexistuje ambientní autorita, každému procesu jsou **delegovány** jen ty **schopnosti**, které potřebuje (zásada nejmenší pravomoci). +  * **Stack Canary / Stack Protector** – před návratovou adresu se vloží kontrolní hodnota (canary). Pokud je přepsaná, program detekuje útok a ukončí se. 
-| - Typicky to ří tzv. **ambientní autorita** – tj. každý proces má všechna práva uživatele, který ho spustil (např. „vidí“ celý souborový systém může zjistit, kteří další uživatelé jsou v systému)| - Napřproces nevidí všechny soubory, ale jen soubory (či celé adresářové stromy)které mu rodič nebo nějaká služba „delegoval(a)| +  * **Retguard** – návratová adresa je zakódována při vstupu do funkce dekódována při návratuZměna adresy útočníkem způsobí pád. 
-|    - Pokud program spouští jiný program, potomkovi nelze jednoduše práva omezit. | - Nikdo nemůže delegovat schopnosti, které sám nemá. | +  * **Bezpečné programování** – validace velikosti vstupních datpoužívání bezpečných funkcí (`strncpy` místo `strcpy`, `snprintf` místo `sprintf`). 
-|    - V Linuxu se dnes tento problém řeší pomocí „jmenných prostorů“ (**namespaces**)ale není to elegantní a trpí to některými nedostatky |  |+  * **Používání moderních jazyků a knihoven**, které mají ochranu proti přetečení zabudovanou (Rust, některé safe C knihovny). 
 +  * **Oddělení práv a minimalizace oprávnění** – běžící procesy by měly mít minimální potřebná oprávněníaby případný útok měl omezený dopad.
  
-=== Stack Overflow - how to attack === 
-Přetečení zásobníku nastane, když program zapíše více dat do bufferu (pole, proměnné) na zásobníku, než je jeho velikost. 
  
-=> Tím se přepíší další položky na zásobníku, jako jsou sousední proměnné, uložený rámec (frame pointer) nebo návratová adresa funkce. 
  
-Útočník může do bufferu vložit tzvshellcode – malý strojový kódkterý po vykonání může např. spustit shell a umožnit vzdálenou kontrolu systému.+===== 7Virtualizace ===== 
 +  * softwarová virtualizacemetoda trap-and-emulate, virtualizace systémového volání, virtualizace stránkovacích tabulek, hardwarově asistovaná virtualizace.
  
-Pokud útočník přepíše návratovou adresu funkceže přesměrovat h programu na vlastní kód (shellcode) nebo jiné instrukce v programu.+Virtualizace je **abstrakce hardwaru** a jeho částečná emulace v softwaru. Hostujícímu systému je vytvořena iluze, že běží na vlastním fyzickém stroji.
  
-Útoky jsou často cílené na programy v jazyce C/C++kde chybí automatická kontrola hranic polí.+Základní pojmy: 
 +  * **Hostitel (host)** – fyzický hardware nebo virtualizované prostředí, na kterém běží hypervizor. 
 +  * **Hypervizor** – softwarekterý emuluje virtuální hardware a řídí běh VM. 
 +  * **Host (guest)** – OS běžící na virtuálním hardware poskytovaným hypervizorem.
  
-Omezení shellcodenesmí obsahovat binární nulové bajty etězce jsou ukončeny nulou). Proto se využívají speciální techniky kódování.+Typy virtualizace: 
 +  * **Plná virtualizace** – host neví, že běží na virtualizovaném systému (typicky trap-and-emulate). 
 +  * **Paravirtualizace** – host si je vědom virtualizace a aktivně spolupracuje s hypervizorem. 
 +  * **Emulace** – celé prostředí je softwarově emulované, včetně instrukcí CPU (např. QEMU bez KVM). 
 +  * **Cloud virtualizace** – vzdálené řízení a spouštění VM v rámci cloud infrastruktury.
  
-Moderní útočníci používají i Return-Oriented Programming (ROP) – místo vkládání nového kódu využívají již existující kód (gadgety) a poskládají z něj škodlivý program. +=== Výhody VM ===
-=== Stack Overflow - how to defend === +
-Nespustitelný zásobník (Non-executable stack) – moderní procesory (Intel XD bit, ARM UXN) umožňují označit zásobník jako neexekuovatelný, takže nelze spustit kód přímo z dat na zásobníku.+
  
-Address Space Layout Randomization (ASLR) – náhodné rozmístění paměťových oblastí (zásobníkknihovny, program) při každém spuštění, což komplikuje útočníkovi nalezení přesných adres pro esměrování.+  * **Izolace** – VM jsou navzájem i od hosta oddělenévyšší bezpečnost. 
 +  * **Současný běh více OS** – např. Linux + Windows současně na jednom stroji. 
 +  * **Přenositelnost a snapshoty** – běžící VM lze esunout nebo pozastavit. 
 +  * **Vývoj a testování** – chyby v kernelu nezhodí celý systém.
  
-Stack Canary / Stack Protector – do zásobníku se před návratovou adresu vloží speciální kontrolní hodnota (canary). Při návratu se zkontroluje, zda nebyla přepsána, a pokud ano, program se ukončí.+=== Problémy virtualizace ===
  
-Retguard – kódování návratové adresy i vstupu do funkce a její dekódování i návratu; pokud je adresa změněná útočníkem, dojde k chybě a program skončí.+Moderní CPU má dva režimy: 
 +  * **Uživatelský režim (user mode)** – omezený, aplikace, nelze istupovat k HW. 
 +  * **Privilegovaný režim (kernel mode)** – OS, ístup ke všemu v systému.
  
-Bezpečné programování – vždy kontrolovat velikost vstupních dat ed jejich uložením do bufferů, používat bezpečné funkce místo nebezpečných (napřstrncpy místo strcpy).+VM nesmí běžet ímo v privilegovaném režimu – vnímáno by to jako bezpečnostní riziko  
 +VM tedy běží v uživatelském režimu hostitele ⇒ je nutné emulovat vlastní **uživatelský** a **privilegovaný režim** uvnitř VM.
  
-Použití moderních jazyků a knihoven, které mají zabudovanou ochranu proti přetečení bufferu.+=== Trap and Emulate ===
  
-Oddělení práv a omezení přístupu – minimalizovat oprávnění běžících procesů, aby ípadné zneužití mělo co nejmenší dopad.+  * Instrukce v **uživatelském režimu** hosta se vykonávají nativně
 +  * Pokus o vykonání **privilegované instrukce** (napřístup k HW) vyvolá **výjimku** (trap). 
 +  * Výjimku zachytí hypervizor, provede požadovanou akci a vrátí řízení zpět do VM. 
 +  * Hostující OS si myslí, že vše proběhlo nativně – **transparentní virtualizace**.
  
 +  * Nutné rozlišovat:
 +    * **Privilegované instrukce** – způsobí trap, když jsou volány z uživatelského režimu.
 +    * **Citlivé instrukce** – mění globální stav nebo závisí na systému ⇒ musí být zachytitelné (v ideálním případě vždy privilegované).
  
 +=== Virtualizace systémových volání ===
  
 +  * Systémová volání (např. `open`, `read`, `write`) přecházejí z uživatelského do privilegovaného režimu.
 +  * Ve VM se volání spustí pomocí **trap**, který hypervizor zachytí a provede požadovanou činnost.
 +  * ⇒ **lehce pomalejší** než nativní syscalls, ale zachována kompatibilita a izolace.
  
 +=== Virtualizace stránkovacích tabulek ===
  
 +  * Každý OS spravuje své **virtuální paměťové mapování** pomocí vlastních stránkovacích tabulek.
 +  * Hypervizor ale musí zajistit, že host nemůže měnit skutečné fyzické mapování:
 +    * Host dostane **virtuální stránkovací tabulky pouze pro čtení**.
 +    * Pokus o změnu vyvolá **trap** – hypervizor provede potřebnou aktualizaci.
 +  * Efektivnější varianta: **shadow page tables** – hypervizor vede vlastní mapu překladů, kterou host nevidí.
 +  * Modernější způsob: **EPT (Intel)** / **NPT (AMD)** – viz níže.
  
-===== Virtualizace ===== +=== Hardwarově asistovaná virtualizace ===
-  * softwarová virtualizace, metoda trap-and-emulate, virtualizace systémového volání, virtualizace stránkovacích tabulek, hardwarově asistovaná virtualizace.+
  
-Virtualizace je abstrakce hardwaru a jeho částečná emulace v softwaru.+Moderní procesory (Intel VT-x, AMD-V) přidávají nový režim: 
 +  * **Non-root execution mode** – speciální režim pro běh VM. 
 +  * Privilegované instrukce v tomto režimu mohou běžet přímo bez nutnosti trap-emulace
 +  * Významně zvyšuje výkon, protože: 
 +    * většina běžných činností běží nativně, 
 +    * trapy nastávají jen při I/O nebo specifických výjimkách.
  
-Jmenujeme tři základní pojmy+Navíc podporují
-  * **Hostitel** - systém, na kterém běží hypervizor, na nejnižší úrovni fyzický hardware, v ípadě zapouzdřené virtualizace to neni fyzický hardware   +  * **EPT (Extended Page Tables)** – hardwarová správa ekladů virtuální → fyzická (host) → skutečná fyzická (hostitel) adresa. 
-  * **Hypervizor** - software běžízí na hostiteli implementující virtuální hardware +  * **Nested virtualization** – virtualizace uvnitř virtualizace (VM jiné VM).
-  * **Host** - systém (většinou OSběžící na virtuálním hardware poskytovaným hypervizorem+
  
-====Výhody VM====  +=== Shrnutí === 
-  * **Izolace** - izolace zlepšuje zabezpečení systému + 
-  * **Mnooho OS najednou** jeden velmi mi výkonný server je možno kompletně nezávisle používat více lidmi mnoho účelů společnostmi/lidmi +| Oblast                   | Princip                                                                 | 
-  * **Praktické** žeme přesunout běžící instanci VM na jiného hostitele +|--------------------------|-------------------------------------------------------------------------| 
-  * **Dobré pro vývoj** - i vývojí věcí jako kernel (nepadá celý počítač)+| Trap and Emulate         | Hypervizor zachytává výjimky při pokusu o privilegovanou instrukci.     | 
 +| Virtualizace syscalls    | Přes trap do hypervizoru, který syscall provede za VM.                 | 
 +| Virtualizace page tables | Host spravuje své PT, ale nesmí je měnit ⇒ trapy a ochrana zápisu.     | 
 +| HW asistence             | Non-root režim + EPT/NPT – mnoho operací běží ímo na CPU.            |
  
-====Problémy virtualizace==== 
-Běžné **CPU** vykonává instrukce ve dvou režimech: 
-  * **uživatelský** - běžné uživatelské aplikace, není možné vykonávat určité akce jako např. zápis na disk 
-  * **privilegovaný** - režim jádra, má neomezený přístup k celému systému 
-   
-Virtualizovaný stroj tedy nemůže běžet v privilegovaném režimu, běží v uživatelském - pro hostitele se tváří jako běžný program. 
-Je nutné tedy implementovat virtuální uživatelský a virtuální privilegovaný režim. 
  
-====Trap and emulate==== 
-  * VM vykonává instrukce, jako by se jednalo o normální nativní OS. 
-  * Uživatelské instrukce běží normálně, nenastává problém. 
-  * Při privilegované instrukci nastane vyjímka (exception) - VM neví že běží celý ve uživatelském režimu. 
-  * Hypervizor tuto vyjímku odchytí a vyřeší - běh VM pokračuje a VM ani neví že nějaká vyjímka nastala 
  
-====Virtualizace Syscalls==== 
-Využívá systému **trap and emulate** - privilegované instrukce vykonává jako by byl normální OS, hypervizor se postará o vyjímky 
  
-====Virtualizace Page Tables==== 
  
  
-====Hard 
  
Navigation

Playground

QR Code
QR Code statnice:bakalar:b4b35osy (generated for current page)