Jádro operačního systému

Jádro operačního systému (anglicky kernel, výslovnost [ˈkəːnl]) je ve výpočetní technice část operačního systému, která je při startu počítače zavedena do operační paměti, kde zůstává až do vypnutí počítače. Po zavedení do paměti je jádru předáno řízení, jádro dokončí inicializaci hardwaru a následně zajišťuje správu prostředků, umožňuje spouštění programů a poskytuje jim své služby. U pokročilých operačních systémů nikdy neztrácí kontrolu nad počítačem a po celou dobu jeho běhu koordinuje činnost všech spuštěných procesů.[1]

Jádro zprostředkovává přístup programů k hardware počítače

Anglický název kernel znamená v překladu jádro pecky, zrno nebo ztvrdlou dužinu ovoce.[2]

Charakteristika

editovat

Hlavní úkol jádra spočívá v přidělovaní paměti a času procesoru (či procesorů) programům, ovládání zařízení počítače (pomocí ovladačů) a abstrakci funkcí (aby bylo např. možné načítat soubory z pevného disku a z jednotky CD-ROM stejným příkazem).

Pro zajištění bezpečnosti operačního systému je nutné, aby procesor podporoval dva módy činnosti: omezený pro aplikace a privilegovaný (se speciálními strojovými instrukcemi) pro jádro. Privilegovanému módu se proto někdy říká kernel mód.

Podle architektury operačního systému se typicky rozlišuje mikrojádro (jádro je velice malé a zajišťuje pouze zcela základní funkce, zbytek operačního systému se nachází mimo toto jádro, v serverech s nižší úrovní oprávnění (software, např. souborové systémy), např. Symbian OS, GNU Hurd) a makrojádro (monolitické jádro, jádro je rozsáhlé, obsahuje velké množství funkcí pro všechny aspekty činnosti operačního systému včetně například souborového systému). Toto jádro je typické pro operační systém Unix. Jakýmsi kompromisem je hybridní jádro, které se snaží kombinovat výhody mikrojádra i monolitického jádra, např. Windows NT, macOS.

Základní povinnosti jádra

editovat

Základní účel jádra spočívá v ovládání prostředků počítače a umožnění ostatním programům běžet a používat je. Typicky se prostředky skládají z:

  • CPU (= centrální procesorová jednotka nebo jednotky neboli mikroprocesor). Jde o základní část počítače. Ta má za zodpovědnost vykonávání programů. Jádro má za úkol rozhodování o tom, který z programů bude přidělen CPU (na každém procesoru – na vícejádrových procesorech na každém jádře – může v jednom okamžiku běžet právě jeden program).
  • Paměti počítače. Paměť je používána k ukládání jak strojových instrukcí programů, tak i dat. Obvykle musí být v paměti přítomno obojí, aby se mohl provést program. Často chce paměť používat mnoho programů, dohromady požadujících více paměti než má počítač k dispozici. Jádro má za povinnost rozhodování, kterou část paměti může každý proces použít a rozhodnout co dělat, když je nedostatek volné paměti. (viz také virtuální paměť).
  • Jakékoliv vstupně/výstupního (I/O) zařízení přítomného v počítači, jako jsou diskové jednotky, tiskárny, displeje a další. Jádro přidělí žádostem aplikací příslušná I/O zařízení (nebo podčást ze zařízení, v případě souborů na disku nebo oken na displeji) a pečuje vhodným způsobem o užívání zařízení (typicky do bodu, kde aplikace nepotřebuje znát implementační detaily zařízení)

Jádro také obvykle poskytuje metody pro synchronizaci a komunikaci mezi procesy (nazývané meziprocesová komunikace neboli IPC).

Jádro může realizovat tyto prvky samo, nebo se spolehnout na některý z procesů, který běží, aby poskytoval prostředky ostatním procesům. Také v tomto případě musí poskytovat některé způsoby IPC, aby umožnil ostatním procesům přistupovat k tomuto zařízení.

Nakonec, jádro musí poskytnout běžícím programům metodu jak žádat o přístup k těmto prostředkům.

Správa procesů

editovat

Hlavním úkolem jádra je umožnit vykonávání aplikací a podporovat je metodami jako je abstrakce hardware. K běhu aplikace jádro typicky nastavuje adresní prostor pro aplikaci, nahrává soubory obsahující aplikační kód do paměti (třeba pomocí stránkování paměti), nastavuje zásobník pro program a poté předává řízení na pozici uvnitř programu, kde začíná jeho vykonávání.

Multitasking jádra umožňuje poskytovat uživateli iluzi současného běhu libovolného počtu procesů na počítači. Typicky počet procesů které mohou na systému běžet zároveň je rovný počtu nainstalovaných procesorů (nebo jich může mít více, pokud CPU podporuje zároveň simultánní multithreading).

V preemptivním multitaskingovém systému CPU (jádro procesoru) dává každému programu strojový čas. Děje se to tak rychle, že uživateli připadá, jako by procesy běžely zároveň. Jádro používá plánovací algoritmus k výběru, který proces poběží další a kolik času mu bude přiděleno. Vybraný algoritmus může dovolit některým procesům, aby měly vyšší prioritu než ostatní. Jádro obvykle také poskytuje procesům prostředky pro komunikaci (již zmíněné IPC), například sdílenou paměť, předávání zpráv nebo vzdálené spouštění procedur.

Ostatní systémy (většinou na méně výkonných počítačích) mohou poskytovat kooperativní multitasking, při kterém je každému procesu dovoleno běžet nepřerušeně, dokud nevyšle speciální žádost, která ohlásí jádru, že může přepnout na jiný proces. Tyto dotazy jsou známy pod jménem „yielding“ ([ˈji:ldɪŋ]) a typicky se vyskytují v souvislosti s meziprocesovou komunikací nebo čekáním na událost. Starší verze operačních systémů Windows a Mac OS používaly kooperativní multitasking, ale přešly na preemptivní, jakmile výkon počítačům, pro které byly určeny, vzrostl.

Operační systém může také podporovat multiprocessing (symetrický – SMP, nebo s neuniformním přístupem k paměti – NUMA). V tom případě různé programy a vlákna mohou běžet na různých CPU. Jádro operačního systému musí být pro takový systém navrženo: musí být reentrantní, což znamená že mohou bezpečně běžet dvě různé části jednoho kódu zároveň. To obvykle vyžaduje použití synchronizačního mechanizmu (jako je spinlock) k zajištění toho, aby žádné dva procesy nemohly měnit jedna data ve stejný čas.

Správa paměti

editovat
Podrobnější informace naleznete v článku Správa paměti.

Jádro má úplný přístup do paměti systému a musí umožnit procesům přistupovat k této paměti bezpečně jak potřebují. Často prvním krokem bývá virtuální adresování, obvykle dosažené stránkováním nebo segmentací. Virtuální adresování umožňuje jádru nahradit fyzickou adresu jinou, virtuální. Virtuální adresový prostor může být pro každý proces jiný. Část paměti, ke které přistupuje jeden proces na určité virtuální adrese, může být jiná, než paměti ke které má na stejné adrese přístup jiný proces. To umožňuje každému programu se chovat, jako by to byl jediný (odděleně od jádra) běžící a chrání aplikace před kolizí.

Na mnoha počítačových systémech může virtuální adresa odkazovat na data, která zrovna nejsou v paměti. Vrstva nepřímosti poskytovaná virtuálním adresováním umožňuje operačnímu systému používat jiná datová úložiště, jako je pevný disk, k ukládání dat, která by jinak byla v operační paměti (RAM). Díky tomu může operační systém umožnit programům používat více paměti, než má systém fyzicky k dispozici. Když program potřebuje data, která právě nejsou v paměti, jednotka pro správu paměti (obvykle součást CPU) oznámí jádru, že tam nejsou, a jádro odpoví zapsáním obsahu nečinného bloku paměti na disk (když je to nezbytné) a nahradí je daty, která si vyžádal program. Poté může program pokračovat od bodu, kde byl zastaven. Tento koncept je znám jako stránkování na žádost.

Virtuální adresování také umožňuje vytváření virtuálních částí paměti ve dvou rozdělených oblastech, jedna bývá rezervována pro jádro (prostor jádra) a ostatní pro aplikace (uživatelský prostor). Procesor nepovoluje aplikacím, aby adresovaly paměť jádra, a tedy aby aplikace poškodila běžící jádro. Toto důležité rozdělení paměťového prostoru hodně přispívá nynější koncepci současných obecných jader a je téměř univerzální ve většině systémů, ačkoliv některá jádra (např. Singularity [ˌsiŋgjuˈlæriti]) volí jiné metody.

Správa zařízení

editovat

Pro vykonávání užitečné funkce proces potřebuje přistupovat k periferním zařízením připojeným k počítači, která jsou ovládána jádrem přes ovladače zařízení. Například ke zobrazení něčeho na obrazovce musí aplikace vytvořit požadavek pro jádro, které ho předá řadiči displeje, který je poté zodpovědný za skutečné vykreslení znaků nebo pixelů.

Jádro musí udržovat seznam dostupných zařízení. Tento seznam může být znám předem (například ve vloženém systému, kde jádro je přepsáno, když se dostupný hardware změní), nastavený uživatelem (nejčastěji na starších počítačích v systémech, které nebyly navrženy pro osobní používání) nebo zjištěný operačním systémem za běhu (Plug-and-play).

Systémová volání

editovat

K vykonání užitečné práce musí být proces schopen přistupovat k službám jádra. Každé jádro to realizuje jiným způsobem, ale musí poskytnout knihovnu C nebo API, které poté vyvolávají související funkce jádra.

Metody vyvolávání funkcí jádra jsou u každého jádra různé:

  • softwarové přerušení (dostupné na většině procesorů)
  • volací brána: speciální adresa, kterou lze zavolat z aplikace, ale podpora procesoru přesměruje volání do jádra
  • speciální systémové instrukce (v řadě x86 byly přidány od Pentia Pro a AMD K6-2)
  • pomocí fronty v paměti (aplikace která vytváří velké množství požadavků, ale nepotřebuje čekat na výsledek, může přidat požadavek do speciální oblasti paměti, kterou jádro pravidelně prohlíží, aby vyřídilo shromážděné požadavky)

Různé druhy jader

editovat

Monolitické jádro

editovat
 
Monolitické jádro
Podrobnější informace naleznete v článku Monolitické jádro.

V monolitickém jádru všechny služby operačního systému běží spolu s hlavním vláknem jádra a tedy i ve stejné oblasti paměti. To umožňuje neomezený a efektivní přístup k hardware. Mnozí vývojáři zastávají názor, že monolitické systémy je jednodušší navrhnout i implementovat než ostatní řešení a jsou extrémně účinné, když jsou dobře napsané. Hlavní nevýhodou je závislost mezi systémovými komponentami – chyba v libovolném ovladači zařízení může shodit celý systém – a fakt, že velká jádra mohou být těžko udržovatelná.

Mikrojádra

editovat
 
Mikrojádra
Podrobnější informace naleznete v článku Mikrojádro.

Mikrojádro poskytuje jen základní funkčnost nezbytnou pro vykonávání služeb, většina služeb je realizována specializovanými ovladači v uživatelském prostoru. Mikrojádro definuje jednoduché abstrakce hardwaru se soupravou primitivních funkcí nebo systémových volání implementujících minimální služby OS, jako je správa paměti nebo meziprocesová komunikace (IPC). Mikrojádra jsou jednodušší než monolitická jádra, delegování úkolů na ovladače však snižuje efektivitu systému, proto musí být mikrojádro navrženo tak, aby byl tento dopad minimalizován.

Hybridní jádra

editovat
 
Hybridní jádro
Podrobnější informace naleznete v článku Hybridní jádro.

Hybridní jádro se snaží zkombinovat rychlost a jednoduchost designu monolitického jádra s bezpečnostními výhodami mikrojader. Proto jsou hybridní jádra něco mezi monolitickým jádrem a mikrojádrem. To znamená že některé služby (jako souborový systém nebo implementace síťového protokolu) běží v jádře ke zredukování režie proti mikrojádrům, ale jiné části monolitického jádra (ovladače zařízení) běží jako server v uživatelském prostoru.

Monolitická jádra vs. mikrojádra

editovat

S rostoucí velikostí jádra se objevuje množství problémů koncepce monolitického jádra. Jeden z nejvýraznějších je zvětšování „otisku v paměti“ (anglicky kernel footprint [ˈkəːnl ˈfutˌprint]), tedy množství paměti zabrané přímo jádrem. Virtuální paměť tento problém do určité míry odstraňuje, ale ne všechny počítačové architektury mají podporu virtuální paměti. Ke snížení velikosti jádra se musí vykonávat rozsáhlé úpravy k opatrnému odstranění nepotřebného kódu, které mohou být velmi složité vzhledem k nejasné vzájemné závislostí mezi částmi jádra s miliony řádků zdrojového kódu.

Některé nevýhody monolitického jádra je možné odstranit používáním modulů: ovladače zařízení stále běží v prostoru jádra se vší efektivitou, kterou to přináší, ale jsou do značné míry nezávislé a je možné nahrávat jen ty, které jsou pro daný počítač zapotřebí. Příkladem takového systému je například Linux nebo FreeBSD. Přesto, debata mezi Linusem Torvaldsem a Andrewem Tanenbaumem na téma, že Linux by měl být raději mikrojádro, se rozrostla na slavnou vášnivou diskusi.

Nanojádra

editovat

V nanojádru jsou téměř všechny služby – dokonce i ty nejzákladnější jako správce přerušení nebo časovač – řešeny ovladači zařízení. Tím má vlastní jádro ještě menší požadavky na paměť než mikrokernel.

Reference

editovat

V tomto článku byl použit překlad textu z článku Kernel (computer science) na anglické Wikipedii.

  1. HEROUT, Lukáš. Výpočetní technika I. Praha: Bankovní institut vysoká škola, a.s 92 s. Dostupné online. Kapitola 3.3. Operační systémy, s. 35. 
  2. http://slovnik.seznam.cz/?q=kernel&lang=en_cz – překlad anglického slova kernel

Externí odkazy

editovat