Mach | |
---|---|
Typ | mikrokernel |
Autor | Carnegie Mellon University (CMU) |
Zapsáno v | C a jazyk symbolických instrukcí |
První vydání | 1985 [1] |
Nejnovější verze | 3.0 |
webová stránka | cs.cmu.edu/afs/cs/projec… |
Mach je mikrokernel operačního systému vyvinutý na Carnegie Mellon University během výzkumných prací v oblasti operačních systémů, zejména distribuovaných a paralelních výpočtů. Toto je jeden z úplně prvních příkladů mikrojádra, ale stále je standardem pro další podobné projekty.
Projekt existoval od roku 1985 do roku 1994 a skončil s vydáním Mach 3.0. Několik výzkumných skupin pokračovalo ve vývoji Macha; například, University of Utah provozovala projekt Mach 4 [2] na nějakou dobu . Mach byl navržen jako náhrada za jádro BSD UNIX, takže nebylo potřeba vyvíjet nové operační prostředí. Zdá se, že další výzkumné práce na projektu Mach byly dokončeny; navzdory tomu se Mach a jeho deriváty používají v řadě komerčních operačních systémů, jako je NeXTSTEP , z nichž nejpozoruhodnější je Mac OS X , který používá jádro XNU , které obsahuje Mach 2.5. Systém správy virtuální paměti Mach byl převzat vývojáři BSD v CSRG a je používán v moderních UNIXových systémech odvozených od BSD, jako je FreeBSD. Ani Mac OS X, ani FreeBSD si nezachovaly mikrojádrovou architekturu používanou Machem, ačkoli Mac OS X nabízí meziprocesovou komunikaci a řídicí primitiva pro použití v aplikacích.
Mach je logickým rozšířením jádra Accent , vyvinutého rovněž na Carnegie Mellon University . Od roku 1991 pracuje hlavní vývojář projektu Richard Rashid ve společnosti Microsoft v divizi Microsoft Research. Další z hlavních vývojářů, Avetis Tevanyan , pracoval jako vedoucí vývoje softwaru ve společnosti NeXT , poté až do března 2006 jako vedoucí pokročilých softwarových technologií ve společnosti Apple .
Protože Mach byl navržen jako rychlá náhrada tradičního unixového jádra , zaměříme se na rozdíly mezi Machem a Unixem . Ukázalo se, že unixový koncept „všechno je soubor“ již na moderních systémech nefunguje, ale systémy jako Plan 9 od Bell Labs se stále snaží jít touto cestou. Vývojáři Mach si všimli nepružnosti tohoto přístupu a navrhli, že další vrstva virtualizace by mohla systém znovu „zprovoznit“.
Jednou z nejdůležitějších abstrakcí v Unixu jsou trubky . Co je podobné kanálům a umožní na obecnější úrovni zpřístupnit různé pohyby informací mezi programy? Takový systém může existovat pomocí meziprocesové komunikace (IPC), což je princip podobný potrubí pro organizování komunikace mezi procesy, který umožňuje přesun jakékoli informace podobné souboru mezi dvěma programy. I když různé implementace IPC existují na mnoha systémech, včetně různých Unixů, již několik let, byly navrženy pro speciální účely a nemohly poskytnout to, co od nich tvůrci Macha očekávali.
Univerzita Carnegie Mellon začala vyvíjet jádro Accent pomocí IPC založeného na sdílené paměti . Accent byl experimentální systém se spoustou funkcí, vyvíjený v průběhu vývoje podle módních trendů. Kromě toho byla užitečnost Accentu pro výzkum omezená, protože nebyl kompatibilní s Unixem a Unix byl již de facto standardem na všech výzkumných operačních systémech. Accent byl navíc pevně svázán s platformou, na které byl vyvinut. Ale na začátku 80. let se zdálo, že brzy vznikne mnoho nových platforem, z nichž mnohé budou podporovat masivní paralelismus.
Zpočátku byl vývoj Machu chápán především jako pokus o vytvoření koncepčně „čistého“, na Unixu založeného, snadno přenosného Accentu. Byly formulovány následující hlavní koncepty:
Mach je založen na konceptech IPC Accent, ale je vytvořen spíše jako unixový systém, který vám umožňuje spouštět unixové programy s malými nebo žádnými úpravami. K dosažení tohoto cíle zavedl Mach koncept „portu“ představujícího konec v obousměrném IPC. Porty byly zabezpečeny a měly oprávnění k souborům podobná oprávněním souborům Unix a používali velmi podobný model zabezpečení jako Unix . Mach navíc povolil jakémukoli programu vlastnit privilegia normálně vyhrazená pouze jádru, což umožnilo přístup k hardwaru nepřivilegované úrovni (uživatelský prostor).
V Machu, stejně jako v Unixu , se OS opět stal především sadou utilit. Stejně jako Unix má Mach koncept „ovladače“ jako prostředníka mezi samotným jádrem a hardwarem. Všechny ovladače pro stávající hardware však musí být součástí mikrojádra. Jiné architektury založené na hardwarových abstraktních vrstvách nebo exokernelech mohou oddělit ovladače od mikrojádra.
Hlavním rozdílem oproti Unixu bylo, že utility musely pracovat nikoli se soubory, ale s úlohami. Více kódu bylo přesunuto z jádra do neprivilegovaného režimu. Díky tomu se jádro výrazně zmenšilo, proto se pro Machovo jádro nazývá mikrokernel . Na rozdíl od tradičních systémů může pod Machem proces (nebo „úloha“) sestávat ze sady vláken. Mach byl prvním OS, který definoval „vlákno“ v tomto smyslu. Úkoly jádra byly zredukovány na práci s hardwarem a podpůrnými utilitami.
Existence portů a použití IPC definují většinu rozdílů mezi Machem a tradičními jádry. V Unixu se pro přístup k jádru používají „ systémová volání “ nebo „ signály “ . Program použije knihovnu k umístění dat na známé místo v paměti a poté vyvolá speciální softwarové přerušení . Když systém poprvé spustí jádro, nastaví obsluhu přerušení , takže program, který přerušení vyvolá, zavolá jádro, které prozkoumá příchozí informace a provede akci.
Mach pro tento účel používá IPC. Program požádá jádro o přístup k portu a poté použije mechanismus IPC k odeslání zpráv na port. V jiných jádrech jsou tyto zprávy zpracovávány systémovými voláními; v Machu jsou téměř všechny požadavky vyřizovány jiným programem.
Použití IPC pro předávání zpráv podporuje vlákna a spory. Vzhledem k tomu, že úlohy se skládají z více vláken a jejich zřetězený kód používá mechanismus IPC, Mach může zmrazit nebo uvolnit vlákno během zpracování zprávy. To umožňuje distribuci systému mezi více procesorů, pomocí sdílené paměti přímo ve většině zpráv Mach nebo přidáním kódu pro zkopírování zprávy do jiného procesoru, pokud je to požadováno. V tradičním jádře je to obtížné implementovat, protože systém si musí být jistý, že se různé programy nepokoušejí zapisovat do stejné paměti na různých procesorech. V Machu je to dobře definované a snadno implementovatelné; proces, který přistupuje k paměti, portům, se stává „občanem“ systému.
Systém IPC má problémy s výkonem, pro jejichž překonání bylo vyvinuto několik strategií. Konkrétně Mach používá jediný mechanismus sdílení paměti k fyzickému předávání zpráv z jednoho programu do druhého. Fyzické kopírování zprávy bude pomalé, takže Mach se dívá na jednotku správy paměti (MMU), aby rychle mapovala data z jednoho programu do druhého. Pouze pokud jsou data zapsána, budou fyzicky zkopírována, což je proces zvaný " copy -on-write" (copy-on-write; kráva).
Jádro také kontroluje integritu zpráv, aby se předešlo chybným datům, která naruší některý z programů tvořících systém. Porty byly vyvinuty na základě souborového systému Unix. To umožnilo portům používat stávající koncepty navigace v souborovém systému a také oprávnění.
Ve srovnání s tradičnějšími operačními systémy je vývoj takového systému jednodušší. Většinu systému lze spustit, odladit a sestavit pomocí stejných nástrojů jako programy pro tradiční systém. U monolitického jádra vyžaduje chyba v kódu vypnutí celého stroje a restart, zatímco v Machu pouze restart programu. Kromě toho může uživatel říci systému, aby povolil nebo zakázal funkce podle potřeby. Vzhledem k tomu, že operační systém je sbírka programů, mohou vývojáři přidávat nebo odebírat jeho části jednoduchým spuštěním nebo zastavením jako jakýkoli jiný program.
Mach byl původně umístěn jako doplňkový kód zapsaný do stávajícího jádra 4.2BSD, který umožňoval spuštění příkazu v systému dlouho předtím, než byl dokončen. Práce začaly s hotovým Accent IPC / portovým systémem a přesunuly se do dalších klíčových částí operačního systému, úloh, vláken a virtuální paměti. Tyto části byly přepsány pro volání funkcí v Machu; souběžně s tím probíhaly práce na 4.3BSD.
V roce 1986 byl systém dokončen a mohl běžet na DEC VAX . Ačkoli to mělo malý praktický význam, cíl vytvoření mikrojádra byl uveden do života. Brzy následovaly verze pro pracovní stanice IBM PC/RT a Sun Microsystems 68030 , které poskytovaly přenositelnost systému. V roce 1987 seznam zahrnoval Encore Multimax a Sequent Balance . Release 1 vyšlo letos a Release 2 příští rok.
Celou tu dobu nebylo vytvořeno slibované „skutečné“ mikrokernel. Tyto rané verze Macha zahrnovaly většinu jádra 4.3BSD, systém známý jako POE , s tím výsledkem, že jádro bylo ve skutečnosti větší než Unix, na kterém bylo založeno. Cíle přesunout vrstvu Unixu mimo jádro, kde byla snadněji vyvinuta a nahrazena, bylo dosaženo. Výkon zanechal mnoho přání a byla provedena řada architektonických změn, aby se tento problém vyřešil.
Výsledkem bylo, že Mach 3 vyšel v roce 1990 a vyvolal velký zájem. Malý tým, díky kterému se Mach postavil, jej přenesl na různé platformy, včetně složitých víceprocesorových systémů, které představovaly vážné problémy pro staromódní jádra. Zájem se aktivoval i v komerčním segmentu trhu, kde byly firmy, které by chtěly umět měnit platformy, a pokud by si přenesly OS na Mach, mohly bezbolestně přepínat platformy.
Mach získal viditelnou podporu, když Open Source Foundation oznámila, že bude stavět budoucí verzi OSF/1 na Mach 2.5 a rádi by používali Mach 3. Mach 2.5 byl také vybrán pro systémy NeXTSTEP a řadu komerčních multiprocesorů výrobci. S Mach 3 došlo k řadě pokusů o portování jiných operačních systémů na toto jádro, včetně IBM Workplace OS a několik pokusů Apple Computer vytvořit multiplatformní verzi Mac OS .
Chvíli to vypadalo, že každý OS postavený na konci 90. let bude založen na Machovi.
Mach byl původně umístěn jako náhrada za klasický Unix, az tohoto důvodu obsahuje mnoho unixových nápadů. Například Mach používá systém práv a zabezpečení založený na souborovém systému Unix. Protože jádro běží v privilegovaném režimu (kernel-mode) a je možné, že nějaký program pošle příkaz, který poškodí systém, jádro musí kontrolovat každou zprávu. Většina funkcí byla také umístěna v programech běžících v neprivilegovaném režimu (uživatelský prostor), což znamená, že je potřeba nějakým způsobem umožnit takovým programům další akce, jako je práce s hardwarem.
Některé funkce Macha byly založeny na stejných mechanismech IPC. Například Mach může snadno podporovat víceprocesorové počítače. V tradičním jádře se provádí rozsáhlá práce, aby bylo zajištěno, že programy běžící na různých procesorech a schopné volat funkce jádra ve stejnou dobu jsou opakované nebo nespojité. V Machu jsou části operačního systému izolované na serverech, které mohou běžet stejně jako jiné programy – na jakémkoli procesoru. Teoreticky by tedy jádro Mach mělo být také reentrantní, ale v praxi to není problém, protože vše, co Mach potřebuje, je směrovat požadavek na nějaký neprivilegovaný program. Mach také zahrnoval server, který mohl předávat zprávy nejen mezi programy, ale po síti. Práce v této oblasti probíhaly koncem 80. a začátkem 90. let.
Používání IPC pro většinu úloh snižuje výkon [3] . Srovnání provedená v roce 1997 ukázala, že Unix postavený na Mach 3.0 byl o 50 % pomalejší než tradiční Unix [4] .
Studie ukázaly, že výkon klesá kvůli IPC a není možné dosáhnout zrychlení rozdělením operačního systému na malé servery. Bylo učiněno mnoho pokusů zlepšit Machův výkon, ale v polovině 90. let zájem opadl.
Ve skutečnosti výzkum povahy problémů s výkonem odhalil několik zajímavých faktů: jedním je, že IPC samo o sobě není problém, problém je v tom, že k jeho podpoře je vyžadováno mapování paměti, což zvyšuje trochu režie. Většinu času (asi 80 %) tráví další úkoly v jádře – zpracování zprávy, především kontrola práv portu a integrity zprávy. Při testech na Intel 80486DX-50 trvá standardní unixové volání asi 21 mikrosekund, odpovídající volání v Machu 114 mikrosekund, z toho 18 mikrosekund souvisí s hardwarem, zbytek souvisí s různými funkcemi Machova jádra.
Když byl Mach poprvé použit v seriózním vývoji (verze 2.x), výkon byl asi o 25 % pomalejší než tradiční jádra. Tato cena nebyla problémem, protože systém se dobře portoval a běžel na více procesorech. Ve skutečnosti systém skrýval vážné problémy s výkonem až do vydání Mach 3, kdy se mnoho vývojářů pokusilo vytvořit systémy, které běží v neprivilegovaném režimu.
Když se Mach 3 pokusil přesunout OS do neprivilegovaného režimu, ztráta výkonu se stala znatelnou. Uvažujme jednoduchý příklad: úkol se učí aktuální čas. Zpráva je odeslána do jádra Mach, to způsobí přepnutí kontextu, mapování paměti, poté jádro zkontroluje zprávu a práva, pokud je vše v pořádku, zavolá se na server kontextový přepínač, server provede akce a odešle zprávu, jádro alokuje více paměti a dvakrát přepne kontext.
Ale je tu problém. Nachází se ve stránkovacím systému virtuální paměti. Tradiční monolitická jádra vědí, kde je jádro a jeho moduly a kde je paměť, kterou lze stránkovat, zatímco Mach netuší, z čeho se systém skládá. Místo toho používá jediné řešení, které přidává problémy s výkonem. Mach 3 poskytuje jednoduchý správce paměti, který přistupuje k ostatním správcům běžícím v neprivilegovaném režimu, což způsobuje, že systém provádí drahá volání IPC.
Mnoho z těchto problémů existuje v jakémkoli systému, který potřebuje běžet na víceprocesorovém stroji, a v polovině 80. let to vypadalo, že se jimi budoucí trh zaplní. Ve skutečnosti evoluce nefunguje podle očekávání. Víceprocesorové stroje byly používány v serverových aplikacích na počátku 90. let, ale poté zmizely. Mezitím se výkon CPU zvýšil o 60 % ročně, čímž se znásobila neefektivita kódu. Je špatné, že rychlost přístupu do paměti roste pouze o 7 % ročně, což znamená, že náklady na přístup do paměti se nesnížily a Machova IPC volání, která nejsou uložena v mezipaměti, jsou velmi pomalá.
Navzdory schopnostem Macha jsou takové ztráty výkonu v reálném světě nepřijatelné, takže velká část komunity vývojářů OS se domnívala, že použití IPC jako základu OS bylo zpočátku neúspěšné.
Jak jsme uvedli výše, většina výkonu Mach 3 se plýtvá na volání IPC. Koncept „multiserverového systému“ je však stále slibný, takže vyžaduje výzkum. Vývojáři musí pečlivě izolovat kód do modulů, které neprovádějí volání ze serveru na server. Například většina síťového kódu by měla být umístěna na samostatném serveru. Pod Unixem to není tak snadné, protože systém spoléhá na použití souborového systému pro všechno od sítě po zabezpečení.
Většina vývojářů zůstala u původního konceptu jediného velkého serveru, který poskytuje funkce operačního systému. Také pro usnadnění vývoje umožnily operačnímu systému běžet v privilegovaných a neprivilegovaných režimech. To jim umožňuje vyvíjet se v neprivilegovaném režimu a mít všechny funkce Machova nápadu a poté přesunout laděný server do privilegovaného režimu, aby měl lepší výkon. Několik operačních systémů bylo vyvinuto podobným způsobem, známým jako „co-location“ (co-location), toto se používá v Lites (port 4.4BSD Lite), MkLinux , OSF/1 a NeXTSTEP / OpenStep / Mac OS X. ChorusOS učinil tuto funkci součástí základního systému a umožnil serverům vstoupit do privilegovaného režimu pomocí vestavěných mechanismů.
Mach 4 se pokusil tento problém vyřešit radikální sadou vylepšení. Zejména našel programový kód, který se obvykle nezapisuje, a proto ke kopírování při zápisu dochází jen zřídka. To umožnilo nemapovat paměť mezi procesy (mapovat paměť) pro IPC, ale místo toho používat místní oblasti paměti programu. Vznikl tak koncept „shuttles“ a zvýšení výkonu, ale vývojáři dostali složitost správy stavů. Mach 4 také zahrnoval vestavěné kolokační mechanismy.
Ve všech testech IPC byl jako zdroj problému uváděn výkon, který představoval 73 % ztracených cyklů.
V polovině 90. let se práce na mikrojaderných systémech zastavily. Ačkoli trh věřil, že všechny nové systémy budou v 90. letech mikrokernely, dnes pouze jeden široce používaný systém Mac OS X používá kolokační server na vrcholu silně upraveného jádra Mach 3.
Výzkum ukázal, že problém s výkonem IPC není tak špatný, jak si lidé myslí. Pro připomenutí, jednosměrné volání na BSD trvá 20 mikrosekund, zatímco na Machu to trvá 114, z toho 11 je přepnutí kontextu identické s BSD. Kromě toho 18 používá správce paměti k zobrazení zprávy mezi neprivilegovaným runtime a privilegovaným runtime (uživatelský prostor a prostor jádra). To přidává 31 mikrosekund, což je déle než tradiční hovor, ale ne o mnoho.
Zbytek problému je kontrola oprávnění na portu zpráv. I když to vypadá velmi důležité, ve skutečnosti je to vyžadováno pouze na systémech Unix. Například systém pro jednoho uživatele běžící na mobilním telefonu nemusí tyto funkce potřebovat a toto je typ systému, kde lze Mach použít. Mach však vytváří problémy: když je paměť přesunuta do operačního systému, ostatní úlohy ji nemusí potřebovat. DOS a starší Mac OS měly jediný adresní prostor sdílený všemi procesy, takže mapování paměti je v takových systémech ztráta času.
Tyto implementace předznamenaly druhou generaci mikrojádrů , která snižuje složitost systému umístěním většiny funkcí do neprivilegovaného režimu provádění. Například jádro L4 obsahuje pouze 7 funkcí a používá 12 kilobajtů paměti, zatímco Mach 3 obsahuje asi 140 funkcí a využívá 330 kilobajtů paměti. Volání IPC do L4 na 486DX-50 trvá pouze 5 mikrosekund – rychleji než unixové volání na stejném systému a 20krát rychleji než Mach. To samozřejmě nezohledňuje skutečnost, že L4 nepracuje na základě oprávnění a zabezpečení, takže je ponechává na neprivilegovaných programech.
"Potenciální" zrychlení L4 je založeno na skutečnosti, že neprivilegované aplikace často poskytují mnoho funkcí, které jsou formálně podporovány jádrem. Můžete porovnat výkon MkLinuxu v režimu kolokace a L4 portu běžícího v neprivilegovaném režimu. L4 přidává pouze asi 5-10% režie, zatímco Mach přidává 15%, což je docela zajímavé vzhledem k dvojitým přepínačům kontextu.
Výsledkem je, že nová mikrojádra změnila průmysl jako celek a mnoho kdysi mrtvých projektů, jako je GNU Hurd, znovu získalo pozornost.
Mach a operační systémy podobné Machovi | |
---|---|