Kernel

Z Multimediaexpo.cz

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

Kernel je v informatice označení pro jádro operačního systému. Jádro je zavedeno do operační paměti při startu (bootování) počítače a je mu předáno řízení. U pokročilých operačních systémů jádro nikdy neztrácí kontrolu nad počítačem a po celou dobu jeho běhu koordinuje činnost ostatních běžících procesů. Označení kernel pochází z angličtiny, kde označuje jádro pecky, zrno nebo ztvrdlou dužinu ovoce.[1] 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 mikrokernel (mikrojádro, jádro je velice jednoduché a obsahuje pouze zcela základní funkce, zbytek operačního systému je mimo toto jádro v aplikacích) a makrokernel (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). Jakýmsi kompromisem je modulární jádro, které je fakticky makrojádrem (celé běží v privilegovaném režimu) ovšem jeho značná část je tvořena takzvanými moduly, které je možné přidávat a odebírat za běhu systému.

Obsah

Základní povinnosti jádra

Základní účel jádra je 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 neboli procesor). To je základní část počítače. Ta má za zodpovědnost běh nebo vykonávání programů. Jádro má povinnost rozhodování o tom, který z programů bude přidělen procesoru nebo procesorům (na každém procesoru - v modernějších procesorech na každém jádře - může v jednom okamžiku běžet právě jeden program).
  • Paměť 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í (I/O) zařízení přítomné 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 procesu

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 CPU (nicméně to nemusí tak být, když procesor podporuje zároveň simultánní multithreading). V preemptivním multitaskingovém systému jádro dává každému programu procesor na určitý časový úsek a přepíná z procesu na proces tak rychle, že to 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í. Kernel 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é pouštění procedur. Ostatní systémy (většinou na méně výkonných počítačích) můžou poskytovat kooperativní multitasking, kde každému procesu je 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“ 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 používaly kooperativní multitasking, ale přešly na preemptivního jakmile výkon počítačům, pro které byly určeny, vzrostl. Operační systém může také podporovat multiprocesing (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 procesorech. Jádro 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í že žádné dva procesy nemohou měnit jedny data ve stejný čas.

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 hlavní 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 procesoru) 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 jáder a je téměř univerzální ve většině systémů, ačkoliv některá jádra (například Singularity) volí jiné metody.

Správa zařízení

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 (to je obvykle zvané Plug-and-play).

Systémová volání

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 jinak, 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 Pentium 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

Monolitické jádro

Monolitické jádro
Hlavní článek: 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

Mikrojádra
Hlavní článek: Mikrojádro

U mikrojádra samotné jádro poskytuje jen základní funkčnost nezbytnou pro vykonávání služeb. Přístupem mikrojádra je definování jednoduché abstrakce hardware 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 multitasking. Ostatní služby včetně těch, které běžně poskytuje jádro, jsou realizovány v uživatelském prostoru. Mikrojádra jsou jednodušší než monolitická jádra, avšak systémová volání způsobují řetězové změny kontextu, které mohou ve velkém množství zvýšit režii systému tak, že budou pomalejší, než jednoduchá volání u monolitických jader.

Hybridní jádra

Hybridní jádro
Hlavní článek: Hybridní jádro

Hybridní jádro se snaží zkombinovat rychlost a jednoduchost designu monolitického jádra s bezpečnostními výhodami mikrojader. Hybridní jádra jsou 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) v jádře ke zredukování režie proti mikrojádrům, ale jiné části monolitického kernelu (ovladače zařízení) běží jako server v uživatelském prostoru.

Monolitické jádra vs mikrojádra

S rostoucí velikostí jádra se objevuje množství problémů koncepce monolotického jádra. Jeden z nejvýraznějších je zvětšování „paměťového otisku“, 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 Linux. Přesto, debata mezi Linusem Torvaldsem a Andrewem Tanenbaumem na téma, že Linux by měl být raději mikrokernel, se rozrostla na slavnou flame war.

Nano jádra

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

  1. http://slovnik.seznam.cz/?q=kernel&lang=en_cz – překlad anglického slova kernel

Externí odkazy