-
Notifications
You must be signed in to change notification settings - Fork 0
Slovnicek
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í.
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.
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.
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.
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ěť.
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.
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í.
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.
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.
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.
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í.
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.
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.
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ěť.
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.
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.
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.
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ěť.
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.
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.
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í.
epoll - způsob, jak jedno vlákno hlídá tisíce deskriptorů. Nahradil select s limitem 1024. Viz vstup a výstup.
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í.
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.
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í.
fork - systémové volání, které vytvoří kopii procesu. Vrátí nulu potomkovi a PID rodiči. Kopíruje tabulky, ne paměť. Viz 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í.
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í.
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.
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.
Halda - oblast adresního prostoru, ze které přiděluje malloc. Roste směrem nahoru. Viz správa paměti.
Hypervizor - vrstva, která provozuje virtuální stroje. Typ 1 běží přímo na železe, typ 2 nad hostitelským systémem. Viz virtualizace.
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.
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.
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.
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.
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.
IRQ - žádost o přerušení od hardwaru. cat /proc/interrupts ukáže, kolik jich přišlo a odkud. Viz přerušení.
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.
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.
Konvojový efekt - jedna dlouhá úloha vpředu drží frontu krátkých úloh za sebou. Viz plánování.
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.
Kritická sekce - úsek kódu, ve kterém smí být nejvýš jedno vlákno naráz. Viz kritická sekce a zámky.
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í.
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í.
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.
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.
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.
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.
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.
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í.
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ěť.
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.
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.
Mutex - zámek s vlastníkem: odemknout ho smí jen ten, kdo ho zamkl. Tím se liší od semaforu. Viz kritická sekce.
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í.
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í.
NX bit - příznak v tabulce stránek, který zakáže spuštění kódu z datové stránky. Viz virtuální paměť.
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.
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.
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.
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.
PCB - záznam, ve kterém si jádro pamatuje všechno o procesu. V Linuxu struct task_struct. Viz 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.
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.
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.
PID 1 - první proces systému. Adoptuje sirotky a nesmí skončit. Viz start systému.
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í.
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.
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.
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.
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.
Přerušení - asynchronní žádost hardwaru o pozornost, kvůli které procesor odloží, co počítá. Viz přerušení a výjimky.
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.
Rámec - kus fyzické paměti o velikosti stránky. Stránka je virtuální, rámec fyzický. Viz virtuální paměť.
Round Robin - každý dostane kvantum a jde na konec fronty. Celý spor je o délku toho kvanta. Viz plánování.
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.
Sdílená paměť - nejrychlejší meziprocesová komunikace, protože data neprocházejí jádrem. Synchronizaci si musíš dodat sám. Viz IPC.
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í.
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.
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.
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.
Signál - asynchronní oznámení procesu nesoucí jedno číslo. Není to komunikační kanál a může se ztratit. Viz IPC.
Sirotek - proces, jehož rodič skončil dřív. Adoptuje ho PID 1. Viz 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í.
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.
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.
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.
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.
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ěť.
Superblok - popis připojeného souborového systému: velikost, typ, kde jsou i-uzly. Viz VFS.
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.
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.
Symbolický odkaz - malý soubor obsahující cestu. Když cíl zmizí, odkaz zůstane a ukazuje do prázdna. Viz souborový systém.
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í.
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.
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ěť.
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.
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ěť.
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.
UEFI - dnešní firmware, který nahradil BIOS. Zavaděč je obyčejný soubor na FAT32 oddílu, disk má tabulku GPT. Viz start systému.
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.
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.
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í.
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í.
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.
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ěť.
Vlákno - běhová jednotka uvnitř procesu. Vlastní má jen zásobník, registry a errno, zbytek sdílí. Viz vlákna.
Vyhladovění - proces nikdy nedostane, na co čeká, protože ho pořád někdo předběhne. Viz uváznutí.
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.
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ěť.
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.
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.
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.
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.
Ž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í.
Našel jsi chybu nebo něco chybí? Založ issue nebo pošli pull request.
Základy
- Co dělá operační systém
- Režim jádra a uživatelský režim
- Systémová volání
- Přerušení a výjimky
- Architektury jádra
Procesy
Souběh
Paměť
Soubory a zařízení
Systém v provozu
Praxe