Jak jądro Linuksa wypada w porównaniu z architekturami mikrojądra?

38

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?

tshepang
źródło
5
Na temat mikrokerneli i Linuksa zapoznaj się również z bardzo dobrą odpowiedzią na pytanie „Dlaczego Linux jest nazywany monolitycznym jądrem” .
Gilles „SO- przestań być zły”
1
Możesz przeczytać debatę na temat jądra MicroKernel kontra monolityczny. oreilly.com/openbook/opensources/book/appa.html W tym artykule Andrew Tanenbaum obsługuje Microkernel, a Linus Torvalds obsługuje jądro monolityczne.
Bhuwan,

Odpowiedzi:

35

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:

  • Mikrojądra pozwalają na ładowanie i rozładowywanie nie-podstawowych funkcji (takich jak sterowniki sprzętu, który nie jest podłączony lub nie jest używany). Można to osiągnąć głównie w systemie Linux, za pośrednictwem modułów.
  • Mikrojądra są bardziej niezawodne: jeśli ulegnie awarii komponent inny niż jądro, nie zajmie to całego systemu. Błędny system plików lub sterownik urządzenia może spowodować awarię systemu Linux. Linux nie ma innego sposobu na złagodzenie tych problemów poza praktykami kodowania i testowaniem.
  • Mikrojądra mają mniejszą zaufaną bazę obliczeniową . Dlatego nawet złośliwy sterownik urządzenia lub system plików nie może przejąć kontroli nad całym systemem (na przykład sterownik wątpliwego pochodzenia dla najnowszego gadżetu USB nie byłby w stanie odczytać dysku twardego).
  • Konsekwencją poprzedniego punktu jest to, że zwykli użytkownicy mogą ładować własne komponenty, które byłyby komponentami jądra w monolitycznym jądrze.

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.

Gilles „SO- przestań być zły”
źródło
1
To wszystko bardzo ładna teoria. Jeśli urządzenie w jakiś sposób zaklinuje się, system się wznosi. Jeśli sterownik ulegnie awarii w połowie operacji, brak ponownego uruchomienia sterownika przywróci system do stanu funkcjonalnego. Jeśli chcesz mieć jakąkolwiek wydajność, sterowniki muszą być wielowątkowe ... a zaleta „jednego harmonogramu” jest całkowicie utracona. Chcesz wydajności, musisz unikać (coraz bardziej kosztownych) kopii pamięci i przełączników kontekstu ... a „modułowość” zostaje utracona. Sprawdź rozmiary niektórych mikrojądra, a zobaczysz, że mają one porównywalny rozmiar i złożoność do monolitycznych jąder z dołączonymi sterownikami .
vonbrand
15

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.

LawrenceC
źródło
5

Powinieneś przeczytać drugą stronę problemu:

Ekstremalnie wydajne obliczenia lub dlaczego mikrokernele są do kitu

System plików należy do jądra

Bruce Ediger
źródło
Dziękujemy za opublikowanie linków do materiałów do czytania! Abstrakt Brenta W jest dźwiękiem i do pewnego stopnia rozumiem obawy Christopha L o nadmierną złożoność mechanizmów synchronizacji mikrojądra; Myślę jednak, że ten ostatni artykuł może przeoczyć pętle zdarzeń oparte na wiadomości. Ponieważ pętle zdarzeń nie dzielą ze sobą pamięci, blokada nie jest potrzebna, a ponieważ (IMO) nadają się do deklaratywnego stylu kodowania, można jednoznacznie zdefiniować spójny algorytm (punkt rachunku lambda ...) - Zwykle piszę aplikacje, ale to Q było przyjemną nauką
antropiczny android
1

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.

pierścienie x86

vartec
źródło
Struktura pierścienia x86 to po prostu nadinżynieria. Bez praktycznego zastosowania (z wyjątkiem maszyn wirtualnych, ale jest to coraz częściej używane ...)
vonbrand
1
  1. 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 .

  2. 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.

  3. 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 .

  4. 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).

  5. 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 .

  6. 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.

  7. 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.

  8. Dodanie nowych funkcji do systemu monolitycznego oznacza rekompilację całego jądra, podczas gdy można dodawać nowe funkcje lub łatki bez ponownej kompilacji

Rahul Bhadana
źródło
W (4) porównujesz jabłka i arbuzy. Sam mikrojądro (z założenia) zawiera tylko minimalną funkcjonalność, monolityczne jądro zawiera znacznie więcej. (6) jest ładną teorią, zależy od tego, jak kompetentnie są opracowywane elementy i od tego, jak nieszczelny jest prawdziwy mechanizm IPC (dla wydajności nie może to być prawdziwe „przekazywanie wiadomości”). Uwaga (7) oznacza bardzo złożoną obsługę „kolejek komunikatów”, w ten sposób głównie negując ich zalety. Dla (8), w przypadku np. Linuksa z pewnością można skompilować moduł niezależny od jądra. W rzeczywistości jest to rutynowo wykonywane w celu opracowania sterowników.
vonbrand
0

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.

vonbrand
źródło
-1

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
9
to nie jest. fakt, że moduły ładowane są dynamicznie, nie zmienia faktu, że są one uruchamiane z pełnymi uprawnieniami jądra i jako część jądra monolitycznego.
vartec
3
W przypadku projektowania hybrydowego ważniejsze byłoby, gdyby niektóre sterowniki (dla USB, skanerów, drukarek i grafiki) były zaimplementowane w przestrzeni użytkownika, a nie w jądrze. Rozróżnienie nie jest jasne, a Linux można określić jako jądro hybrydowe, ponieważ istnieje libusb, sane, cups i mesa - nie dlatego, że istnieje insmod i rmmod.
Maciej Piechotka
-1

Pojęć monolithic kerneli microkernelnie 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 kernelskontra multi context kernels.

schily
źródło
1
MacOS uruchamia (zasadniczo monolityczny) podkładkę BSD na mikrojądrze. W ogóle nie ma podziału na osobne procesy, a nie prawdziwy projekt mikrojądra.
vonbrand
1
Przyznajesz więc projekt, który wykorzystuje co najmniej dwa tak zwane procesy jądra. Termin i microkerneltak jest niepoprawny, ponieważ zwykle jest używany w odniesieniu do czegoś, co należy nazwać multi context kernel.
schily