Mach | |
---|---|
Sorts | mikrokärna |
Författare | Carnegie Mellon University (CMU) |
Skrivet i | C och assemblerspråk |
Första upplagan | 1985 [1] |
senaste versionen | 3.0 |
Hemsida | cs.cmu.edu/afs/cs/projec... |
Mach är en mikrokärna för operativsystem som utvecklats vid Carnegie Mellon University under forskningsarbete inom området operativsystem, främst distribuerad och parallell beräkning. Detta är ett av de allra första exemplen på en mikrokärna, men det är fortfarande standarden för andra liknande projekt.
Projektet existerade från 1985 till 1994 och avslutades med släppet av Mach 3.0. Flera forskargrupper fortsatte utvecklingen av Mach; till exempel drev University of Utah Mach 4-projektet [2] under en tid . Mach designades som en ersättning för BSD UNIX-kärnan, så det fanns inget behov av att utveckla en ny operativ miljö. Ytterligare forskningsarbete om Mach-projektet verkar ha avslutats; trots detta används Mach och dess derivat i ett antal kommersiella operativsystem, såsom NeXTSTEP , av vilka det mest anmärkningsvärda är Mac OS X , som använder XNU-kärnan som innehåller Mach 2.5. Machs virtuella minneshanteringssystem togs över av BSD-utvecklarna i CSRG och används i moderna BSD-härledda UNIX-system som FreeBSD. Varken Mac OS X eller FreeBSD behöll mikrokärnarkitekturen som används av Mach, även om Mac OS X erbjuder mikrokärninterprocesskommunikation och styrprimitiv för användning i applikationer.
Mach är en logisk förlängning av Accent- kärnan , även utvecklad vid Carnegie Mellon University . Sedan 1991 har den ledande utvecklaren av projektet, Richard Rashid, arbetat på Microsoft i Microsoft Research-divisionen. En annan av huvudutvecklarna, Avetis Tevanyan , arbetade som chef för mjukvaruutveckling på NeXT , sedan, fram till mars 2006, chef för avancerad mjukvaruteknologi på Apple .
Eftersom Mach designades som en snabb ersättning för den traditionella Unix -kärnan , kommer vi att fokusera på skillnaderna mellan Mach och Unix . Det har blivit tydligt att "allt är en fil" Unix-konceptet inte längre fungerar på moderna system, men system som Plan 9 från Bell Labs försöker fortfarande följa denna väg. Mach-utvecklarna märkte inflexibiliteten i detta tillvägagångssätt och föreslog att ytterligare ett lager av virtualisering kunde få systemet att "fungera" igen.
En av de viktigaste abstraktionerna i Unix är pipes . Vad liknar pipelines och gör det möjligt att på en mer allmän nivå göra de olika informationsförflyttningarna mellan programmen tillgängliga? Ett sådant system kan existera med användning av inter-process communication (IPC), en pipeline-liknande princip för att organisera kommunikation mellan processer som gör att all filliknande information kan flyttas mellan två program. Även om olika implementeringar av IPC har funnits på många system, inklusive olika Unix, i flera år, var de designade för speciella ändamål och kunde inte ge vad skaparna av Mach förväntade sig av dem.
Carnegie Mellon University började utveckla Accent-kärnan med hjälp av delat minnesbaserad IPC . Accent var ett experimentellt system med många funktioner, utvecklat enligt modetrender under hela utvecklingen. Dessutom var Accents användbarhet för forskning begränsad eftersom den inte var Unix-kompatibel, och Unix var redan de facto-standarden på alla forskningsoperativsystem. Dessutom var Accent tätt knuten till plattformen som den utvecklades på. Men i början av 1980-talet verkade det som att många nya plattformar snart skulle dyka upp, varav många skulle stödja massiv parallellism.
I början sågs utvecklingen av Mach främst som ett försök att skapa en konceptuellt "ren", Unix-baserad, lätt bärbar Accent. Följande huvudkoncept formulerades:
Mach är baserat på konceptet IPC Accent, men gjort mer som ett Unix-system som låter dig köra Unix-program med liten eller ingen modifiering. För att uppnå detta mål introducerade Mach konceptet med en "port" som representerar slutet i en tvåvägs IPC. Portar var säkrade och hade filbehörigheter som liknade Unix-filbehörigheter, och använde en mycket liknande säkerhetsmodell som Unix . Dessutom tillät Mach vilket program som helst att äga privilegier som normalt endast är reserverade för kärnan, vilket tillät en oprivilegierad nivå (användarutrymme) att komma åt hårdvaran.
I Mach, som i Unix , har operativsystemet återigen blivit i första hand en uppsättning verktyg. Liksom Unix har Mach konceptet med en "drivrutin" som en mellanhand mellan själva kärnan och hårdvaran. Alla drivrutiner för befintlig hårdvara måste dock inkluderas i mikrokärnan. Andra arkitekturer baserade på hårdvaruabstraktionsskikt eller exokernelar kan separera drivrutiner från mikrokärnan.
Den största skillnaden från Unix var att verktygen inte måste fungera med filer utan med uppgifter. Mer kod har flyttats ut från kärnan och till icke-privilegierat läge. På grund av detta har kärnan blivit betydligt mindre, därav termen mikrokärna för Mach-kärnan. Till skillnad från traditionella system kan under Mach en process (eller "uppgift") bestå av en uppsättning trådar. Mach var det första operativsystemet som definierade "tråd" i denna mening. Kärnans uppgifter reducerades till att arbeta med hårdvara och stödjande verktyg.
Förekomsten av portar och användningen av IPC definierar de flesta av skillnaderna mellan Mach och traditionella kärnor. I Unix används " systemanrop " eller " signaler " för att komma åt kärnan . Programmet använder biblioteket för att placera data på en känd plats i minnet, och skapar sedan ett speciellt programvaruavbrott . När systemet först startar kärnan ställer det in en avbrottshanterare , så att programmet som kastar avbrottet anropar kärnan, som undersöker den inkommande informationen och vidtar åtgärder.
Mach använder IPC för detta ändamål. Programmet ber kärnan om åtkomst till porten och använder sedan IPC-mekanismen för att skicka meddelanden till porten. I andra kärnor hanteras dessa meddelanden av systemanrop; i Mach hanteras nästan alla förfrågningar av ett annat program.
Användningen av IPC för att skicka meddelanden stödjer trådar och påståenden. Eftersom uppgifter är sammansatta av flera trådar och deras trådade kod använder IPC-mekanismen, kan Mach frysa eller avfrysa en tråd medan ett meddelande bearbetas. Detta gör att systemet kan distribueras över flera processorer, använda delat minne direkt i de flesta Mach-meddelanden, eller genom att lägga till kod för att kopiera meddelandet till en annan processor om det behövs. I en traditionell kärna är detta svårt att implementera eftersom systemet måste vara säker på att olika program inte försöker skriva till samma minne på olika processorer. I Mach är detta väldefinierat och lätt att implementera; en process som kommer åt minne, portar, blir en "medborgare" i systemet.
IPC-systemet har prestandaproblem för vilka flera strategier har utvecklats för att övervinna. I synnerhet använder Mach en enda minnesdelningsmekanism för att fysiskt skicka meddelanden från ett program till ett annat. Fysisk kopiering av meddelandet kommer att gå långsamt, så Mach ser till minneshanteringsenheten (MMU) för att snabbt kartlägga data från ett program till ett annat. Endast om data skrivs kommer det att kopieras fysiskt, en process som kallas " copy -on-write" (copy-on-write; ko).
Meddelanden kontrolleras också för integritet av kärnan för att undvika dålig data som kommer att bryta ett av programmen som utgör systemet. Portar utvecklades baserat på Unix-filsystemet. Detta gjorde det möjligt för portar att använda de befintliga koncepten för filsystemnavigering samt behörigheter.
Jämfört med mer traditionella operativsystem blir utvecklingen av ett sådant system lättare. Det mesta av systemet kan startas, felsöka och byggas med samma verktyg som program för ett traditionellt system. Med en monolitisk kärna kräver en bugg i koden att hela maskinen stängs av och startas om, medan det i Mach bara kräver en omstart av programmet. Dessutom kan användaren tala om för systemet att aktivera eller inaktivera funktioner efter önskemål. Eftersom operativsystemet är en samling program kan utvecklare lägga till eller ta bort delar av det genom att helt enkelt starta eller stoppa dem som vilket annat program som helst.
Mach fanns ursprungligen som tilläggskod skriven till den befintliga 4.2BSD-kärnan som gjorde att kommandot kunde köras på systemet långt innan det var färdigt. Arbetet började med ett färdigt Accent IPC /portsystem och flyttade till andra viktiga delar av operativsystemet, uppgifter, trådar och virtuellt minne. Dessa delar har skrivits om för att anropa funktioner i Mach; Parallellt med detta genomfördes arbete med 4.3BSD.
1986 var systemet färdigt och kunde köras på en DEC VAX . Även om det hade liten praktisk betydelse, väcktes målet att skapa en mikrokärna till liv. Versioner för IBM PC/RT- och Sun Microsystems 68030- arbetsstationerna följde snart och gav systemportabilitet. År 1987 inkluderade listan Encore Multimax och Sequent Balance . Release 1 kom ut i år och release 2 nästa.
Hela denna tid skapades inte den utlovade "riktiga" mikrokärnan. Dessa tidiga versioner av Mach inkluderade det mesta av 4.3BSD-kärnan, ett system känt som POE , med resultatet att kärnan faktiskt var större än den Unix den var baserad på. Målet att flytta ut Unix-lagret från kärnan, där det var lättare att utveckla och ersätta, uppnåddes dock. Prestanda lämnade mycket att önska och ett antal arkitektoniska förändringar gjordes för att lösa detta problem.
Som ett resultat kom Mach 3 ut 1990 och skapade ett stort intresse. Det lilla teamet som gjorde Mach porterade den till en mängd olika plattformar, inklusive komplexa multiprocessorsystem som innebar allvarliga problem för gammaldags kärnor. Intresset aktiverades också för det kommersiella segmentet av marknaden, där det fanns företag som skulle vilja kunna byta plattform, och om de porterade sitt OS till Mach kunde de byta plattform smärtfritt.
Mach fick ett synligt uppsving när Open Source Foundation meddelade att de skulle bygga en framtida version av OSF/1 på Mach 2.5, och skulle gärna använda Mach 3. Mach 2.5 valdes även för NeXTSTEP- system och ett antal kommersiella multiprocessorer tillverkare. Med Mach 3 har det gjorts ett antal försök att porta andra operativsystem till denna kärna, inklusive IBM Workplace OS och flera försök från Apple Computer att skapa en plattformsoberoende version av Mac OS .
Ett tag såg det ut som att alla operativsystem som byggdes i slutet av 1990-talet skulle vara baserade på Mach.
Mach var ursprungligen placerad som en ersättning för klassisk Unix, och innehåller därför många Unix-idéer. Till exempel använder Mach ett system för rättigheter och säkerhet baserat på Unix-filsystemet. Eftersom kärnan körs i privilegierat läge (kärnläge) och det är möjligt att något program skickar ett kommando som kommer att skada systemet, måste kärnan kontrollera varje meddelande. Dessutom fanns det mesta av funktionaliteten i program som kördes i icke-privilegierat läge (användarutrymme), vilket innebär att det behövs något sätt för att tillåta sådana program ytterligare åtgärder, som att arbeta med hårdvara.
Vissa Mach-funktioner var baserade på samma IPC-mekanismer. Till exempel kan Mach enkelt stödja multiprocessordatorer. I den traditionella kärnan görs ett omfattande arbete för att se till att program som körs på olika processorer och samtidigt kan anropa kärnfunktioner är återinträde eller diskontinuerliga. I Mach är delar av operativsystemet isolerade i servrar som kan köras precis som andra program – på vilken processor som helst. Så i teorin borde Mach-kärnan också vara återkommande, men i praktiken är detta inte ett problem, eftersom allt Mach behöver göra är att dirigera förfrågan till något oprivilegierat program. Mach inkluderade också en server som kunde vidarebefordra meddelanden inte bara mellan program utan över nätverket. Arbete inom detta område gjordes i slutet av 1980-talet och början av 1990-talet.
Att använda IPC för de flesta uppgifter minskar prestandan [3] . Jämförelser som gjordes 1997 visade att Unix byggd på Mach 3.0 var 50 % långsammare än traditionell Unix [4] .
Studier har visat att prestanda sjunker på grund av IPC, och det är omöjligt att uppnå acceleration genom att dela upp operativsystemet i små servrar. Många försök gjordes för att förbättra Machs prestanda, men i mitten av 1990-talet hade intresset avtagit.
Faktum är att forskning om prestandaproblemens karaktär har avslöjat flera intressanta fakta: en är att IPC i sig inte är ett problem, problemet är att minneskartläggning krävs för att stödja det, vilket lägger till lite overhead. Det mesta av tiden (cirka 80%) ägnas åt ytterligare uppgifter i kärnan - bearbetning av meddelandet, främst kontroll av porträttigheter och meddelandeintegritet. I tester på Intel 80486DX-50 tar ett standard Unix-anrop cirka 21 mikrosekunder, ett motsvarande samtal i Mach tar 114 mikrosekunder, varav 18 mikrosekunder är relaterat till hårdvara, resten är relaterat till olika funktioner i Mach-kärnan.
När Mach först användes i seriös utveckling (version 2.x) var prestandan cirka 25 % långsammare än traditionella kärnor. Detta pris var inte ett problem eftersom systemet porterade bra och körde på flera processorer. Faktum är att systemet dolde allvarliga prestandaproblem fram till releasen av Mach 3, då många utvecklare försökte skapa system som körs i oprivilegierat läge.
När Mach 3 försökte flytta operativsystemet till icke-privilegierat läge blev prestandaförlusten märkbar. Låt oss överväga ett enkelt exempel: uppgiften lär sig den aktuella tiden. Ett meddelande skickas till Mach-kärnan, detta orsakar en kontextväxling, minnesmapping, sedan kontrollerar kärnan meddelandet och rättigheterna, om allt är bra anropas en kontextväxel till servern, sedan utför servern åtgärderna och skickar meddelande tillbaka, tilldelar kärnan mer minne och byter kontext två gånger.
Men det finns ett problem här. Det ligger i det virtuella minnessökningssystemet. Traditionella monolitiska kärnor vet var kärnan och dess moduler finns, och var minnet som kan bläddras ut finns, medan Mach inte har någon aning om vad systemet är gjort av. Istället använder den en enda lösning som lägger till prestandaproblem. Mach 3 tillhandahåller en enkel minneshanterare som får åtkomst till andra hanterare som körs i icke-privilegierat läge, vilket gör att systemet gör dyra IPC-samtal.
Många av dessa problem finns i alla system som behöver köras på en multiprocessormaskin, och i mitten av 1980-talet såg det ut som att den framtida marknaden skulle fyllas med dem. Faktum är att evolutionen inte fungerar som förväntat. Multiprocessormaskiner användes i serverapplikationer i början av 1990-talet men försvann sedan. Samtidigt har CPU-prestandan ökat med 60 % per år, vilket multiplicerar kodineffektiviteten. Det är dåligt att minnesåtkomsthastigheten bara växer med 7% per år, vilket betyder att kostnaden för minnesåtkomst inte har minskat, och Machs IPC-samtal som inte cachelagras är väldigt långsamma.
Trots Machs kapacitet är sådana prestandaförluster i den verkliga världen oacceptabla, så mycket av OS-utvecklingsgemenskapen ansåg att användningen av IPC som grund för OS från början var ett misslyckande.
Som vi har nämnt ovan slösas majoriteten av Mach 3:s prestanda bort på IPC-samtal. Konceptet med ett "multiserversystem" är dock fortfarande lovande, så det kräver forskning. Utvecklare måste noggrant isolera kod till moduler som inte ringer från server till server. Till exempel bör de flesta nätverkskoder placeras på en separat server. Under Unix är detta inte så lätt, eftersom systemet är beroende av att använda filsystemet för allt från nätverk till säkerhet.
De flesta utvecklare har fastnat för det ursprungliga konceptet med en enda stor server som ger OS-funktionalitet. För att underlätta utvecklingen tillät de också operativsystemet att köras i privilegierade och oprivilegierade lägen. Detta gör att de kan utvecklas i icke-privilegierat läge och ha alla funktioner i Mach-idén, och sedan flytta den felsökta servern till privilegierat läge för att få bättre prestanda. Flera operativsystem har utvecklats på liknande sätt, känt som "co-location" (samlokalisering), detta används i Lites (port 4.4BSD Lite), MkLinux , OSF/1 och NeXTSTEP / OpenStep / Mac OS X. ChorusOS gjorde denna funktion till en del av kärnsystemet, vilket gjorde det möjligt för servrar att gå in i privilegierat läge med hjälp av inbyggda mekanismer.
Mach 4 försökte lösa detta problem med en radikal uppsättning förbättringar. Speciellt hittade han programkod som vanligtvis inte skrivs ner, och därför sker kopiering på skriv sällan. Detta gjorde det möjligt att inte mappa minne mellan processer (mapminne) för IPC, utan istället att använda lokala områden av programminnet. Detta skapade konceptet "skyttlar" och ökade prestanda, men utvecklarna fick komplexiteten i att hantera tillstånd. Mach 4 inkluderade också inbyggda samlokaliseringsmekanismer.
I alla IPC-tester angavs prestanda som källan till problemet och stod för 73 % av förlorade cykler.
I mitten av 90-talet upphörde arbetet med mikronukleära system. Även om marknaden trodde att alla nya system skulle vara mikrokärna på 90-talet, använder idag bara ett mycket använt Mac OS X-system en samlokaliseringsserver ovanpå en kraftigt modifierad Mach 3-kärna.
Forskning har visat att problemet med IPC-prestanda inte är så illa som folk tror. Som en påminnelse tar ett envägssamtal på BSD 20 mikrosekunder, medan det på Mach tar 114, varav 11 är en kontextväxling som är identisk med BSD. Dessutom används 18 av minneshanteraren för att visa ett meddelande mellan den icke-privilegierade körtiden och den privilegierade körtiden (användarutrymme och kärnutrymme). Detta lägger till 31 mikrosekunder, vilket är längre än ett traditionellt samtal, men inte mycket.
Resten av problemet är att kontrollera behörigheterna på meddelandeporten. Även om detta ser väldigt viktigt ut, krävs det faktiskt bara på Unix-system. Till exempel kanske ett enanvändarsystem som körs på en mobiltelefon inte behöver dessa funktioner, och detta är den typ av system där Mach kan användas. Men Mach skapar problem: när minnet flyttas till operativsystemet kanske andra uppgifter inte behöver det. DOS och tidiga Mac OS hade ett enda adressutrymme som delas av alla processer, så minneskartläggning är ett slöseri med tid på sådana system.
Dessa implementeringar inledde den andra generationen av mikrokärnor , vilket minskar systemets komplexitet genom att placera det mesta av funktionaliteten i icke-privilegierat exekveringsläge. Till exempel innehåller L4 -kärnan bara 7 funktioner och använder 12 kilobyte minne, medan Mach 3 innehåller cirka 140 funktioner och använder 330 kilobyte minne. Ett IPC-anrop till L4 på 486DX-50 tar bara 5 mikrosekunder – snabbare än ett Unix-samtal på samma system och 20 gånger snabbare än Mach. Naturligtvis tar detta inte hänsyn till det faktum att L4 inte fungerar med behörigheter och säkerhet, vilket lämnar dem till oprivilegierade program.
De "potentiella" L4-hastigheterna är baserade på det faktum att icke-privilegierade applikationer ofta tillhandahåller många funktioner som formellt stöds av kärnan. Du kan jämföra prestanda för MkLinux i samlokaliseringsläge och en L4-port som körs i icke-privilegierat läge. L4 lägger bara till cirka 5-10% overhead, medan Mach lägger till 15%, vilket är ganska intressant med tanke på de dubbla kontextväxlarna.
Som ett resultat har de nya mikrokärnorna förändrat branschen som helhet, med många en gång döda projekt som GNU Hurd som fått uppmärksamhet igen.
Mach och Mach-liknande operativsystem | |
---|---|