Co dělá operační systém
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í, správa paměti i souborový systém 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 je záznam v tabulce, proces struktura v paměti jádra, virtuální adresa číslo překládané hardwarem.
Ta iluze se platí: jedno systémové volání stojí 50-100 ns, přepnutí 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č - 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í 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ží - 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.
uname -r # verze jádra, například 6.12.x
cat /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 a jako jediné smí na hardware. Systémové knihovny (glibc) jen balí systémová volání do funkcí jazyka C. Uživatelský prostor je všechno ostatní, včetně systemd 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 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á.
cat /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.