markdown
Co-dela-operacni-system.md
markdown
# Co dělá operační systém, čili proč to není ta plocha s ikonkami Zeptej se pěti lidí, co je operační systém, a čtyři popíšou plochu, ikonky a nabídku Start. Pátý řekne „Windows", což je aspoň správný druh odpovědi. Zdroj zmatku číslo jedna: do jednoho slova se slily tři různé věci - jádro, distribuce a desktop. Server s Debianem 13 nemá plochu ani ikonky a operační systém má. Tahle stránka říká, co operační systém dělá a proč musí existovat. Neřeší, jak je to udělané uvnitř: [plánování](Planovani-procesu), [správa paměti](Sprava-pameti) i [souborový systém](Souborovy-system) mají vlastní stránky. Nepředpokládá nic kromě toho, že jsi někdy pustil program. ## Dvě role, které si navzájem odporují Tohle je nejdůležitější věc na celé stránce: **operační systém plní dvě role zároveň a ty dvě role si odporují.** Zaprvé je to **rozšířený stroj**. Hardware umí přečíst sektor podle čísla a vykonat instrukci, nic víc. Systém nad tím postaví použitelné rozhraní: soubor místo sektorů, proces místo procesoru, virtuální paměť místo RAM, soket místo ethernetových rámců. Zadruhé je to **správce zdrojů**. Programů je víc než procesorů, takže někdo musí rozhodnout, kdo dostane co a na jak dlouho - a odebrat to i tomu, kdo se toho vzdát nechce. **Rozšířený stroj přitom každému programu lže.** Namlouvá mu, že má počítač sám pro sebe; arbitr ví, že nemá, a dá mu to najevo: sebere mu procesor uprostřed výpočtu nebo odloží jeho paměť na disk. Skoro každé překvapivé chování systému vzniká na téhle hranici. Když si zapamatuješ tyhle dvě role, zbytek wiki se z nich dá odvodit. ## Co abstrahuje a čím to nahrazuje Vlevo je stroj, vpravo to, co z něj vidí program. | Surový hardware | Co z toho vidíš ||---|---|| Sektory na `/dev/nvme0n1`, adresované číslem | Soubor se jménem, právy a pozicí čtení || Jedna sada registrů a jeden čítač instrukcí na jádro | Proces, který má procesor sám pro sebe || 16 GB fyzické RAM sdílené vším, co běží | Souvislý adresní prostor, 48 bitů, jen tvůj || Ethernetové rámce, řadič, DMA a přerušení | Soket, do kterého píšeš bajty | Pravý sloupec neexistuje. [Soubor](Souborovy-system) je záznam v tabulce, [proces](Procesy) struktura v paměti jádra, [virtuální adresa](Virtualni-pamet-a-strankovani) číslo překládané hardwarem. Ta iluze se platí: jedno [systémové volání](Systemova-volani) stojí 50-100 ns, [přepnutí kontextu](Prepinani-kontextu) jednotky mikrosekund. ## Správa zdrojů v čase a v prostoru **V čase se dělí procesor.** Osm jader a dvě stě procesů znamená, že naráz běží nejvýš osm. Kdo poběží dál, rozhoduje [plánovač](Planovani-procesu) - v jádře 6.12 je to EEVDF, který nahradil CFS v jádře 6.6 (2023). **Vynutitelné je to díky časovači.** [Přerušení](Preruseni-a-vyjimky) vrátí řízení systému bez ohledu na program. **V prostoru se dělí paměť a disk.** Každý proces dostane vlastní adresní prostor po stránkách 4 KiB a nemá jak sáhnout do cizího. Když paměť dojde, jádro nejméně užitečné stránky [odloží](Vymenne-algoritmy) - proces si toho nevšimne, jen mu jedno čtení místo 80 ns trvá 100 µs. ## Od dávek k dnešku **Dávkové zpracování, padesátá léta.** Programy se odevzdávaly na děrných štítcích a zpracovávaly jeden po druhém. Za první operační systém se obvykle považuje GM-NAA I/O z roku 1956 pro IBM 704; uměl jedinou věc - spustit další úlohu. **Multiprogramování, šedesátá léta.** Do paměti se vešlo víc úloh naráz; když jedna čekala na disk, procesor počítal jinou. Manchesterský Atlas měl v roce 1962 stránkování, IBM OS/360 se dodával od roku 1966. **Sdílení času, od roku 1961.** CTSS na MIT ukázal, že se procesor dá mezi terminály střídat tak rychle, že každý má dojem vlastního stroje. Následoval Multics (1965) a Unix (1969), od kterého vede přímá čára k dnešku. ## Multitasking, který multitasking nebyl **V devadesátkách znamenalo slovo „multitasking" něco jiného než dnes.** Windows 3.1 (1992) a po nich řada 9x plánovaly šestnáctibitové programy kooperativně: systém procesor neodebíral, čekalo se, až si program řekne o další zprávu. **Program, který si o zprávu přestal říkat, položil celý systém.** Nekonečná smyčka v jediné aplikaci znamenala zamrzlou plochu a restart. Windows 95 už 32bitové programy plánovalo preemptivně, ale starý šestnáctibitový kód uměl zablokovat zbytek systému; NT (1993) a Linux (1991) preemptovaly od začátku. ## Co operační systém není **Shell není operační systém.** `bash` je obyčejný program pod UID 1000 bez zvláštních práv. Vyměníš ho za `zsh` a systém si toho nevšimne. **Grafické prostředí není operační systém.** GNOME i KDE jsou programy v uživatelském prostoru; server s `nginx` žádné nemá. **Distribuce není operační systém.** Debian 13 a Ubuntu stojí na stejném jádře; liší se balíčky a verzemi knihoven. ```bashuname -r # verze jádra, například 6.12.xcat /etc/os-release # verze distribuce - úplně jiné číslo``` **Vrstvy jsou tři a vyplatí se je držet od sebe.** Jádro běží v [privilegovaném režimu](Jadro-a-uzivatelsky-rezim) a jako jediné smí na hardware. Systémové knihovny (glibc) jen balí [systémová volání](Systemova-volani) do funkcí jazyka C. Uživatelský prostor je všechno ostatní, včetně [systemd](Start-systemu) i tvé plochy. ## Obecný, real-time a vestavěný | Typ | Kritérium úspěchu | Kde ho potkáš ||---|---|---|| Obecný | průměrná odezva, propustnost, spravedlnost | Linux, Windows, macOS || Real-time | **zaručený horní odhad doby odezvy** | řízení motoru, airbag, obráběcí stroj || Vestavěný | paměťová stopa, spotřeba, běh bez obsluhy | router, pračka, čtečka knih | **U real-time systému nerozhoduje průměr, ale nejhorší případ.** Systém, který odpoví průměrně za 200 µs a jednou za den za 40 ms, je pro airbag nepoužitelný. Linux se do téhle role dostane s volbou PREEMPT_RT, od jádra 6.12 (2024) součástí hlavní větve. **Mars Pathfinder, 1997.** Sonda po přistání opakovaně restartovala: nízkoprioritní meteorologická úloha držela zámek, na který čekala vysokoprioritní správa sběrnice, zatímco procesor dostávala středněprioritní komunikace. Watchdog to bral jako zatuhnutí a každý restart stál část dat; NASA to opravila na dálku zapnutím dědění priorit. Poučení: **[inverze priorit](Uvaznuti) není kuriozita, v real-time systému z ní je výpadek.** ## Kde ta abstrakce prosakuje **Soubor, který zmizí uprostřed čtení.** Na síťovém disku může `open()` uspět a následné `read()` skončit chybou `ESTALE`, tedy „Stale file handle", protože soubor na serveru mezitím přestal existovat. Lokálně se to nestane: odkaz zmizí, ale data drží, dokud ho má někdo otevřený. **`malloc`, který nikdy nevrátí NULL.** Linux ve výchozím nastavení paměť přeprodává, tedy slibuje víc, než má. ```bashcat /proc/sys/vm/overcommit_memory # 0 = heuristika, jádro přeprodává``` Alokace uspěje, i když tolik paměti neexistuje. Problém přijde, až na stránku sáhneš a žádná volná není: zasáhne OOM killer a zabije proces - často jiný. Kontrola návratové hodnoty `malloc` je na Linuxu z velké části obřad. ## Shrnutí v jedné větě Operační systém je lhář, který každému programu namluví, že je na stroji sám, a zároveň arbitr, který ví, že sám není - a zbytek plyne z toho, že obě role dělá týž kus kódu.