Különleges kernelarchitektúrák: nanokernel, exokernel, multikernel és unikernel – PingvinBázis blog 5.

blog

Az elmúlt évtizedekben a hagyományos kernelfajták mellett több olyan, kifejezetten kísérleti célú kernelarchitektúra is született, amelyek teljesen más szemszögből közelítik meg az operációs rendszer magját. Ezek a megoldások abban különböznek egymástól, hogy mit tartanak „kernelfeladatnak”, és mennyi mindent hagynak a rendszer többi részére: van, amelyik a végletekig lecsupaszítja a magot, más pedig épp a feladatok újrafelosztásával próbál rugalmasabbá vagy skálázhatóbbá tenni mindent. A PingvinBázis blog 5. száma ezekre a nem mindennapi kernelmodellekre fókuszál. Minden fejezetben végigvesszük az adott koncepció alapötletét és filozófiáját, a történeti hátterét, a gyakorlati példáit, és azt is, hogy technológiailag miért érdekes vagy fontos. Ez a bejegyzés kifejezetten a kutatási célú kernel típusokra koncentrál; ha a klasszikus kernelarchitektúrákról is szeretnél átfogó képet, nézd meg a cikkel együtt megjelenő videónkat a YouTube-on.

Különleges kernelarchitektúrák: nanokernel, exokernel, multikernel és unikernel – PingvinBázis blog 5.

Nanokernel: a mikrokernel extrém változata

Alapötlet és működés

A nanokernel kifejezés egy rendkívül kis méretű, minimalista rendszermagot jelöl. A szakértők gyakran úgy fogalmaznak, hogy a nanokernel lényegében egy lecsupaszított mikrokernel. Míg a mikrokernel is csak a legszükségesebb funkciókat hagyja a kernelben, a nanokernel ezt a minimalizmust még tovább viszi. A nanokernel nem valósít meg magas szintű hardverabsztrakciót, csupán a legalapvetőbb feladatokat látja el, például kezeli a CPU módváltásait és az interruptokat, biztosítja a memóriavédelem legalapvetőbb mechanizmusait. Minden más funkciót – az eszközmeghajtók működésétől a fájlrendszerig – külső komponensek (akár user módban futó folyamatok) valósítanak meg.

A nanokernel architektúra felépítése (Forrás)

Ez azt is jelenti, hogy a nanokernelhez minden egyes hardver-erőforráshoz külön meghajtó vagy szolgáltatás szükséges, hiszen a kernel maga nem biztosít általános, hardverfüggetlen réteget. Például egy nanokernel rendszerben külön modul kezeli az időzítőt, a megszakításvezérlőt, a memóriakezelő egységet, ahelyett, hogy ezekhez egységes interfészt adna a kernel. A nanokernel tehát a lehető legkisebb mag, amely még éppen működőképes operációs rendszer gerincet alkot.

A nanokernel tervezési filozófiája az operációs rendszerek radikális decentralizációjára épít: a rendszermag itt nem egy központi irányító egység, hanem csupán a hardverrel való érintkezés legvékonyabb technikai rétege. Ebben a modellben a kernel teljesen mentes a hagyományos vezérlési logikától és algoritmusoktól, így hiányzik belőle a saját ütemező, az IPC-réteg vagy a belső memóriamenedzselő infrastruktúra is. A hardverrel való kommunikáció szigorúan technikai szinten marad: a kernel nem értelmezi a megszakítások célját és nem hoz döntéseket az erőforrások elosztásáról, csupán közvetítő szerepet tölt be.

Ez a felépítés megfordítja a klasszikus operációs rendszerek működési logikáját: ahelyett, hogy a mag biztosítana keretrendszert a folyamatoknak, a felhasználói módban futó, külső komponensek maguk határozzák meg együttműködésük szabályait és protokolljait. A nanokernelben a hagyományos értelemben vett rendszerhívások helyét könyvtári rétegek és közvetlen szolgáltatásközi kommunikáció veszi át, így a rendszer integritását nem egy központi algoritmus, hanem az egyes elemek saját izolációs szabályai garantálják. Mivel a mag szinte alig tárol változó belső állapotot, a kódja statikusan rendkívül stabil és formális matematikai módszerekkel is igazolható. Ez a „high-assurance” jelleg teszi a nanokernelt a legbiztonságosabb választássá az olyan speciális architektúrák számára, ahol a megbízhatóság minden más szempontot megelőz.

Történeti háttér és példák

A nanokernel fogalma a mikrokerneles kutatások hajnalán, a ’80-as években született meg. A „nano” vagy „piko” jelzőkkel azokat a kísérleti rendszereket illették, amelyek mérete és funkcionalitása még a mikrokernelt is alulmúlta. Az egyik úttörő az IBM mainframe-eken futó KeyKOS volt: a mindössze 20 ezer sornyi kódból álló mag alig 100 kilobájt memóriát igényelt. Különlegessége a képességalapú (capability-based) védelem és az állapotmentes felépítés volt, ahol az operatív memória és a háttértár egységes egészet alkotott. A KeyKOS utódai (EROS, Coyotos) bebizonyították: a minimális kódméret nemcsak stabilitást, hanem formálisan is igazolható, extrém biztonsági szintet garantál.

A nanokernel filozófia a mainstream világban is felbukkant, például az Apple klasszikus Mac OS 8 és 9 rendszereiben. Itt egy apró nanokernel réteg felelt a PowerPC hardver közvetlen kezeléséért, miközben a régi, 68k-alapú rendszer egy emulált környezetben futott felette. Bár a későbbi verziók már üzenetküldéssel és védett memóriával bővültek – így inkább hasonlítottak egy mikrokernelre –, az Apple példája jól mutatta, hogyan használható egy vékony szoftverréteg a hardverarchitektúrák közötti átmenet biztosítására.

A koncepció a modern kísérleti projektekben is jelen van, mint például a Java nyelven írt JNode. Ebben a rendszerben egy assemblerben írt, parányi nanokernel végzi el a kritikus x86-os alapbeállításokat, majd azonnal átadja a vezérlést a Java virtuális gépnek. Innentől kezdve minden – a hálózattól a fájlrendszerig – a felhasználói térben, Java-ban valósul meg. Ez a megoldás remekül szemlélteti, hogy a nanokernel csupán egy vékony absztrakciós hidat képez a nyers hardver és a magas szintű programozási környezetek között.

Exokernel: absztrakciók nélküli kernel

Alapötlet és működés

Az exokernel architektúra radikálisan más irányból közelíti meg a kernel kérdését, mint a mikro- vagy nanokernel. Az exokernel alapeszméje az, hogy az operációs rendszer magja ne nyújtson magas szintű absztrakciókat a hardver erőforrásaihoz. Míg egy hagyományos kernel elrejti a nyers hardvert az alkalmazások elől – fájlrendszereket, virtuális memória absztrakciót, folyamatokat, socketeket kínál az egyszerű használathoz –, addig az exokernel ezzel szemben a lehető legkevesebbet “leplez el” a hardverből.

exokernel
Az exokernel felépítése (Forrás: Wikipedia)

Az exokernel a nevében az “exo-” (külső) előtagot viseli, utalva arra, hogy a magas szintű operációs rendszer funkciók kvázi a kernel külső rétegeiben, user-space-ben valósulnak meg, nem magában a kernelben.

Egy exokernel típusú rendszermag mindössze két fő feladatot lát el: védelmet és multiplexelést. Vagyis az exokernel gondoskodik arról, hogy a különböző (egymásban nem megbízó) programok biztonságosan megoszthassák a hardver erőforrásait – ne férjenek hozzá egymás memóriájához, ne lépjék túl a számukra kiosztott erőforrás-kontingenseket –, illetve hogy párhuzamosan futhassanak, megosztva a CPU időt, perifériákat. Amit az exokernel nem vállal magára, az a magas szintű absztrakciók biztosítása: nem alakítja át a hardvert egységes, kényelmesen használható erőforrás-modellekké.

Például egy hagyományos kernelben, ha egy alkalmazás fájlt akar olvasni, akkor a kernel ad egy fájlrendszer absztrakciót (fájl-descriptor, read/write hívások stb.), a háttérben pedig kezelheti a lemezmeghajtót, cache-li az adatokat, és így tovább. Ezzel szemben egy exokernel nem biztosít feltétlenül fájlrendszer API-t – helyette megengedi, hogy az alkalmazás (vagy pontosabban egy könyvtári operációs rendszer, lásd később) közvetlenül kérjen blokkhozzáférést a lemezhez.

A kernel csak annyit tesz, hogy ellenőrzi: a kért lemezblokk nincs-e már valaki más által lefoglalva, és hogy az adott folyamat jogosult-e hozzáférni – ha igen, engedélyezi, hogy a folyamat közvetlenül olvassa vagy írja a blokkot. Hasonlóképpen, memóriakezelésnél az exokernel nem kényszerít egységes virtuális címtér modellt a folyamatokra; inkább megengedi, hogy egy alkalmazás konkrét fizikai memória kereteket kérjen és kezeljen, amennyiben ezt biztonságosan meg tudja tenni. Az exokernel tehát egyfajta minimalista erőforrás-felügyelő: ő rendelkezik az erőforrások kiosztásáról és védi őket, de nem mondja meg, hogyan használja azokat a program.

Ahhoz, hogy a rendszer használható maradjon, az exokernel modellel együtt jár a library OS fogalma. A valódi szoftverek írói nyilván nem szeretnének minden alkalommal alacsony szinten, például konkrét lemezblokkokkal bíbelődni vagy saját memóriamenedzsert írni. Ezért az exokernel fölött, a felhasználói térben futnak azok a könyvtárak, amelyek a megszokott OS absztrakciókat megvalósítják. Ezek a library OS-ek lényegében a hagyományos kernel szolgáltatásait nyújtják, de nem a kernelben, hanem mint közönséges (bár nyilván speciális jogosultságokkal rendelkező) programkönyvtárak. Több különböző library OS is létezhet egy exokernel fölött – akár alkalmazásonként eltérő is lehet.

Például egy exokernel rendszerben futtatható egyszerre egy POSIX-kompatibilis library OS (ami a Linux/UNIX rendszerhívásokat valósítja meg user-space-ben), és mellette egy másik folyamat használhat egy teljesen egyedi library OS-t, mondjuk valamilyen valós idejű feladatokra optimalizáltat. Mindketten ugyanazt az exokernel magot hívják meg erőforrásokért, de máshogy interpretálják azokat. Ez az exokernel legnagyobb előnye: szabadságot ad a magas szintű működés testreszabására. Az alkalmazás fejlesztője – vagy tipikusan az általa használt library OS fejlesztője – eldöntheti, milyen ütemezőt, memóriakezelőt, fájlrendszert akar használni, ahelyett hogy a kernel által előre beépítettekre hagyatkozna.

Ha egy speciális célú programnak speciális igénye van, megírhatja a saját “kis operációs rendszerét” az exokernel tetején, anélkül hogy saját kernelt kellene írnia. Ez a fajta modularitás és testreszabhatóság az end-to-end (végponttól végpontig) elv alkalmazása az operációs rendszerekre: ami absztrakciót nem muszáj a kernelben megoldani, azt oldja meg a felhasználói program, így elkerüljük, hogy a kernel univerzális, de nem tökéletes megoldásai mindenkit és mindent korlátozzanak.

Történeti háttér

Az exokernel koncepciója a ’90-es évek közepén, az MIT PDOS kutatócsoportjánál született meg. Dawson R. Engler és kollégái 1995-ben mutatták be az első prototípust, amely az Aegis exokernel magból és az ExOS könyvtári operációs rendszerből (library OS) állt.

A kísérleti rendszer bebizonyította, hogy a modell életképes: a speciális célú szoftverek jelentős teljesítménynövekedést értek el, miközben az ExOS réteg révén a hagyományos UNIX programok is futtathatók maradtak. Későbbi fejlesztések, mint a Xok kernel és a Cheetah webszerver, igazolták, hogy az alacsony szintű erőforrás-kezelés – például az IP-csomagok közvetlen lemezkezelése – drasztikusan gyorsíthatja a hálózati kiszolgálást, mivel a kernel csak a védelmet garantálja, de a folyamatba nem szól bele.

Bár az ötlet forradalmi volt, az exokernel gyakorlati elterjedése elmaradt. A fejlesztők számára komoly kihívást jelentett a megszokott absztrakciók hiánya, egy széles körben használható operációs rendszerhez pedig rengeteg különböző, párhuzamosan karbantartott library OS-re lett volna szükség, ami kezelhetetlen komplexitást szült.

Az exokernel szellemisége azonban ma is él. A unikernel technológia, ahol az alkalmazás egy saját mini OS-szel egyetlen egységként fut a hypervisoron, közvetlen ideológiai utódnak tekinthető. Hasonló elveket vall a Microsoft Drawbridge projektje is, amely könyvtári szintű izolációt használ. Ezek a kezdeményezések mind azt az exokernel-alapvetést viszik tovább, hogy az operációs rendszer ne egy merev korlát, hanem az alkalmazás igényeihez alakítható, moduláris platform legyen.

Multikernel: operációs rendszer mint elosztott rendszer

Alapötlet és működés

A multikernel architektúra a 2000-es évek végén megjelent új megközelítés, amelyet elsősorban a modern hardverek – a sokmagos processzorok és a heterogén számítási platformok – kihívásai inspiráltak. A multikernel alapfelvetése az, hogy egy többmagos gépet olyan módon kezeljünk, mintha egy elosztott rendszer lenne, nem pedig egy hagyományos, közös memórián osztozó számítógép. Hagyományos operációs rendszerekben a kernel a processzor magjait általában közös adatszerkezetekkel, zárolásokkal (lock) szinkronizálja – hiszen közös memóriát feltételezünk, így a kernel globális változókat, listákat használ a folyamatok nyilvántartására, a memória-allokációra stb.

A multikernel modell felépítése (Forrás: Barrelfish website)

Amikor azonban a magok száma drasztikusan megnő, vagy a rendszerben különböző típusú magok (például CPU és kisegítő GPU vagy DSP magok) vannak, a közös memórián osztozó kernelmodell skálázhatósági és tervezési problémákba ütközik. A magok közti folyamatos szinkronizáció (cache-koherencia fenntartása, globális lockok kezelése) komoly teljesítménybeli korlátozó tényezővé válhat, és a heterogén magok esetén nehéz egységesen kezelni a különböző képességű processzorokat.

A multikernel erre a problémára azzal válaszol, hogy minden processzormagon saját kernelpéldányt futtatunk, amelyek laza kapcsolatban állnak egymással. Úgy is mondhatjuk, hogy ha van egy 8 magos gépünk, akkor ahelyett hogy egy operációs rendszer futna 8 szálon, inkább nyolc kicsi operációs rendszer fut, egy-egy magon. Ezek a kernelpéldányok nem osztanak meg közvetlenül belső adatszerkezeteket – tehát nincs közös, globális process-lista például.

Ehelyett, ha információt kell cserélniük (például egy folyamat egyik magról átkerül egy másik magra), akkor üzenetküldéssel kommunikálnak egymással, mintha a hálózatba kapcsolt külön számítógépek lennének. A multikernel architektúra tehát explicit módon kezeli a kommunikációt a magok között: ahelyett, hogy a hardver cache-koherenciára és a megosztott memóriára “bíznánk” a szinkront (ami bonyolult és rejtett költségekkel jár), a kernel maga küld üzenetet a többi kernelnek, ha valamilyen változást (például egy erőforrás állapotváltozását) közölni akarja.

Emellett a multikernel elv másik sarokpontja az, hogy a rendszer állapotát replikálja a magok között, ahelyett hogy megosztaná. Vagyis például minden magon lehet saját ütemezője a futó feladatokkal, saját memóriakezelője a helyi memóriapartícióval, saját eszközkezelő komponense, és így tovább. Ha szükséges, ezek az állapotok szinkronban tarthatók üzenetek révén (gyakorlatilag egyfajta cache-koherenciát valósítva magasabb szinten), de nincs egyetlen központi adatszerkezet, amin osztozniuk kellene. Ez a “minden mag a saját uradalma” felépítés hasonlít egy klaszter vagy felhő architektúrára – csak itt a klaszter csomópontjai nem külön gépek, hanem CPU magok egy chipen belül.

Barrelfish: a multikernel úttörője

A multikernel ötlet legismertebb megvalósítása a Barrelfish operációs rendszer, amelyet az ETH Zürich egyetem és a Microsoft Research cambridge-i laborja közösen fejlesztett kutatási projektként 2007–2010 között. A Barrelfish egy nyílt forrású kísérleti OS, melynek célja pontosan az volt, hogy kipróbálja a multikernel koncepciót a gyakorlatban. A fejlesztők motivációját két fő trend adta: egyrészt a processzormagok számának rohamos növekedése (multi- és many-core processzorok megjelenése), másrészt a számítógépes hardverek egyre növekvő sokfélesége (például heterogén architektúrák, külön specializált magok egy rendszerben). Úgy látták, hogy 5–10 éven belül, a 2010-es évek folyamán a hagyományos operációs rendszerek nehezen fogják tudni hatékonyan kihasználni az ilyen komplex hardvereket – új paradigmára van szükség.

A Barrelfish a multikernel modell minden magon futtat egy apró kernelt (ezt nevezik CPU drivernek a Barrelfish terminológiájában). Ezek a kernelpéldányok nem osztanak meg memóriát egymással még akkor sem, ha egyébként a hardver támogatja a cache-koherenciát; kizárólag üzenetküldéssel (szálak közti üzenetek formájában) kommunikálnak, például ha egy alkalmazás több magot is használ. A magasabb szintű OS-szolgáltatások (fájlrendszer, hálózat, stb.) pedig egyfajta elosztott rendszerként vannak megírva a magok fölött: minden szolgáltatás komponensei külön folyamatként futnak, szükség esetén együttműködve (üzenetekkel) a többi magon levő társaikkal.

A végeredmény az, hogy az egész gép úgy viselkedik, mintha egy kis hálózat lenne a magok között, amelyek csomópontokként működnek egy elosztott operációs rendszerben. Az átlagos alkalmazás ezt persze nem érzékeli közvetlenül – a Barrelfish esetében is biztosítanak egy C nyelvű API-t folyamatok létrehozására, kommunikációra stb., csak a háttérben nem egy centralizált kernel hívásai történnek, hanem egy üzenet-orientált működés zajlik. A Barrelfish készítőinek koncepciója az volt, hogy e megközelítés révén hatékonyabban tudják skálázni az operációs rendszert sok magra: a rendszer teljesítménye bizonyos feladatoknál jobban nőtt a magok számával, mint a hagyományos Linux vagy Windows esetében, mert a Barrelfish kiiktatott sok rejtett költséget (például globális zárak okozta várakozást) azáltal, hogy explicitté tette a magok közti kommunikációt.

Ráadásul a multikernel struktúra hardver-semlegesebb: mivel nincs kódba égetve, hogy “ez egy x86-os PC 8 maggal”, a Barrelfish könnyebben portolható volt más architektúrákra, beleértve a heterogén rendszereket is. A tervezési alapelvek között deklarálták azt is, hogy a rendszer szerkezete legyen hardverfüggetlen, és kezelje természetes módon a replikált állapotot a megosztott helyett. Ez lehetővé teszi, hogy a Barrelfish-sel olyan platformokat is ki lehessen használni, ahol külön CPU és GPU magok vannak egyenrangúként jelen, vagy akár nem cache-koherens multiprocesszor rendszereket is.

Eredmények és hatás

A Barrelfish projekt kutatói 2009-ben publikálták mérföldkőnek számító tanulmányukat, amelyben bizonyították a multikernel-megközelítés életképességét. A mérések szerint a Barrelfish teljesítménye nemcsak felvette a versenyt a hagyományos, közös memóriát használó operációs rendszerekkel, hanem bizonyos terheléseknél – a globális zárolások kiiktatásának köszönhetően – jobban is skálázódott a magok számával. Fontos eredmény, hogy ez a haszon már a korabeli, 8–16 magos processzorokon is megmutatkozott, hatékonyabb terheléselosztást és jobb gyorsítótár-kezelést eredményezve.

A projekt rámutatott, hogy a szoftveresen megoldott, explicit üzenetküldés révén az operációs rendszer képes alkalmazkodni a változó hardvertopológiákhoz és a komplex cache-hierarchiákhoz. Bár a Barrelfish kutatási prototípus maradt (utolsó kiadása 2020-as), alapelvei beszivárogtak a mainstream rendszerekbe is. A Linux kernel fejlesztése során például folyamatosan törekednek a globális zárolások minimalizálására és az alrendszerek NUMA-csomópontonkénti elkülönítésére, ami a multikernel-filozófia egyik gyakorlati alkalmazása.

Összességében a multikernel jelentősége abban rejlik, hogy a skálázhatóságot tette a tervezés alapjává, átírva az operációs rendszerek hagyományos alaprajzát. A heterogén rendszerek (például az ARM big.LITTLE) és a specializált SoC-k korában az üzenetközpontú szinkronizáció és a hardvertopológiához igazodó ütemezés egyre felértékelődik. A Barrelfish bebizonyította, hogy a kernelre nem feltétlenül központi irányítóként, hanem a magok közötti együttműködést koordináló, rugalmas rétegként is tekinthetünk.

Unikernel: az alkalmazás saját, lezárt minivilága

Alapötlet és működés

Az unikernel az operációs rendszer és az alkalmazás közti határvonalat gyakorlatilag eltünteti: a cél nem egy általános célú, sokféle programot kiszolgáló OS, hanem egyetlen feladatra “összerakott” rendszerkép, amelyben az alkalmazás és a számára szükséges operációs rendszer-szolgáltatások egyetlen bináris egységgé állnak össze. A klasszikus definíció szerint az unikernel egy specializált, egy címtérben futó gépkép, amelyet úgy kapunk meg, hogy az alkalmazást statikusan összelinkeljük egy könyvtári operációs rendszer (library OS) komponenseivel.

unikernel
Az unikernel architektúra felépítése (Forrás: Wikipedia)

A végeredmény nem egy Linux-szerű vendég OS, hanem egy olyan, kifejezetten az adott alkalmazásra szabott image, amely jellemzően közvetlenül egy hypervisor vendégeként fut (például Xen vagy KVM alatt), külön “teljes” operációs rendszer réteg nélkül.

A működés kulcsa a moduláris felépítés. Unikernel környezetben az olyan megszokott alrendszerek, mint a hálózati stack, a memóriakezelés, a futásidejű ütemezés, vagy akár egy minimalista fájlrendszer-támogatás, tipikusan linkelhető könyvtárkomponensekként léteznek. A buildfolyamat (compile és linkelés) során csak azok a darabok kerülnek be a végső image-be, amelyekre az alkalmazásnak ténylegesen szüksége van; ami nem kell, egyszerűen nincs jelen. Ebből adódik az unikernel egyik legszembetűnőbb sajátossága: sok implementációban nincs hagyományos kernel–user tér szétválasztás, mert az egész rendszer egyetlen címtérben működik, ezért a klasszikus rendszerhívás-útvonal és a privilege váltások jelentős része eleve értelmét veszti, és a “kernel-szolgáltatás” gyakran sima függvényhívássá egyszerűsödik.

A „lezártság” is központi elem: sok unikernel esetén a futó image nem egy általános célú rendszer, amit utólag bővítesz csomagokkal, finomhangolsz konfigurációval, majd működés közben foltozol. Inkább egy készre épített, appliance-jellegű egységként viselkedik. Ha változtatni kell rajta, nem a futó példányt alakítod át, hanem új image-et állítasz elő, és azt cseréled le. Ez a szemlélet kifejezetten passzol a felhős üzemeltetéshez, az infrastruktúra mint kód megközelítéshez és az „immutable” telepítésekhez, ahol a frissítés eleve gyakran új példány indítását és a régiek lecserélését jelenti.

Történeti háttér és példák

Az unikernel a library OS koncepciójából és az operációs rendszerek komponensekre bontásának kutatásaiból fejlődött ki. Modern reneszánsza a 2010-es évek elején kezdődött, amikor a virtualizáció elterjedése felvetette: ha a hardver csupán egy hypervisor-absztrakció, miért cipeljünk minden szolgáltatáshoz egy teljes, univerzális operációs rendszert? Ezt a szemléletet a MirageOS tette ismertté, amely felhőre optimalizált, egycélú rendszerképként definiálta az unikernelt.

A MirageOS a „nyelv + library OS” elvét követve moduláris komponensekből épít fel kisméretű rendszereket. Ezzel párhuzamosan jelentek meg a pragmatikusabb irányok, mint az OSv, amelyet kifejezetten virtuális gépekre és cloud-terhelésekre terveztek. Más projektek, például a Rumprun, a NetBSD ökoszisztémájából emelnek át kiforrott kernelkomponenseket (drivereket, alrendszereket), így elkerülve az alapoktól való újraírást.

A 2010-es évek második felére a cél a szélesebb körű használhatóság lett. Erre kiváló példa az Unikraft, amely egyfajta moduláris eszköztárként teszi lehetővé az OS-elemek válogatását. A futtatási oldalt olyan technológiák segítik, mint a Solo5, amely sandboxolt környezetben biztosítja az unikernel-típusú feladatok végrehajtását különféle hypervisorok felett.

Felhasznált források

  1. Bomberger et al. (1992)The KeyKOS Nanokernel Architecture. USENIX Workshop on Micro-Kernels and Other Kernel Architectures, 1992. (A KeyKOS operációs rendszer minimalista, képesség-alapú nanokerneljének bemutatása, eredeti cikk)
  2. Engler, Kaashoek & O’Toole (1995)Exokernel: An Operating System Architecture for Application-Level Resource Management. Proc. 15th ACM SOSP, 1995. (Az exokernel koncepció első publikációja, MIT PDOS – Aegis exokernel és ExOS library OS)
  3. Microsoft Research, Cambridge, Systems Group, ETH Zurich (2009)The Multikernel: A new OS architecture for scalable multicore systems. Proc. 22nd ACM SOSP, 2009. (A Barrelfish operációs rendszer és a multikernel modell részletes ismertetése, teljesítményértékeléssel)
  4. Barrelfish Project (2009–2020)Barrelfish OS Documentation (Hivatkozás). (A Barrelfish kutatási operációs rendszer honlapja és dokumentációja, információk a multikernel architektúra gyakorlati megvalósításáról)
  5. Anil Madhavapeddy: Unikernels: Library Operating Systems for the Cloud (MirageOS-alapú megközelítés, felhős motivációk és előnyök). (Hivatkozás)