Přerušení

Přerušení (interrupt) slouží původně jako reakce na hardwarový vstup. Ve chvíli, kdy se stane nějaká událost ve světě mimo procesor, například když uživatel zmáčkne klávesu, současná úloha na procesoru se dočasně přeruší a místo ní se spustí malý program pro ošetření dané události. Ten program (kus kódu) musí rychle skončit a instrukcí procesor vrátit do původního stavu, než přerušení začalo. Když během ošetřování jednoho přerušení nastane jiné, je potřeba je postupně ošetřit obě, potažmo libovolný počet, co stihne nastat skoro zároveň. V extrémním případě tedy hrozí, že se přerušení začnou tlouct jedno přes druhé a procesoru už nezbude výkon na nic dalšího. Obvykle si proto při ošetřování přerušení jen uložíme v paměti záznam, že k nějaké události došlo, abychom ji mohli v klidu prozkoumat později.

Různé kusy připojeného hardware mají obvykle různá čísla (zvaná IRQ, interrupt request) a díky tomu je můžou ošetřovat různé programy. Kód ošetřující přerušení je potřeba nastavit hned po spuštění počítače a vždycky to tedy udělá operační systém. Můžeme se tedy spolehnout, že ať přerušení nastalo za jakýchkoliv okolností, o jeho ošetření se bude starat nějaký kód v rámci operačního systému (například ovladač dotyčného hardware) a proto mu lze s důvěrou svěřit úplnou kontrolu nad počítačem. Programy spouštěné s takovými právy se obecně označují jako kernel space.

Chytrým využitím tohoto konceptu jsou softwarová přerušení. Rozdíl je vlastně jen v tom, že přerušení nepřijde zvnějšku, ale vyvolá jej právě běžící úloha z vlastní vůle. Může tak žádat operační systém o provedení nějakých příkazů – například přerušení, na které sama nemá právo. Operační systém pak může vyvolat jiné přerušení, kterým už přímo bude ovládat hardware. Úlohám běžícím s omezenými právy (které smějí spouštět jen některá přerušení) souhrnně říkáme user space, a to i v případě, kdy je spustil administrátor a mají tedy od operačního systému dovolené dělat cokoliv.

Proces

Místo vágního pojmu „úloha“ budeme jako proces označovat úlohu, kterou řídí operační systém. Byla tedy spuštěna s právy některého uživatele, dostala vyhrazený kus paměti a pár dalších formalit.

Operační systém se snaží každému procesu předstírat, že mu patří celá paměť, jako to bývalo u stařičkých počítačů. V praxi ale samozřejmě nemůžeme dovolit, aby jeden proces sahal do zelí jinému, anebo dokonce operačnímu systému. Elegantně to za nás zařídí virtuální paměťový prostor – každý proces pracuje s jinými adresami, než na jakých data jsou skutečně ve fyzické paměti uložená, a o překlad se stará tabulka, kterou má na starosti operační systém. S pamětí se pro účely téhle tabulky zachází po blocích zvaných stránka, které obvykle měří čtyři kilobajty. Když proces nemá některou stránku namapovanou, prostě z ní nemůže číst ani do ní psát a tím je problém oprávnění vyřešený.

Jako vedlejší produkt tohohle konceptu se zavádí stránkovací soubor. Jde o virtuální paměť, která procesu sice patří, ale není namapovaná nikam do fyzické paměti. Při pokusu o práci s ní nastane přerušení – výpadek stránky – a operační systém musí zjednat nápravu. Když je taková paměť uložená ve stránkovacím souboru, načte se z disku na některé volné místo ve fyzické paměti, pak se namapuje v tabulce a proces může pokračovat. Díky tomu můžou procesy celkově využívat víc paměti, než kolik jí počítač ve skutečnosti má.

Samotnému kódu, který běží, se říká vlákno. Proces si může na požádání spustit libovolný počet vláken, jedno ale musí mít určitě. Mezi všemi běžícími vlákny automaticky přepíná operační systém tak, aby se zdálo, že běží všechna naráz. Tomuhle principu se říká multitasking a obvykle ho po hardwarové stránce zajišťuje časovač, který zhruba tisíckrát za vteřinu prostě vyhodí přerušení. Když se operační systém rozhodne, že aktuální vlákno běželo už dost dlouho, spustí místo něj jiné. Vlákno samotné moc nemá šanci si toho všimnout a má nad tímhle plánováním jen hodně omezenou kontrolu.