markdown
Slovnicek.md
markdown
# Slovníček Zkratky a pojmy, na které narazíš. Řazeno abecedně. **ABI** - dohoda o tom, jak se volání předává na úrovni strojového kódu: v jakých registrech jsou argumenty a jaká čísla mají jednotlivá volání. Na rozdíl od API se nesmí měnit nikdy. Viz [systémová volání](Systemova-volani). **ACL** - rozšířená práva nad rámec devíti bitů, kterými se dá dát právo konkrétnímu uživateli. `getfacl`, `setfacl`. Viz [práva](Prava-a-uzivatele). **Adresní prostor** - množina adres, které proces vidí. Není to paměť, je to seznam slibů - většina z nich nemá za sebou nic, dokud se jich proces nedotkne. Viz [správa paměti](Sprava-pameti). **Anonymní stránka** - stránka paměti, která nemá kopii v žádném souboru (halda, zásobník). Nedá se zahodit, musí se odložit do swapu. Viz [výměnné algoritmy](Vymenne-algoritmy). **ASLR** - náhodné umístění zásobníku, haldy a knihoven v adresním prostoru, aby útočník nevěděl, kam skočit. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Atomická operace** - operace, kterou nelze přerušit v půlce. `x = x + 1` atomická není, `lock cmpxchg` ano. Na tom stojí všechny zámky. Viz [kritická sekce](Kriticka-sekce-a-zamky). **Bankéřův algoritmus** - postup pro vyhýbání se uváznutí, který povolí přidělení jen tehdy, zůstane-li systém v bezpečném stavu. V operačních systémech se nepoužívá, protože vyžaduje dopředu znát maximální nároky. Viz [uváznutí](Uvaznuti). **Beládyho anomálie** - jev, kdy FIFO při **větší** paměti udělá **víc** výpadků stránek. LRU ji nemá. Viz [výměnné algoritmy](Vymenne-algoritmy). **Blokové zařízení** - zařízení s adresovatelnými bloky a vyrovnávací pamětí (disk). Proti němu stojí znakové zařízení, které je jen proud bajtů. Viz [vstup a výstup](Vstup-a-vystup). **Capabilities** - rozdělení práv roota na jednotlivé pravomoci (`CAP_NET_BIND_SERVICE`, `CAP_NET_RAW`) místo „všechno nebo nic". Dnešní náhrada za setuid. Viz [práva](Prava-a-uzivatele). **CFS** - plánovač Linuxu založený na virtuálním běhovém čase, výchozí od roku 2007. Od jádra 6.6 (rok 2023) ho nahradil EEVDF. Viz [plánování](Planovani-procesu). **cgroups** - mechanismus jádra, kterým se skupině procesů omezí procesor, paměť, vstup a výstup nebo počet procesů. Jedna ze tří věcí, na kterých stojí kontejnery. Viz [virtualizace a kontejnery](Virtualizace-a-kontejnery). **Clock (druhá šance)** - levná aproximace LRU postavená na jediném bitu „bylo přistoupeno". To, co se skutečně používá. Viz [výměnné algoritmy](Vymenne-algoritmy). **Copy-on-write** - stránka se sdílí, dokud do ní někdo nezapíše; teprve pak vznikne kopie. Proto je `fork` levný i u procesu s osmi gigabajty. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **`cr3`** - registr procesoru s adresou kořene tabulek stránek. Jeho přepsání znamená výměnu celého adresního prostoru a je to nejdražší část přepnutí procesu. Viz [přepínání kontextu](Prepinani-kontextu). **Dentry** - záznam v mezipaměti překladu jmen na i-uzly. Bez něj by každý průchod cestou znamenal několik čtení z disku. Viz [VFS](VFS-a-montovani). **Deskriptor souboru** - malé celé číslo, index do tabulky otevřených souborů procesu. 0, 1 a 2 jsou standardní vstup, výstup a chybový výstup. Viz [VFS](VFS-a-montovani). **Dirty COW** - zranitelnost jádra z roku 2016 (CVE-2016-5195), souběh v obsluze copy-on-write umožňující zápis do souboru jen pro čtení. V jádře byla devět let. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **DMA** - přenos dat mezi zařízením a pamětí bez účasti procesoru. Obchází ochranu paměti, a proto existuje IOMMU. Viz [vstup a výstup](Vstup-a-vystup). **eBPF** - cizí kód spuštěný v jádře, ale jen poté, co projde ověřovatelem. Řízená mezera v hranici mezi jádrem a uživatelským prostorem. Viz [architektury jádra](Architektury-jadra). **EEVDF** - výchozí plánovač Linuxu od jádra 6.6 (rok 2023). Proti CFS řeší navíc latenci, ne jen spravedlivé rozdělení času. Viz [plánování](Planovani-procesu). **epoll** - způsob, jak jedno vlákno hlídá tisíce deskriptorů. Nahradil `select` s limitem 1024. Viz [vstup a výstup](Vstup-a-vystup). **`errno`** - proměnná s číslem poslední chyby. Nastavuje ji **knihovna**, ne jádro - to vrací záporné číslo. Číst ji po úspěšném volání nedává smysl. Viz [systémová volání](Systemova-volani). **Extent** - souvislý rozsah bloků zapsaný jedním záznamem. Nahradil v ext4 klasické nepřímé bloky a u velkých souborů výrazně zmenšil metadata. Viz [souborový systém](Souborovy-system). **FCFS** - plánování v pořadí příchodu. Jednoduché a náchylné na konvojový efekt: jedna dlouhá úloha zdrží všechny za sebou. Viz [plánování](Planovani-procesu). **fork** - systémové volání, které vytvoří kopii procesu. Vrátí nulu potomkovi a PID rodiči. Kopíruje tabulky, ne paměť. Viz [procesy](Procesy). **`fsck`** - kontrola souborového systému. Před žurnálováním musela po každém výpadku projít celý disk. Na připojený svazek se nepouští. Viz [žurnálování](Zurnalovani-a-konzistence). **`fsync`** - jediné volání, které skutečně dostane data z page cache na disk. Bez něj `write` neznamená „zapsáno". Viz [žurnálování](Zurnalovani-a-konzistence). **FUSE** - souborový systém napsaný jako běžný program v uživatelském prostoru. Pomalejší, protože každá operace je přechod do jádra a zpět, ale jediná rozumná cesta pro sshfs nebo rclone. Viz [VFS](VFS-a-montovani). **Futex** - stavební kámen zámků v Linuxu. Dokud o zámek nikdo nesoupeří, do jádra se vůbec nechodí, a proto je dnešní mutex levný. Viz [kritická sekce](Kriticka-sekce-a-zamky). **Halda** - oblast adresního prostoru, ze které přiděluje `malloc`. Roste směrem nahoru. Viz [správa paměti](Sprava-pameti). **Hypervizor** - vrstva, která provozuje virtuální stroje. Typ 1 běží přímo na železe, typ 2 nad hostitelským systémem. Viz [virtualizace](Virtualizace-a-kontejnery). **i-uzel (inode)** - datová struktura popisující soubor: práva, vlastník, časy, velikost a ukazatele na data. Neobsahuje jméno souboru. Viz [souborový systém](Souborovy-system). **initramfs** - dočasný kořenový systém v paměti, jehož jediným úkolem je najít a připojit ten skutečný. Existuje kvůli tomu, že ovladač kořenového disku leží na kořenovém disku. Viz [start systému](Start-systemu). **io_uring** - rozhraní pro asynchronní vstup a výstup s dávkovanými požadavky přes sdílené fronty, od jádra 5.1 (rok 2019). Dnešní odpověď na cenu systémových volání. Viz [vstup a výstup](Vstup-a-vystup). **IOMMU** - jednotka, která překládá adresy pro zařízení a tím zavádí ochranu paměti i pro DMA. Viz [vstup a výstup](Vstup-a-vystup). **IOPS** - počet operací za vteřinu. U plotnového disku řádově stovky, u NVMe statisíce - a proto se na nich databáze chová úplně jinak. Viz [vstup a výstup](Vstup-a-vystup). **IRQ** - žádost o přerušení od hardwaru. `cat /proc/interrupts` ukáže, kolik jich přišlo a odkud. Viz [přerušení](Preruseni-a-vyjimky). **Jmenný prostor (namespace)** - mechanismus, kterým skupina procesů vidí vlastní sadu PID, přípojných bodů, síťových rozhraní nebo uživatelů. Viz [kontejnery](Virtualizace-a-kontejnery). **Kernel panic** - jádro narazilo na stav, ze kterého nemá jak pokračovat, a zastaví se. Proti tomu pád procesu, který systému nevadí. Viz [režim jádra](Jadro-a-uzivatelsky-rezim). **Konvojový efekt** - jedna dlouhá úloha vpředu drží frontu krátkých úloh za sebou. Viz [plánování](Planovani-procesu). **KPTI** - oddělení tabulek stránek jádra a uživatelského prostoru, zavedené jako obrana proti Meltdownu v roce 2018. Zdražilo každé systémové volání. Viz [režim jádra](Jadro-a-uzivatelsky-rezim). **Kritická sekce** - úsek kódu, ve kterém smí být nejvýš jedno vlákno naráz. Viz [kritická sekce a zámky](Kriticka-sekce-a-zamky). **Kvantum** - doba, po kterou smí proces běžet, než ho plánovač odstaví. Krátké znamená hodně přepínání, dlouhé znamená špatnou odezvu. Viz [plánování](Planovani-procesu). **Livelock** - procesy se hýbou, reagují na sebe a nepostupují. Na rozdíl od uváznutí nic nestojí, jen se nic neděje. Viz [uváznutí](Uvaznuti). **Lokalita** - sklon programu sahat opakovaně na stejná místa (v čase) a na místa blízko sebe (v prostoru). Bez ní by nefungovala žádná mezipaměť. Viz [výměnné algoritmy](Vymenne-algoritmy). **LRU** - vyhoď stránku, která se nejdéle nepoužila. Nejlepší praktický odhad optimálního algoritmu, přesně se ale neimplementuje. Viz [výměnné algoritmy](Vymenne-algoritmy). **`malloc`** - knihovní alokátor, ne systémové volání. Do jádra chodí zřídka, a proto `free` paměť systému většinou nevrátí. Viz [správa paměti](Sprava-pameti). **Meltdown a Spectre** - zranitelnosti procesorů zveřejněné v roce 2018, které přes spekulativní vykonávání a mezipaměť umožnily číst paměť jádra. Viz [režim jádra](Jadro-a-uzivatelsky-rezim). **Mikrojádro** - architektura, kde v jádře zůstane jen plánování, správa paměti a předávání zpráv, a ovladače jsou běžné procesy. Viz [architektury jádra](Architektury-jadra). **MLFQ** - víceúrovňové fronty se zpětnou vazbou. Úloha, která se sama vzdá procesoru, si drží prioritu; úloha, která vyčerpá kvantum, klesne. Viz [plánování](Planovani-procesu). **MMU** - jednotka procesoru, která při každém přístupu překládá virtuální adresu na fyzickou podle tabulek stránek. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Monitor** - kritická sekce zabalená do datového typu, kde zamykání zařídí překladač. `synchronized` v Javě, `pthread_cond_t` v C. Viz [semafory a monitory](Semafory-a-monitory). **Monolitické jádro** - všechno podstatné běží v jednom adresním prostoru s plnými právy. Linux, a je to většinový model. Viz [architektury jádra](Architektury-jadra). **Mutex** - zámek s vlastníkem: odemknout ho smí jen ten, kdo ho zamkl. Tím se liší od semaforu. Viz [kritická sekce](Kriticka-sekce-a-zamky). **`nice`** - číslo od -20 do 19, kterým se posouvá váha procesu při plánování. Procesu čekajícímu na disk nepomůže. Viz [plánování](Planovani-procesu). **NMI** - nemaskovatelné přerušení, které se nedá zakázat. Používá se na watchdog a hlášení hardwarových chyb. Viz [přerušení](Preruseni-a-vyjimky). **NX bit** - příznak v tabulce stránek, který zakáže spuštění kódu z datové stránky. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **OOM killer** - když už není co odložit, jádro vybere podle skóre proces a zabije ho. Typicky ten největší, což bývá ta databáze, kterou chráníš. Viz [výměnné algoritmy](Vymenne-algoritmy). **Ovladač** - kód, který překládá mezi jednotnou sadou operací a konkrétním kusem železa. V monolitickém jádře běží s plnými právy. Viz [vstup a výstup](Vstup-a-vystup). **Page cache** - mezipaměť jádra nad obsahem souborů. Proto je druhé čtení téhož souboru okamžité a proto `free` ukazuje málo volné paměti. Viz [vstup a výstup](Vstup-a-vystup). **Paravirtualizace** - hostovaný systém ví, že běží ve virtuálu, a používá zjednodušené ovladače (virtio) místo emulace skutečného hardwaru. Viz [virtualizace](Virtualizace-a-kontejnery). **PCB** - záznam, ve kterém si jádro pamatuje všechno o procesu. V Linuxu `struct task_struct`. Viz [procesy](Procesy). **PCID** - identifikátor adresního prostoru v položkách TLB, díky kterému se při přepnutí procesu nemusí TLB zahazovat celá. Viz [přepínání kontextu](Prepinani-kontextu). **Petersonův algoritmus** - softwarové řešení vzájemného vyloučení pro dva procesy. Dnes se nepoužívá, protože bez paměťových bariér neplatí. Viz [kritická sekce](Kriticka-sekce-a-zamky). **Pevný odkaz** - další jméno téhož i-uzlu. Soubor zmizí, až když na něj neukazuje žádné jméno ani žádný otevřený deskriptor. Viz [souborový systém](Souborovy-system). **PID 1** - první proces systému. Adoptuje sirotky a nesmí skončit. Viz [start systému](Start-systemu). **Preemptivní plánování** - jádro smí procesu odebrat procesor, i když o to nežádá. Opak je kooperativní multitasking, kde stačil jeden zaseknutý program a stál celý systém. Viz [plánování](Planovani-procesu). **Prstenec (ring)** - úroveň oprávnění procesoru. Na x86-64 jsou čtyři a používají se dvě: 0 pro jádro, 3 pro programy. Viz [režim jádra](Jadro-a-uzivatelsky-rezim). **`procfs`** - virtuální souborový systém v `/proc`, kde jsou procesy adresáře a stav jádra soubory. Všechny diagnostické nástroje čtou hlavně odsud. Viz [VFS](VFS-a-montovani). **PSI** - ukazatele tlaku na procesor, paměť a vstup a výstup v `/proc/pressure/`, od jádra 4.20 (rok 2018). Poctivější než zátěž. Viz [nástroje](Nastroje-a-diagnostika). **Přepínání kontextu** - výměna běžícího procesu nebo vlákna za jiné. Registry jsou to levné, studená mezipaměť to drahé. Viz [přepínání kontextu](Prepinani-kontextu). **Přerušení** - asynchronní žádost hardwaru o pozornost, kvůli které procesor odloží, co počítá. Viz [přerušení a výjimky](Preruseni-a-vyjimky). **Přeprodávání paměti (overcommit)** - jádro slíbí víc paměti, než má. Proto `malloc` skoro nikdy nevrátí NULL a proto tě může zabít OOM killer. Viz [správa paměti](Sprava-pameti). **Rámec** - kus fyzické paměti o velikosti stránky. Stránka je virtuální, rámec fyzický. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Round Robin** - každý dostane kvantum a jde na konec fronty. Celý spor je o délku toho kvanta. Viz [plánování](Planovani-procesu). **RSS** - kolik fyzické paměti proces právě zabírá. Zavádějící, protože sdílené knihovny se započítají každému procesu zvlášť. Viz [správa paměti](Sprava-pameti). **Sdílená paměť** - nejrychlejší meziprocesová komunikace, protože data neprocházejí jádrem. Synchronizaci si musíš dodat sám. Viz [IPC](Meziprocesova-komunikace). **`seccomp`** - filtr povolených systémových volání pro proces. Stojí na něm izolace v prohlížečích i v kontejnerech. Viz [systémová volání](Systemova-volani). **Segmentace** - starší způsob dělení paměti na oblasti proměnné délky. Na x86-64 prakticky zmizela, zůstala jen v `fs` a `gs`. Viz [správa paměti](Sprava-pameti). **Semafor** - počítadlo dostupných kusů zdroje s operacemi `P` a `V`. Nemá vlastníka, a proto to není zámek. Viz [semafory a monitory](Semafory-a-monitory). **setuid** - bit, kvůli kterému program běží s právy vlastníka souboru, ne toho, kdo ho spustil. Zdroj většiny lokálních zranitelností v unixových systémech. Viz [práva](Prava-a-uzivatele). **Signál** - asynchronní oznámení procesu nesoucí jedno číslo. Není to komunikační kanál a může se ztratit. Viz [IPC](Meziprocesova-komunikace). **Sirotek** - proces, jehož rodič skončil dřív. Adoptuje ho PID 1. Viz [procesy](Procesy). **SJF** - nejkratší úloha první. Optimální průměrná doba čekání a nepoužitelné, protože délku dopředu nikdo nezná. Viz [plánování](Planovani-procesu). **SMEP a SMAP** - ochrany procesoru, které jádru zakážou spustit kód a sáhnout na data v uživatelském prostoru. Viz [režim jádra](Jadro-a-uzivatelsky-rezim). **Souběh (race condition)** - výsledek závisí na tom, jak se dvě vlákna prostřídají. Neprojeví se, dokud nezměníš časování - proto ho testy nechytí. Viz [kritická sekce](Kriticka-sekce-a-zamky). **Spinlock** - zámek, který místo uspání aktivně čeká. Má smysl jen tam, kde se nesmí spát a čeká se kratší dobu, než trvá přepnutí. Viz [kritická sekce](Kriticka-sekce-a-zamky). **Sticky bit** - na adresáři znamená, že soubor smí smazat jen jeho vlastník. Proto ti v `/tmp` nikdo nesmaže data. Viz [práva](Prava-a-uzivatele). **Stránka** - jednotka, po které se přiděluje paměť. Na x86-64 obvykle 4 KiB, velké stránky 2 MiB. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Superblok** - popis připojeného souborového systému: velikost, typ, kde jsou i-uzly. Viz [VFS](VFS-a-montovani). **Swap** - místo na disku, kam se odkládají stránky, o které se dlouho nikdo nepřihlásil. Není to náhradní RAM. Viz [výměnné algoritmy](Vymenne-algoritmy). **`swappiness`** - poměr, v jakém jádro sahá na anonymní stránky proti souborovým. **Ne** „jak moc se má swapovat". Viz [výměnné algoritmy](Vymenne-algoritmy). **Symbolický odkaz** - malý soubor obsahující cestu. Když cíl zmizí, odkaz zůstane a ukazuje do prázdna. Viz [souborový systém](Souborovy-system). **Systémové volání** - řízený vstup do jádra na jediném předem daném místě. Není to volání funkce. Viz [systémová volání](Systemova-volani). **systemd** - dnešní init v většině distribucí. Startuje služby paralelně podle závislostí a dohlíží na ně přes cgroups. Viz [start systému](Start-systemu). **Tabulka stránek** - struktura, podle které MMU překládá adresy. Na x86-64 čtyřúrovňová, volitelně pětiúrovňová. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Thrashing** - systém stráví víc času stránkováním než prací. Zvenku vypadá jako nevytížený procesor a disk na sto procentech. Viz [výměnné algoritmy](Vymenne-algoritmy). **TLB** - malá mezipaměť překladů adres. Bez ní by každý přístup do paměti znamenal několik dalších. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **`tmpfs`** - souborový systém existující jen v paměti. Soubory v něm se počítají do spotřeby paměti a při restartu zmizí. Viz [VFS](VFS-a-montovani). **UEFI** - dnešní firmware, který nahradil BIOS. Zavaděč je obyčejný soubor na FAT32 oddílu, disk má tabulku GPT. Viz [start systému](Start-systemu). **UID a GID** - čísla uživatele a skupiny. Jádro jména nezná, pracuje jen s čísly, a root je prostě UID 0. Viz [práva](Prava-a-uzivatele). **`umask`** - maska bitů, které se novým souborům odeberou. Výchozí `022` je důvod, proč má nový soubor práva `644`. Viz [práva](Prava-a-uzivatele). **Uváznutí (deadlock)** - dva a víc procesů čeká navzájem na to, co drží ten druhý. Nastane jen při současné platnosti čtyř podmínek. Viz [uváznutí](Uvaznuti). **vDSO** - kus kódu jádra namapovaný do každého procesu, díky kterému některá volání (`clock_gettime`) do jádra vůbec nedojdou. Viz [systémová volání](Systemova-volani). **VFS** - vrstva jádra, která dává všem souborovým systémům i zařízením jednu sadu operací. Důvod, proč `cat` funguje na disk, síť i `/dev/urandom`. Viz [VFS](VFS-a-montovani). **Virtuální paměť** - adresy, které vidí program, nejsou adresy v paměti; jsou to indexy do tabulek, které vede jádro a překládá hardware. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Vlákno** - běhová jednotka uvnitř procesu. Vlastní má jen zásobník, registry a `errno`, zbytek sdílí. Viz [vlákna](Vlakna). **Vyhladovění** - proces nikdy nedostane, na co čeká, protože ho pořád někdo předběhne. Viz [uváznutí](Uvaznuti). **Výjimka** - synchronní událost způsobená prováděnou instrukcí: dělení nulou, neplatná instrukce, výpadek stránky. Viz [přerušení a výjimky](Preruseni-a-vyjimky). **Výpadek stránky** - přístup na adresu, která nemá platný záznam v tabulce. Měkký se vyřídí v paměti, tvrdý vyžaduje čtení z disku a je zhruba tisíckrát dražší. Viz [virtuální paměť](Virtualni-pamet-a-strankovani). **Working set (pracovní soubor)** - množina stránek, které proces v daném okně skutečně používá. Dostane-li jich míň, začne thrashing. Viz [výměnné algoritmy](Vymenne-algoritmy). **Zámek** - obecně cokoliv, co vynutí vzájemné vyloučení. Konkrétní podoby jsou mutex, spinlock a čtenářsko-zapisovatelský zámek. Viz [kritická sekce](Kriticka-sekce-a-zamky). **Zásobník** - oblast adresního prostoru pro lokální proměnné a návratové adresy. Roste dolů, implicitně má 8 MiB, a každé vlákno má vlastní. Viz [správa paměti](Sprava-pameti). **Zombie** - proces, který skončil, ale nikdo si nepřevzal jeho návratový kód. Nedá se zabít, protože už je mrtvý. Viz [procesy](Procesy). **Žurnálování** - zápis záměru do vyhrazené oblasti dřív, než se změna provede. Chrání strukturu souborového systému, **ne obsah tvých souborů**. Viz [žurnálování](Zurnalovani-a-konzistence).