Przeczytałem kiedyś, że jedną z zalet architektury mikrojądra jest to, że możesz zatrzymać / uruchomić niezbędne usługi, takie jak sieć i systemy plików, bez konieczności restartowania całego systemu. Ale biorąc pod uwagę, że obecnie jądro Linuksa (czy zawsze tak było?) Oferuje opcję użycia modułów w celu osiągnięcia tego samego efektu, jakie są (pozostałe) zalety mikrojądra?
38
Odpowiedzi:
Mikrojądra wymagają mniej kodu do uruchomienia w najbardziej wewnętrznym, najbardziej zaufanym trybie niż jądra monolityczne . Ma to wiele aspektów, takich jak:
Uniksowe interfejsy GUI są dostarczane przez okno X, które jest kodem użytkownika (oprócz (części) sterownika urządzenia wideo). Wiele nowoczesnych unikatów pozwala zwykłym użytkownikom ładować sterowniki systemu plików za pomocą FUSE . Niektóre z filtrowania pakietów sieciowych Linuksa można wykonać w przestrzeni użytkownika. Jednak sterowniki urządzeń, harmonogramy, menedżery pamięci i większość protokołów sieciowych są nadal przeznaczone tylko dla jądra.
Klasyczną (jeśli nie datowaną) lekturą na temat Linuksa i mikrojądra jest debata Tanenbaum – Torvalds . Dwadzieścia lat później można powiedzieć, że Linux bardzo powoli zmierza w kierunku struktury mikrojądra (moduły ładowalne pojawiły się wcześnie, FUSE jest nowszy), ale przed nami jeszcze długa droga.
Kolejną rzeczą, która się zmieniła, jest zwiększone znaczenie wirtualizacji na komputerach stacjonarnych i wysokiej klasy komputerach wbudowanych: dla niektórych celów istotnym rozróżnieniem nie jest jądro i przestrzeń użytkownika, ale hiperwizor i systemy operacyjne gościa.
źródło
Mikrojądro ogranicza czas działania systemu w trybie jądra, w przeciwieństwie do przestrzeni użytkownika, do absolutnego minimum.
Jeśli awaria nastąpi w trybie jądra, całe jądro ulegnie awarii, co oznacza, że cały system ulegnie awarii. Jeśli awaria nastąpi w trybie użytkownika, tylko ten proces się kończy. Linux jest pod tym względem solidny, ale nadal możliwe jest, aby dowolny podsystem jądra zapisał w pamięci dowolnego innego podsystemu jądra, celowo lub przypadkowo.
Koncepcja mikrojądra umieszcza w przestrzeni użytkownika wiele rzeczy, które są tradycyjnie w trybie jądra, takie jak sterowniki sieciowe i urządzenia. Ponieważ mikrojądro nie jest tak naprawdę odpowiedzialne za wiele, oznacza to również, że może być prostsze i bardziej niezawodne. Pomyśl, w jaki sposób protokół IP, ponieważ jest prosty i głupi, naprawdę prowadzi do niezawodnych sieci, przesuwając złożoność do granic i pozostawiając rdzeń ubogi i średni.
źródło
Powinieneś przeczytać drugą stronę problemu:
Ekstremalnie wydajne obliczenia lub dlaczego mikrokernele są do kitu
System plików należy do jądra
źródło
Spójrz tylko na architekturę x86 - monolityczne jądro używa tylko pierścieni 0 i 3. Naprawdę marnotrawstwo. Ale potem znowu może być szybciej, z powodu mniejszego przełączania kontekstu.
źródło
Jądro monolityczne jest znacznie starsze niż mikrojądro . Jest używany w Uniksie, podczas gdy idea mikrojądra pojawiła się pod koniec lat osiemdziesiątych .
Przykładami systemów operacyjnych posiadających monolityczne jądra są UNIX, LINUX, natomiast systemy operacyjne posiadające mikrojądro to QNX, L4, HURD i początkowo Mach (nie MacOS X), który później został przekształcony w jądro hybrydowe. Nawet MINIX nie jest czystym mikrojądrem, ponieważ jego sterowniki urządzeń są kompilowane jako część jądra.
Jądra monolityczne są szybsze niż mikrojądra . Pierwsze mikrojądro Macha jest o 50% wolniejsze niż jądra monolityczne. Późniejsze wersje, takie jak L4, są tylko 2% lub 4% wolniejsze niż monolityczne jądro .
Jądra monolityczne są na ogół nieporęczne, podczas gdy czyste mikrojądro musi być małe , a nawet zmieścić się w pamięci podręcznej pierwszego poziomu procesora (mikrojądrze pierwszej generacji).
W jądrach monolitycznych sterowniki urządzeń znajdują się w przestrzeni jądra, podczas gdy w sterownikach mikrojądra znajdują się w przestrzeni użytkownika .
Ponieważ sterowniki urządzeń znajdują się w przestrzeni jądra, sprawia, że monolityczne jądro jest mniej bezpieczne niż mikrojądro (awaria sterownika może doprowadzić do awarii). Mikrojądra są bezpieczniejsze niż jądra monolityczne, dlatego są używane w wielu urządzeniach wojskowych.
Jądra monolityczne używają sygnałów i gniazd, aby zapewnić IPC, podczas gdy podejście mikrojądra wykorzystuje kolejki komunikatów . W 1 st gen z mikrojądro słabo realizowane IPC tak były powolne przełączników kontekście.
Dodanie nowych funkcji do systemu monolitycznego oznacza rekompilację całego jądra, podczas gdy można dodawać nowe funkcje lub łatki bez ponownej kompilacji
źródło
Windows NT (jądro bazowe dla obecnych systemów Windows) zaczął jako dość waniliowy projekt mikrojądra. Z powodu problemów z wydajnością coraz więcej kodu „użytkownika” migruje do „mikrokernelu” ... dziś jego struktura mikrojądra jest szczątkowa.
źródło
Chodzi o to, że jądro Linuksa jest hybrydą monolitu i mikrojądra. W czystej monolitycznej implementacji nie ma modułów ładowanych w czasie wykonywania.
źródło
Pojęć
monolithic kernel
imicrokernel
nie można ich poważnie porównać, ponieważ opisują różne aspekty projektowania jądra (struktura vs. rozmiar).Typowym jądrem monolitycznym było jądro SunOS-4.x, a Linux jest nadal podobny, ponieważ ręcznie konfigurujesz zawartość podstawowego jądra.
Jądra systemu Solaris (od wersji 2.1 w 1992 r.) Nie można już nazywać monolitem, ponieważ wszystkie sterowniki są ładowane automatycznie na żądanie, a podczas początkowego ładowania ładowana jest tylko niewielka część.
SunOS-4.x i Solaris (SunOS-5.x) i Linux są implementacjami pojedynczego kontekstu. Cały ich kod działa w jednym kontekście MMU.
Mac OS X jest oparty na Machu i działa jako implementacja wielu kontekstów z kilkoma procesami oddzielonymi kontekstami MMU. W tej koncepcji sterowniki są w osobnych procesach i osobnych kontekstach MMU.
Wiele osób nazywa Mac OS X „systemem mikrojądra”, ale być może podstawowe jądro nie jest mniejsze od podstawowego jądra systemu Solaris.
Wygląda więc na to, że lepiej byłoby porozmawiać o
single context kernels
kontramulti context kernels
.źródło
microkernel
tak jest niepoprawny, ponieważ zwykle jest używany w odniesieniu do czegoś, co należy nazwaćmulti context kernel
.