Кіріспе
Операциялық жүйе микроядросы Mach (/m//ɑː//k/) – Ричард Рашид пен Ави Теванянның Карнеги-Меллон университетінде операциялық жүйелерді зерттеуді, негізінен үлестірілген және параллель есептеуді қолдау үшін әзірлеген ядро. Mach микроядроның ең алғашқы мысалдарының бірі саналады. Дегенмен, Mach-тың барлық нұсқалары микроядролар емес. Mach-тың туындылары GNU Hurd операциялық жүйесінің ядросының және macOS, iOS, iPadOS, tvOS және watchOS-та қолданылатын Apple-дің XNU ядросының негізі болып табылады. Карнеги Меллон университетіндегі жоба 1985 жылдан 1994 жылға дейін жалғасты, нәтижесінде Mach 3.0 шынайы микроядроға айналды. Mach Unix-тің BSD нұсқасындағы ядроны алмастыру мақсатымен жасалды, осылайша оның негізінде жаңа операциялық жүйе құру қажеттігі тумайды. Mach және оның туындылары бірнеше коммерциялық операциялық жүйелерде қолданылады. Олардың барлығы XNU операциялық жүйесінің ядросын пайдаланады, оның маңызды құрауы ретінде бұрынғы, микроядро емес Mach бар. Mach виртуалды жадты басқару жүйесі 4.4BSD-де CSRG-дегі BSD әзірлеушілері тарапынан қабылданып, FreeBSD сияқты қазіргі BSD-ден туындаған Unix жүйелерінде де қолданылады. Mach – Карнеги-Меллон университетінің Accent ядросының логикалық жалғасы. Mach жобасының бас әзірлеушісі Ричард Рашид 1991 жылдан бері Microsoft компаниясында жұмыс істейді және Microsoft Research бөлімін құрды. Mach-тың алғашқы әзірлеушілерінің бірі Ави Теванян бұрын NeXT компаниясында бағдарламалық жасақтама басшысы болған, содан кейін 2006 жылдың наурызына дейін Apple Inc. компаниясында бағдарламалық жасақтама технологиясының бас директоры қызметін атқарды. Кейінірек жоба жетекшісі Рик Рашидтен жобаның ағымдағы атауы туралы сұрағанда, ол "MUCK" деген жауап алды, бірақ бұл жазба түрінде емес, тек айтылды. Ол итальян алфавитіне сәйкес, Mach деп жазды. Рашид Джузеппе ұсынған "Mach" деген жазуын қатты ұнатып, оны қабылдады.
Mach (/m//ɑː//k/) is a kernel developed at Carnegie Mellon University by Richard Rashid and Avie Tevanian to support operating system research, primarily distributed and parallel computing. Mach is often considered one of the earliest examples of a microkernel. However, not all versions of Mach are microkernels. Mach's derivatives are the basis of the operating system kernel in GNU Hurd and of Apple's XNU kernel used in macOS, iOS, iPadOS, tvOS, and watchOS. The project at Carnegie Mellon ran from 1985 to 1994, ending with Mach 3.0, which is a true microkernel. Mach was developed as a replacement for the kernel in the BSD version of Unix, so no new operating system would have to be designed around it. Mach and its derivatives exist within a number of commercial operating systems. These include all using the XNU operating system kernel which incorporates an earlier non microkernel Mach as a major component. The Mach virtual memory management system was also adopted in 4.4BSD by the BSD developers at CSRG, and appears in modern BSD derived Unix systems such as FreeBSD. Mach is the logical successor to Carnegie Mellon's Accent kernel. The lead developer on the Mach project, Richard Rashid, has been working at Microsoft since 1991; he founded the Microsoft Research division. Another of the original Mach developers, Avie Tevanian, was formerly head of software at NeXT, then Chief Software Technology Officer at Apple Inc. until March 2006. later asked project leader Rick Rashid about the project's current title and received "MUCK" as the answer, though not spelled out but just pronounced: which he, according to the Italian alphabet, wrote like Mach. Rashid liked Giuse's spelling "Mach" so much that it prevailed.
Unix құбырлары
Unix операциялық жүйесінің маңызды түсінігі – құбыр идеясы еді. Құбыр – бағдарламадан бағдарламаға деректерді құрылымдалмаған байттар ағыны ретінде жылжытуға мүмкіндік беретін абстракция. Құбырларды қолдану арқылы пайдаланушылар (немесе бағдарламашылар) бірнеше бағдарламаны тізбектеп, тапсырмаларды орындауға болады, деректерді бірнеше шағын бағдарлама арқылы кезегімен жіберіп. Бұл сол кездегі әдеттегі операциялық жүйелерден өзгеше болды, олар бүкіл тапсырманы орындай алатын бір үлкен бағдарламаны талап етті, немесе деректерді беру үшін файлдарды пайдаланды, бұл ресурстарды көп жұмсады және уақытты қажет етті. Құбырлар негізгі кіріс-шығыс жүйесінде құрылды. Бұл жүйе өз кезегінде, драйверлердің тапсырма аяқталуын күтіп, мерзімді түрде «тоқтау» күйіне өтуін күтетін модельге негізделген. Мысалы, принтер драйвері мәтіннің бір жолын жолды принтерге жіберіп, содан кейін принтер сол жолды басып шығарғанша ештеңе істемейді. Мұндай жағдайда драйвер тоқтатылғанын көрсетеді, ал операциялық жүйе принтер қосымша деректерге дайын екенін көрсеткенше, басқа бағдарламаны іске қосуға рұқсат береді. Құбырлар жүйесінде шектеулі ресурс – жад, және бір бағдарлама құбырға бөлінген жадты толтырғанда, ол табиғи түрде тоқтайды. Әдетте, бұл деректерді тұтынушы бағдарламаны іске қосып, құбырды қайта босатуға себеп болады. Файлдан айырмашылығы, келесі бағдарлама оны пайдалану алдында бүкіл файлды оқу немесе жазу керек, құбырлар деректердің бірнеше бағдарламада бөліп-бөліп жылжуын бағдарламашының араласуынсыз қамтамасыз етеді. Дегенмен, жад буферлерінде құбырларды іске асыру деректерді бағдарламадан бағдарламаға көшіруді талап етті, бұл уақытты және ресурстарды көп жұмсайтын операция. Бұл құбыр тұжырымын жылдам нәтиже алу немесе төмен жауап беру уақыты қажет болған тапсырмалар үшін қолайсыз етті, мысалы, көптеген құрылғы драйверлерінде. Операциялық жүйенің ядросы мен негізгі функционалдығы бір үлкен бағдарламада жазылған. Операциялық жүйеге компьютерлік желілер сияқты жаңа мүмкіндіктер қосылғанда, ядроның көлемі мен күрделілігі де артты.
Жаңа тұжырымдамалар
Unix құбырлары өзара әрекеттесетін шағын бағдарламалардан кез келген күрделі шешімдер құруға мүмкіндік беретін тұжырымдамалық жүйені ұсынды. Бұл кіші бағдарламаларды жасау және күту оңайырақ болды, сондай-ақ бағдарламалау мен қателерді жоюды жеңілдететін анықталған интерфейстерге ие болды. Бұл қасиеттер құрылғы драйверлері үшін одан да маңызды, себебі олардың кішкентай көлемі мен қатесіз жұмыс істеуі аса үлкен мәнге ие. Ядроның өзін кішкентай өзара әрекеттесетін бағдарламалар негізінде құруға зор ынта болды. Операциялық жүйенің негізін қалаушы құбыр тәрізді жүйені алғаш рет пайдаланған жүйелердің бірі – Рочестер университетінде жасалған Aleph ядросы. Ол порттар тұжырымдамасын енгізді, олар негізінен ортақ жадты іске асыру болып табылды. Aleph-те ядроның өзі аппараттық құралдарға, соның ішінде жад пен порттарға қол жеткізуді қамтамасыз етумен шектелді, ал порттар жүйесін пайдаланатын стандартты бағдарламалар құрылғы драйверлерінен бастап пайдаланушы бағдарламаларына дейін барлық қызметті іске асырды. Бұл тұжырымдама ядроның көлемін едәуір қысқартты және пайдаланушыларға оларды жүктеу және орындалу кезінде байланыстыру арқылы әртүрлі драйверлермен тәжірибе жасауға мүмкіндік берді. Бұл жаңа операциялық жүйе кодын жасау кезіндегі қиындықтарды жеңілдетті, әйтпесе машинаны қайта іске қосу қажет болар еді. Кішкентай ядро және сыртқы драйверлердің жалпы тұжырымдамасы микроядро деп аталды. Aleph Data General Eclipse миникомпьютерлерінде іске асырылды және олармен тығыз байланысты болды. Бұл машина идеалды емес еді, себебі ол бағдарламалар арасында жадты көшіруді талап етті, бұл өнімділікке елеулі салқың салған. Сонымен қатар, ол өте қымбатқа соқты. Дегенмен, Aleph негізгі жүйенің дұрыс екенін дәлелдеді және ертедегі Ethernet интерфейсі арқылы жадты көшіру арқылы компьютерлік кластерлеуді көрсетті. Осы кезеңде 32 биттік адрестік кеңістік және (алғашқыда қосымша) жадты басқару блогын (MMU) қолдайтын орталық процессорлардың (CPU) жаңа буыны нарыққа шыға бастады. MMU әртүрлі бағдарламалардың қай жад беттерін пайдаланып жатқанын қадағалап, виртуалды жад жүйесін іске асыруға қажетті нұсқауларды орындады. Бұл порт тұжырымдамасына жаңа шешім ұсынды, виртуалды жад жүйесінің жазу механизмін пайдалану арқылы. Бағдарламалар арасында деректерді көшірудің орнына, MMU-ға бірдей жадқа қол жеткізуді қамтамасыз ету үшін қажетті деректерді жіберу ғана қажет болды. Бұл жүйе процестер аралық байланыс жүйесін айтарлықтай жоғары өнімділікпен іске асыратын еді. Бұл тұжырымдама Карнеги Меллон университетінде қолданылды, онда Aleph PERQ жұмыс станциясы үшін бейімделді және көшіру арқылы жазуды пайдаланып іске асырылды. Порт сәтті болды, бірақ нәтижесінде пайда болған Accent ядросы шектеулі практикалық қолданысқа ие болды, себебі ол қолданыстағы бағдарламалық жасақтаманы іске қоспады. Сонымен қатар, Accent Aleph Eclipse-ке сияқты PERQ-қа тығыз байланысты болды.
Даму
Mach бастапқыда 4.2BSD ядросына тікелей жазылған қосымша код ретінде енгізілді, бұл командаға жүйе толыққанды аяқталмас бұрын оның үстінде жұмыс істеуге мүмкіндік берді. Жұмыс қазірдің өзінде функционалды Accent IPC/порт жүйесімен басталды, содан кейін ОС-тің басқа маңызды бөліктеріне – тапсырмаларға, жіптерге және виртуалды жадқа көшті. Бөліктер аяқталған сайын BSD жүйесінің әртүрлі бөліктері Mach-ке шақыру үшін қайта жазылды, және осы процесте 4.3BSD-ге де өзгерістер енгізілді. 1986 жылға қарай жүйе DEC VAX машинасының үстінде дербес жұмыс істеуге қабілетті болды. Бұл тәжірибелік құндылығы көп болмаса да, микроядро жасау мақсаты іске асырылды. Осыған ілесіп, IBM RT PC және Sun Microsystems 68030 негізіндегі жұмыс станцияларына арналған нұсқалар да пайда болды, бұл жүйенің тасымалданатындығын көрсетті. 1987 жылға қарай тізімге Encore Multimax және Sequent Balance машиналары қосылды, олар Mach-тің көппроцессорлық жүйелерде жұмыс істеу мүмкіндігін сынап көрді. Сол жылы Release 1 шығарылды, ал келесі жылы Release 2 жарық көрді. Осы уақытқа дейін "нағыз" микроядроның уәдесі орындалмады. Mach-тің осы ерте нұсқалары 4.3BSD-нің көп бөлігін ядроға, POE Server деп аталатын жүйеге біріктірді, нәтижесінде ядро UNIX-тен тіпті үлкен болды. Дегенмен, мақсат UNIX қабатын ядродан пайдаланушы кеңістігіне көшіру болды, онда оны оңайрақ өңдеуге және тіпті толығымен алмастыруға болады. Алайда, өнімділік үлкен мәселе болып шықты, сондықтан бұл мәселені шешу үшін бірқатар архитектуралық өзгерістер енгізілді. UNIX лицензиясымен байланысты қиындықтар зерттеушілерді де мазалады, сондықтан лицензияланбаған UNIX сияқты жүйелік ортаны ұсынуға жасалған бұл алғашқы әрекет Mach-тің одан әрі дамуына дейін пайдалы болып келді. Нәтижесінде 1990 жылы шыққан Mach 3 үлкен қызығушылық тудырды. Шағын команда Mach-ті жасап, оны көптеген платформаларға, соның ішінде ескі стильдегі ядроларға қиындық туғызатын күрделі көппроцессорлық жүйелерге көшірді. Бұл коммерциялық нарықта үлкен қызығушылықты тудырды, онда бірқатар компаниялар жабдық платформасын өзгертуді қарастырып жатқан еді. Егер қолданыстағы жүйені Mach-ке көшіруге мүмкіндік болса, онда төмендегі платформаны өзгерту оңай болар еді. Mach ашық бағдарламалық қамтамасыз ету қорының (OSF) болашақ OSF/1 нұсқаларын Mach 2.5 негізінде орналастыратынын және Mach 3-ті де зерттейтінін жариялағанда үлкен даңққа ие болды. Mach 2.5 NeXTSTEP жүйесі үшін де, сондай-ақ бірқатар коммерциялық көппроцессорлық өндірушілер үшін де таңдалды. Mach 3 микроядро үшін басқа операциялық жүйелердің бөліктерін порттауға көптеген әрекеттерге әкелді, соның ішінде IBM-нің Workplace OS және Apple-дің классикалық Mac OS-тің кросс-платформалық нұсқасын құруға жасалған бірнеше әрекеттер.
Орындау мәселелері
Mach бастапқыда классикалық монолитті UNIX-тің орнын алмастыруға арналған еді, сондықтан UNIX-қа ұқсас көптеген идеяларды қамтыды. Мысалы, Mach UNIX файлдық жүйесіндегідей рұқсаттар мен қауіпсіздік жүйесін пайдаланды. Ядро басқа операциялық жүйе серверлері мен бағдарламалық құралдардан артық құқықтарға ие болғандықтан, бұзылған немесе қасақана зиян келтіретін бағдарламалар жүйеге зақым келтіретін командаларды жіберуі мүмкін еді, сондықтан ядро әрбір хабарламаның дұрыстығын тексерді. Сонымен қатар, операциялық жүйенің көп бөлігі пайдаланушы кеңістігіндегі бағдарламаларда орналасуы керек еді, демек ядроның осы бағдарламаларға қосымша құқықтар беруінің бір жолы болуы керек еді, мысалы, аппараттық құралдарға тікелей қол жеткізу үшін. Mach-тың кейбір ерекше ерекшеліктері де осы IPC механизміне негізделген. Мысалы, Mach көппроцессорлық машиналарды оңай қолдауға қабілетті болды. Дәстүрлі ядрода оны қайта кіріктіру немесе үзіліске келтіру үшін көп жұмыс істеу қажет, себебі әртүрлі процессорларда жұмыс істейтін бағдарламалар бір уақытта ядроны шақыруы мүмкін. Mach-та операциялық жүйенің бөліктері серверлерде оқшауланған, олар кез келген басқа бағдарлама сияқты кез келген процессорда жұмыс істей алады. Теориялық тұрғыдан алғанда, Mach ядросы да қайта кіріктірілуі керек болса да, практикада бұл мәселе емес, себебі оның жауап беру уақыты өте жылдам, ол тек күтіп, сұраныстарды кезекпен орындай алады. Mach сонымен қатар бағдарламалар арасында ғана емес, сонымен қатар 1980 жылдардың соңы мен 1990 жылдардың басында қарқынды дамыған желі арқылы хабарламаларды жібере алатын серверді қамтыды. Айырықша жағдай, IPC-ні барлық тапсырмалар үшін пайдалану өнімділікке елеулі әсер етті. 1997 жылғы аппараттық сынақтар көрсеткендей, Mach 3.0 негізіндегі UNIX бір серверлік жүзеге асырулары туған UNIX-тен шамамен 50% баяу болды. Өнімділік мәселелерінің нақты себептерін зерттеу бірқатар қызықты деректерді анықтады. Біріншісі, өзінің IPC-сі мәселе емес еді: оны қолдау үшін қажетті жадты бейнелеумен байланысты кейбір қосымша шығындар болды, бірақ бұл шақыру жасауға аз ғана уақыт қосты. Қалған 80% уақыт ядроның хабарламаларда орындаған қосымша тапсырмаларына байланысты болды. Олардың ішінде порттық құқықтарды тексеру және хабарламаның дұрыстығы басты орын алды. 486DX 50 стандартты UNIX жүйелік шақыруын орындау үшін орташа есеппен 21 мкс, ал Mach IPC-мен тең операцияны орындау үшін орташа есеппен 114 мкс қажет болды. Оның тек 18 мкс-і аппараттық жабдыққа байланысты болды; қалғаны хабарда әртүрлі ретті орындайтын Mach ядросы болды. Ешқандай операция жасамайтын syscall үшін, BSD-де толық циклға шамамен 40 мкс қажет болады, ал Mach пайдаланушы кеңістігінде 500 мкс-тен аз уақыт кетеді. Mach 2.x нұсқаларында алғаш рет қолданылған кезде, өнімділік дәстүрлі монолитті операциялық жүйелерден баяу болды, мүмкін 25%-ға дейін. Мысалы, жүйелік уақытты алу жүйелік сағатты ұстап тұратын пайдаланушы кеңістігі серверіне IPC шақыруын қамтиды. Шақырушы ең алдымен ядроға кіріп, контекстті ауыстырып, жадты бейнелейді. Содан кейін ядро шақырушының кіру құқықтары бар екенін және хабарламаның дұрыс екенін тексереді. Егер ол дұрыс болса, пайдаланушы кеңістігі серверіне шақыруды аяқтау үшін басқа контексттік ауыстыру және жадты бейнелеу жүзеге асырылады. Нәтижелерді қайтару үшін процесті қайталау керек, барлығы төрт контексттік ауыстыру және жадты бейнелеу, сонымен қатар екі хабарламаны тексеруді қамтиды. Бұл үстіртке тез арада күрделі қызметтер қосылады, онда көптеген серверлерден өтетін код жолдары жиі болады. Бұл өнімділік проблемаларының жалғыз себебі емес. Екіншісі физикалық жадтың жетіспеуі және беттік ауыстыру қажет болған кезде жадты дұрыс басқаруға тырысудың проблемаларына бағытталған. Дәстүрлі монолитті операциялық жүйелерде авторлар ядроның қай бөлігі басқаларын шақыратынын тікелей білген, бұл оларға Пайгерді пайдалану алдындағы кодты беттік ауыстырудан сақтау үшін толығымен баптау мүмкіндігін берді. Mach-та бұл мүмкін емес еді, себебі ядро операциялық жүйенің неден тұратындығы туралы нақты түсінік бермеді. Оның орнына олар бір өлшемді барлық шешімді қолдануы керек болды, бұл өнімділік проблемаларын арттырды. Mach 3 осы мәселені қарапайым пейджерді ұсыну арқылы шешуге тырысты, ол жақсы мамандану үшін пайдаланушы кеңістігіндегі пейджерлерге сүйенді. Бірақ бұл аз әсер етті. Іс жүзінде, оның кез келген артықшылықтары оны шақыру үшін қажетті қымбат IPC-мен жойылды. Басқа өнімділік проблемалары Mach-тың көппроцессорлық жүйелерді қолдауымен байланысты болды. 1980 жылдардың ортасынан 1990 жылдардың басына дейін, тұтынушылық процессорлардың өнімділігі жылына шамамен 60% өсті, бірақ жадқа қол жеткізу жылдамдығы жылына тек 7% ғана өсті. Бұл жадқа қол жеткізу құны осы кезеңде үлкендей түсті дегенді білдіреді, және Mach бағдарламалар арасында жадты бейнелеуге негізделгендіктен, кез келген "кэштен қалу" IPC шақыруларын баяулатты.
Мүмкін болатын шешімдер
Mach 3 жүйелері үшін IPC жүктемесі маңызды мәселе болып табылады. Дегенмен, көп серверлі операциялық жүйе тұжырымы әлі де перспективалы, бірақ оған тағы да зерттеулер қажет. Дамытушылар кодты серверден серверге шақырылым жасамау үшін модульдерге бөлуге мұқият болуы керек. Мысалы, желілік кодтың көп бөлігі бір серверде орналастырылуы мүмкін, осылайша қалыпты желілік тапсырмалар үшін IPC азайтылады. Көптеген дамытушылар операциялық жүйенің функционалдығын қамтамасыз ететін бір үлкен сервер болатын POE-нің бастапқы тұжырымында қалды. Дамуды жеңілдету үшін олар операциялық жүйе серверіне пайдаланушы кеңістігінде немесе ядро кеңістігінде жұмыс істеуге рұқсат берді. Бұл оларға пайдаланушы кеңістігінде дамуға және бастапқы Mach идеясының барлық артықшылықтарына ие болуға мүмкіндік берді, содан кейін жөнделген серверді жақсы өнімділік алу үшін ядро кеңістігіне көшіруге болады. Осы әдіс қолданылып бірнеше операциялық жүйелер құрылды, олардың ішінде Lites, MkLinux, OSF/1 және NeXTSTEP/OPENSTEP/macOS. Chorus микроядросы мұны негізгі жүйенің мүмкіндігіне айналдырды, бұл серверлерді орнатылған механизмдерді пайдаланып ядро кеңістігіне көтеруге мүмкіндік берді. Mach 4 осы мәселелерді шешуге тырысты, бұл жолы радикалды жаңартулармен. Атап айтқанда, бағдарламалық кодтың көбінесе жазуға болатыны анықталды, сондықтан жазу кезінде көшіруден туындайтын әсерлер сирек кездеседі. Сондықтан IPC үшін бағдарламалар арасындағы жадты бейнелеудің қажеті болмады, керісінше, қолданылып жатқан бағдарламалық кодты бағдарламаның жергілікті кеңістігіне көшіру дұрыс болды. Бұл «шаттлдар» тұжырымына әкелді және өнімділік жақсарғандай болды, бірақ дамытушылар жүйені жартылай қолданылатын күйде қалдырды. Mach 4 сонымен қатар ядроның бір бөлігіне айналған колокация примитивтерін енгізді. 1990 жылдардың ортасына қарай микроядролық жүйелер бойынша жұмыстар көбінесе тоқтап қалды, бірақ нарықта барлық заманауи операциялық жүйелер 1990 жылдарға қарай микроядролық негізде болады деп есептелді. Mach ядросының кеңінен қолданылатын қалған түрлері Apple-дің macOS және оның туысқан iOS, олар OSF/1-де де қолданылатын «XNU» деп аталатын Open Software Foundation Mach Kernel (OSFMK 7.3) гибридті модификацияланған нұсқасымен жұмыс істейді. XNU-да файлдық жүйелер, желілік стектер және процестер мен жадты басқару функциялары ядрода жүзеге асырылады; файлдық жүйе, желілік және процестер мен жадты басқарудың кейбір функциялары хабар алмасудың орнына қарапайым жүйелік шақырулар арқылы пайдаланушы режимінен шақырылады; XNU-дың Mach хабарламалары пайдаланушы режиміндегі процестер арасындағы байланыс үшін, сондай-ақ пайдаланушы режиміндегі кодтан ядроға және ядродан пайдаланушы режиміндегі серверлерге келетін кейбір сұраулар үшін қолданылады.
Екінші буын микрожеделдер
Қосымша талдау IPC өнімділігінің мәселесі көрінетіндей айқын емес екенін көрсетті. Естеріңізге сала кетейік, macOS, iOS, iPadOS, watchOS және tvOS негізінде жатқан BSD жүйесінде бір syscall шақыруы 20 микросекунд алды.