Як ядро ​​Linux порівнює порівняно з архітектурами мікроядер?


39

Одного разу я прочитав, що однією з переваг архітектури мікроелемента є те, що ви можете зупинити / запустити такі важливі сервіси, як мережа та файлові системи, не потребуючи перезавантаження всієї системи. Але враховуючи, що ядро ​​Linux (як це завжди було?) Пропонує можливість використовувати модулі для досягнення того ж ефекту, які (залишилися) переваги мікрокереля?



1
Ви можете прочитати дебати про MicroKernel vs Monolithic ядро. oreilly.com/openbook/opensources/book/appa.html У цьому документі Ендрю Таненбаум підтримує Microkernel, а Лінус Торвальдс підтримує монолітне ядро.
Бхуван

Відповіді:


35

Мікроядер вимагає менше коду для запуску у найпотужнішому, найбільш надійному режимі, ніж монолітні ядра . Це має багато аспектів, таких як:

  • Мікропровідники дозволяють завантажувати та вивантажувати за бажанням не основні функції (наприклад, драйвери для апаратного забезпечення, яке не підключено чи не використовується). Це в основному досягається в Linux через модулі.
  • Мікроядра є більш надійними: якщо не-ядерний компонент вийде з ладу, він не візьме з собою всю систему. Помилкова файлова система або драйвер пристрою може вийти з ладу системи Linux. У Linux немає жодного способу усунення цих проблем, крім методів кодування та тестування.
  • Microkernel мають меншу надійну обчислювальну базу . Тому навіть шкідливий драйвер пристрою або файлова система не може взяти під контроль усю систему (наприклад, драйвер сумнівного походження для вашого останнього гаджета USB не зможе прочитати ваш жорсткий диск).
  • Наслідком попереднього пункту є те, що звичайні користувачі можуть завантажувати власні компоненти, які були б компонентами ядра в монолітному ядрі.

Графічні інтерфейси Unix надаються через вікно X, яке є кодом користувача (за винятком (частини) драйвера відеопристрою). Багато сучасних програм дозволяють звичайним користувачам завантажувати драйвери файлової системи через FUSE . Деякі фільтрації мережевих пакетів Linux можна виконати в userland. Однак драйвери пристроїв, планувальники, менеджери пам'яті та більшість мережевих протоколів все ще залишаються лише в ядрі.

Класичне (якщо датується) читання про Linux та мікропрограми - це дискусія Таненбаума — Торвальда . Через двадцять років можна сказати, що Linux дуже повільно рухається до мікроядерної структури (завантажувані модулі з'явилися на початку, FUSE є останніми), але ще триває шлях.

Ще одне, що змінилося, - це підвищена актуальність віртуалізації на настільних комп'ютерах та вбудованих комп'ютерах високого класу: для деяких цілей відповідна різниця не між ядром та користувачем, а між гіпервізором та запрошеними ОС.



1
Це все дуже приємна теорія. Якщо пристрій якось заклиниться, система тостує. Якщо драйвер виходить з ладу на півдорозі через операцію, жодне перезавантаження драйвера не поверне систему у функціональний стан. Якщо ви хочете взагалі будь-яку продуктивність, драйвери повинні бути багатопоточними ... і перевага "одного планувальника" повністю втрачається. Хочете продуктивності, ви повинні уникати (дедалі дорожчих) копій пам'яті та контекстних комутаторів ... і "модульність" втрачається. Подивіться розміри деяких мікроядер, і ви побачите, що вони за розмірами та складністю порівнянні з монолітними ядрами із включеними драйверами .
фонбранд

15

Мікроядер обмежує час перебування системи в режимі ядра, на відміну від простору користувачів, абсолютним можливим мінімумом.

Якщо в режимі ядра відбувається збій, все ядро ​​виходить з ладу, а це означає, що вся система виходить з ладу. Якщо в режимі користувача відбувається збій, просто цей процес приходить вниз. Linux є надійним у цьому плані, але все ще можливо будь-якій підсистемі ядра записати в пам'ять будь-якої іншої підсистеми ядра, цілеспрямовано або випадково.

Концепція мікроядра містить багато речей, які традиційно в режимі ядра, такі як мережа та драйвери пристроїв, в просторі користувачів. Оскільки мікроядро насправді не відповідає за багато, це також означає, що воно може бути простішим і надійнішим. Подумайте про те, як протокол IP, будучи простим і нерозумним, насправді призводить до надійних мереж, підштовхуючи складність до країв і залишаючи ядро ​​слабким і середнім.


5

Дякуємо, що розмістили посилання на матеріал для читання! Точка Brent W в рефераті - це звук, і я певною мірою співпереживаю занепокоєння Крістофа L з приводу надскладності в механізмах синхронізації мікроядер; однак, я думаю, що в останньому документі можливо пропускати петлі подій на основі повідомлень. Оскільки петлі подій не діляться пам’яттю один з одним, блокування не потрібне, і оскільки (IMO) вони надають стиль декларативного кодування, послідовний алгоритм може бути чітко визначений (точка обчислення лямбда ...) - Я зазвичай кодую програми, але цей Q був приємним досвідом навчання
антропічний андроїд

1

Погляньте на архітектуру x86 - для монолітного ядра використовуються лише кільця 0 і 3. Справді. Але, знов, це може бути швидше, через меншу зміну контексту.

кільця x86


Структура кільця x86 просто перенапружена. Немає практичного використання (окрім віртуальних машин, але це все частіше використовується ...)
vonbrand

1
  1. Монолітичне ядро ​​набагато старше мікрокенера . Він використовується в Unix, в той час як ідея мікроядер з'явилася наприкінці 1980-х .

  2. Прикладами ОС, що мають монолітні ядра, є UNIX, LINUX, тоді як ОС, що мають мікроядер, - це QNX, L4, HURD і спочатку Mach (а не MacOS X), які згодом були перетворені в гібридне ядро. Навіть MINIX не є чистим мікроядром, оскільки його драйвери пристроїв збираються як частина ядра.

  3. Монолітні ядра швидші, ніж мікроядра . Перший мікроядер Маха на 50% повільніше, ніж монолітні ядра. Більш пізні версії, як L4, лише на 2% або на 4% повільніше, ніж монолітне ядро .

  4. Монолітні ядра, як правило, громіздкі, тоді як чистий мікроядер має бути невеликих розмірів , навіть вписуватися в кеш-пам'ять першого рівня процесора (мікрокерелля першого покоління).

  5. У монолітних ядрах драйвери пристроїв перебувають у просторі ядра, тоді як драйвери пристроїв мікрокенера розташовані в просторі користувача .

  6. Оскільки драйвери пристроїв перебувають у просторі ядра, це робить монолітне ядро менш захищеним, ніж мікрокерел (Збій у драйвері може призвести до збою). Мікрохвилі більш безпечні, ніж монолітні ядра, тому вони використовуються у багатьох військових пристроях.

  7. Монолітні ядра використовують сигнали та розетки, щоб забезпечити IPC, тоді як підхід мікрокенера використовує черги повідомлень . 1- й рід мікроелементів погано реалізував IPC, тому вони були повільними на контекстних комутаторах.

  8. Додавання нових функцій до монолітної системи означає перекомпіляцію всього ядра, тоді як ви можете додати нову функцію чи патчі без повторної компіляції


У (4) ви порівнюєте яблука та кавуни. Сам мікроядер (за конструкцією) містить лише мінімальну функціональність, монолітне ядро ​​містить набагато більше. (6) - це приємна теорія, вона залежить від того, наскільки грамотно розроблені шматки, і наскільки пропускний реальний механізм IPC (для продуктивності це не може бути реальним "передачею повідомлення"). Примітка (7) означає дуже складну обробку "черг повідомлень", тим самим здебільшого заперечуючи їх переваги. Для (8), у випадку, наприклад, Linux, безумовно, можливо скласти модуль, незалежний від ядра. Це звичайно робиться для розвитку драйверів, насправді.
фонбранд

0

Windows NT (ядро, що лежить в основі поточних систем Windows) почав бути досить ванільним дизайном мікроядер. Через проблеми з продуктивністю все більше і більше кодів "userland" мігрує в "micokernel" ... сьогодні його структура мікроелементів є вестигіальною.


-1

Справа в тому, що ядро ​​Linux є гібридом монолітного і мікрокенерального. У чистому монолітному виконанні немає модулів, що завантажуються під час виконання.


9
це не. той факт, що модулі завантажуються динамічно, не змінює факту, що вони запускаються з повними привілеями ядра, і як частина монолітного ядра.
vartec

3
Для гібридного дизайну було б важливіше, коли деякі драйвери (для USB, сканерів, принтерів та графіки) реалізовані в просторі користувачів, а не в ядрі. Відмінність не є чіткою, і Linux може бути визначений як гібридне ядро, оскільки є libusb, sane, чашки та mesa - не тому, що є insmod та rmmod.
Maciej Piechotka

-1

Терміни monolithic kernelі microkernelне може бути серйозно по порівнянні , оскільки вони описують різні аспекти розробки ядра (структура розміру по порівнянні з ).

Типовим монолітним ядром було ядро ​​SunOS-4.x, а Linux все ще схожий, оскільки ви вручну налаштовуєте вміст базового ядра.

Ядро Solaris (починаючи з 2.1 по 1992 р.) Вже не можна назвати монолітним, оскільки всі драйвери завантажуються автоматично на вимогу, а під час початкового завантаження завантажується лише крихітна частина.

SunOS-4.x і Solaris (SunOS-5.x) та Linux - це все реалізація одного контексту. Весь їх код працює в єдиному контексті MMU.

Mac OS X заснований на Mach і працює як багатоконтекстна реалізація з декількома процесами, розділеними контекстами MMU. У цій концепції водії знаходяться в окремих процесах та окремому контексті MMU.

Багато хто називає Mac OS X "мікроядерною системою", але, можливо, базове ядро ​​не менше основного ядра від Solaris.

Таким чином, здається , що було б краще говорити про single context kernelsVS. multi context kernels.


1
MacOS виконує (по суті, монолітну) BSD прокладку над мікроядром. Ніякого поділу на окремі процеси взагалі немає, не справжній дизайн мікроядер.
фонбранд

1
Тож ви визнаєте дизайн, який використовує щонайменше два так званих ядра. Термін microkernelтак чи інакше неправильний, оскільки він зазвичай використовується для чогось, що слід називати multi context kernel.
schily
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.