Operační systémy Přednášky pro výuku předmětu Operační systémy Ing. Antonín Vaněk, CSc. DFJP, Univerzita Pardubice září 2003
Kapitola 4 a) Provádění OS b) Mikrojádro
Provádění OS
OS jako program až dosud jsme mlčky předpokládali, že procesy jsou uživatelské jestliže je OS program, můžeme také běžící OS považovat za process? pokud ano, jak je tento proces řízen? odpověď závisí na koncepci OS
Provádění OS (1) bezprocesové (monolitické) jádro software OS má podobu jednolitého programu kód OS se provádí jako samostatná entita v privilegovaném modu procesoru procesově orientované jádro software OS má formu procesů když proces provádí kód OS, běží procesor v privilegovaném modu
Provádění OS (2) mikrojádro většina funkcí jádra je realizována jako samostatné procesy činnost těchto procesů aktivuje a koordinuje mikrojádro, které obsahuje pouze několik základních funkcí
zastaralá koncepce koncept procesů se vztahuje pouze na programy uživatele kód OS se provádí jako samostatná entita v privilegovaném modu procesoru kód OS se nikdy neprovádí v procesu Bezprocesové jádro
OS prováděný v procesech (1) téměř veškerý kód OS se provádí jako uživatelské procesy při přerušení a systémovém volání procesor přejde do privilegovaného modu a provede OS proceduru v kontextu procesu uživatele (tzv. mode switch) na funkce přepínání procesů (mimo procesy) řízení přechází pouze pokud to je nezbytné
kód a data OS jsou ve sdíleném paměťovém prostoru a jsou sdíleny všemi uživatelskými procesy pro volání procedur v režimu jádra a návraty z nich se používá samostatný zásobník v rámci uživatelského procesu se provádějí jak programy uživatele, tak programy OS OS prováděný v procesech (2) Shared Address Space Kernel Stack
Procesově orientovaný OS OS je tvořen množinou systémových procesů hlavní funkce jádra jsou samostatnými procesy malé množství kódu OS (funkce přepínání procesů) (se provádí mimo procesy velmi vhodné řešení pro multiprocesorové systémy
Stavy procesu v UNIXu SVR4 podobné dříve popsanému 7-stavovému modelu 2 stavy běhu: User a Kernel přechody do ostatních stavů (blocked, ready) zajišťuje vždy jádro stavy Sleeping (v paměti a odložený) odpovídají stavům BLOKOVANÝ u 7-stavového modelu stav Preempted se liší od stavu Ready, ale oba používají jednu společnou frontu k přechodu do stavu Preempted může dojít pouze když proces má přejít z modu jádra do uživatelského modu
Stavový diagram procesů OS UNIX return to user return preempt reschedule process sleep exit interrupt, interrupt return system call, interrupt wakeup swap out wakeup swap in swap out enough memory not enough memory (swapping system only) fork Zombie Kernel Running User Running Preempted Asleep in Memory Ready to Run in Memory Created Sleep, Swapped Ready to Run Swapped
Vytváření procesu v UNIXu každý proces (kromě procesu 0) se vytváří systémovou funkcí fork() fork() vytvoří položku v tabulce procesů a novému procesu-potomkovi přidělí unikátní identifikační číslo PID (Process IDentification) potomek obdrží kopii obrazu (image) rodičovského procesu fork() vrátí PID potomka rodičovskému procesu a nulu potomkovi po provedení funkce fork() dokonce provádějí oba procesy (rodič i potomek) tentýž kód!
Systémové procesy UNIXu proces 0 vznikne nestandardně při spouštění systému (boot) po vytvoření procesu 1 (proces INIT) převezme proces 0 funkci odkládání (swapper) proces 1 provede inicializaci dle /etc/inittab a provede rc-skripty (konfigurace služeb) Když se u terminálu přihlásí uživatel, proces 1 pro něj vytvoří nový proces (obvykle login shell), který pak je rodičem všech procesů tohoto uživatele
Obraz procesu v UNIXu (1) User-level context Process Text (tj. kód) tuto oblast lze pouze číst (read-only) Process Data User Stack zásobník pro volání a návraty v uživatelském modu Shared memory pro komunikaci procesů (IPC) existuje pouze jedna fyzická kopie, ale díky možnostem virtuální paměti má každý proces tuto kopii dostupnou ve svém adresním prostoru Register context
System-level context Process table entry aktuální položka týkající se tohoto procesu v systémem udržované tabulce procesů stav procesu, UID, PID, PPID, priorita, očekávané události, signály, ukazatele do paměti na kód (text), data... U area (uživatelská oblast) další informace o procesu potřebné pro jádro když provádí kontext tohoto procesu efektivní UID, časovače, meze, používané soubory... Kernel stack zásobník pro volání a návraty v modu jádra Per Process Region Table tabulka pro řízení paměti (Memory Manager) Obraz procesu v UNIXu (2)
Mikrojádro
Typické funkce jádra OS (1) správa procesů (Process Management) vytváření a ukončování procesů plánování a spouštění procesů přepínání procesů synchronizace procesů podpora komunikace procesů udržování řídících bloků procesů
Typické funkce jádra OS (2) správa paměti (Memory Management) přidělování adresového prostoru procesům odkládání procesů na disk (Swapping) správa paměťových stránek a segmentů správa I/O (I/O Management) ovládání vyrovnávacích paměti (Buffer Management) přidělování I/O kanálů a zařízení procesům
podpůrné funkce obsluha přerušení monitorování, dohled, účtování.... ostatní funkce OS je vhodnější zajistit samostatnými programy, spolupracujícími s jádrem Typické funkce jádra OS (3)
Mikrojádro malé jádro OS, obsahující pouze základní funkce OS které nelze přesunout mezi uživatelské procesy u kterých by takový přesun výrazně zhoršil vlastnosti OS ostatní funkce OS jsou řešeny jako externí subsystémy ovladače zařízení (device drivers) souborové systémy (file systems) správa virtuální paměti (virtual memory manager) bezpečnostní služby (security services) další služby...
Výhody použití mikrojádra jednotné rozhraní pro předávání požadavků procesem všechny služby jsou poskytovány formou přenosu zpráv (message passing) rozšiřitelnost lze snadno přidávat nové služby pružnost lze snadno měnit stávající vlastnosti přenositelnost změny potřebné k přenesení systému na jinou platformu je nutné provést pouze v mikrojádře a ovladačích, zbytek OS je na platformě nezávislý
Výhody použití mikrojádra spolehlivost modulární stavba systému usnadňuje vývoj a testování mikrojádro je menší a jednodušší než monolitický OS, takže ho lze mnohem snadněji otestovat stavebnicovost uživatel může zakoupit a použít pouze subsystémy, které potřebuje výhodné zejména u vestavěných systémů snadná realizace distribuovaných systémů zprávy mezi procesy lze předávat nejen lokálně, ale také po síti vhodná koncepce pro objektově orientovaný OS komponenty systému jsou objekty s jasně definovaným rozhraním
Funkce mikrojádra ovládání I/O a přerušení časovač, ovladače, přepínání kontextu... primitivní správa paměti mapování stránek virtuální paměti na stránky fyzické paměti komunikace procesů IPC (Inter-process Communication)
Příklad: systém QNX mikrojádro message passing first-level interrupt handling process scheduling low-level network communication systémové procesy Process Manager Filesystem Manager Device Manager Network Manager Process Manager Device Manager Filesystem Manager Network Manager MK
IPC systému QNX primitivní funkce IPC, poskytované mikrojádrem Send (pid, smsg, rmsg, smsg_len, rmsg_len) pid = ID procesu, kterému je zpráva určena smsg, smsg_len = umístění a délka bufferu se zprávou rmsg, rmsg_len = umístění a délka bufferu pro odpověď pid = Receive (0, msg, msg_len) pid (hodnota kterou vrací funkce) = ID procesu, který odeslal zprávu sel = 0 specifikuje, že se má přijmout zpráva od libovolného procesu msg, msg_len = umístění a délka bufferu s přijatou zprávou Reply (pid, reply, reply_len) pid = ID procesu, kterému je odpověď určena reply, reply_len = umístění a délka bufferu s odpovědí funkce Receive umožňuje synchronizaci procesů čeká na příchod zprávy