Как ядро ​​Linux сравнивается с микроядерными архитектурами?

39

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

tshepang
источник
5
Что касается микроядра и Linux, см. Также этот очень хороший ответ на вопрос «Почему Linux называется монолитным ядром» .
Жиль "ТАК ... перестать быть злым"
1
Вы можете прочитать дебаты о ядре MicroKernel и Monolithic. oreilly.com/openbook/opensources/book/appa.html В этой статье Эндрю Таненбаум поддерживает микроядро, а Линус Торвальдс поддерживает монолитное ядро.
Bhuwan

Ответы:

35

Микроядро требует меньше кода для запуска в самом внутреннем и наиболее надежном режиме, чем монолитные ядра . Это имеет много аспектов, таких как:

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

Графические интерфейсы Unix предоставляются через окно X, которое является кодом пользователя (за исключением (часть) драйвера видеоустройства). Многие современные устройства позволяют обычным пользователям загружать драйверы файловой системы через FUSE . Некоторая фильтрация сетевых пакетов в Linux может быть выполнена в пользовательском пространстве. Тем не менее, драйверы устройств, планировщики, диспетчеры памяти и большинство сетевых протоколов по-прежнему только для ядра.

Классическим (если он датируется) прочтением о Linux и микроядрах является дискуссия о Таненбауме-Торвальдсе . Двадцать лет спустя можно было бы сказать, что Linux очень и очень медленно движется в направлении структуры микроядра (загружаемые модули появились на ранних этапах, FUSE появился совсем недавно), но впереди еще долгий путь.

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

Жиль "ТАК - прекрати быть злым"
источник
1
Это все очень хорошая теория. Если устройство как-то заклинивает, система работает на тосте. Если во время операции происходит сбой драйвера на полпути, перезапуск драйвера не восстановит работоспособность системы. Если вам нужна какая-либо производительность, драйверы должны быть многопоточными ... и преимущество "одного планировщика" полностью потеряно. Чтобы добиться производительности, вы должны избегать (все более дорогостоящих) копий памяти и переключений контекста ... и «модульность» теряется. Посмотрите размеры некоторых микроядер, и вы увидите, что они сопоставимы по размеру и сложности с монолитными ядрами с включенными драйверами .
vonbrand
15

Микроядро ограничивает время, в течение которого система находится в режиме ядра, в отличие от пространства пользователя, до максимально возможного минимума.

Если происходит сбой в режиме ядра, все ядро ​​выходит из строя, а это означает, что вся система выходит из строя. Если происходит сбой в пользовательском режиме, просто этот процесс прекращается. Linux является надежным в этом отношении, но любая подсистема ядра все еще может перезаписывать память любой другой подсистемы ядра, целенаправленно или случайно.

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

LawrenceC
источник
5

Вы должны прочитать другую сторону вопроса:

Чрезвычайно высокая производительность вычислений или почему микроядра отстой

Файловая система принадлежит ядру

Брюс Эдигер
источник
Спасибо за размещение ссылок на материалы для чтения! Тезис Брента В. в абстрактной форме звучит здраво, и в какой-то степени я сочувствую озабоченности Кристофа Л. чрезмерной сложностью механизмов синхронизации микроядра; Тем не менее, я думаю, что последний документ может пропустить циклы событий на основе сообщений. Поскольку циклы событий не разделяют память друг с другом, блокировка не требуется, и, поскольку (IMO) они поддаются декларативному стилю кодирования, можно явно определить непротиворечивый алгоритм (точка лямбда-исчисления ...) - Я обычно
антропный андроид
1

Достаточно взглянуть на архитектуру x86 - монолитное ядро ​​использует только кольца 0 и 3. На самом деле - пустая трата. Но, опять же, это может быть быстрее из-за меньшего переключения контекста.

х86 кольца

Vartec
источник
Кольцевая структура 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, безусловно, можно скомпилировать модуль независимо от ядра. На самом деле это обычно делается для разработки драйверов.
vonbrand
0

Windows NT (базовое ядро ​​для современных систем Windows) изначально представляло собой довольно ванильный дизайн микроядра. Из-за проблем с производительностью все больше и больше кода "пользовательского пространства" мигрировали в "микроядро" ... сегодня его структура микроядра рудиментарна.

vonbrand
источник
-1

Дело в том, что ядро ​​Linux является гибридом монолитного и микроядерного. В чисто монолитной реализации нет загрузки модулей во время выполнения.


источник
9
это не. тот факт, что модули загружаются динамически, не меняет того факта, что они запускаются с полными привилегиями ядра и как часть монолитного ядра.
vartec
3
Для гибридного дизайна было бы более важно, чтобы некоторые драйверы (для USB, сканеров, принтеров и графики) были реализованы в пользовательском пространстве, а не в ядре. Различие не ясно, и Linux может быть объявлен как гибридное ядро, поскольку есть libusb, sane, cups и mesa - не потому, что есть insmod и rmmod.
Мацей Пехотка
-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 kernelsпротив multi context kernels.

Шили
источник
1
MacOS запускает (по существу, монолитную) оболочку BSD через микроядро. Там вообще нет разделения на отдельные процессы, нет реального дизайна микроядра.
vonbrand
1
Таким образом, вы допускаете проект, который использует как минимум два так называемых процесса ядра. Термин microkernelневерен в любом случае, так как он обычно используется для чего-то, что следует назвать multi context kernel.
Шили