Я думаю, тонкий, но важный, аспект понимания этого вопроса зависит от того, как термины «надежные» и «эффективные» определены. Для этого ответа я буду использовать следующие общие определения:
надежно: трудно или менее вероятно, к неисправности или иным образом нарушать/аварии
эффективно: требовать наименьшее количество время завершить какую-то задачу, даже за счет пространства
Хотя не каждый будет d Определите термины таким же образом (например, во встроенной системе использование наименьшего количества пространства может считаться более «эффективным»), в большинстве случаев я думаю, что пользователи склонны к смещению в сторону скорости.
Идея микроядра заключается в обеспечении минимальной функциональности в ядре, чтобы сделать его надежным и эффективным.
Я думаю, что важная часть здесь - «минимальная функциональность». Наличие минимального количества функциональности подразумевает, что количество кода, которое должно быть написано, прочитано и сохранено/отлажено, меньше одного с большим количеством материалов в нем.
В этом смысле, и с учетом моих определений выше, меньше кода означает, что ядро в целом меньше, вероятно, проще и проще в работе. Чем проще система, тем легче выявить потенциальные/актуальные проблемы, сделав систему более «надежной» в этом смысле. Это уменьшает вероятность появления новых скрытых ошибок, превращая их в кодовую базу и ломая что-то позже.
Он также может сделать его более «эффективным» (т. Е. Быстрее), потому что система будет иметь меньшую обработку служебных данных, чтобы заботиться о ней, чтобы обеспечить правильную работу. Другими словами: чем меньше вы должны работать, тем меньше времени вам нужно будет потратить на работу.
По аналогии, представьте, что вы читаете книгу; чем меньше страниц вам нужно прочитать, чтобы закончить книгу, тем проще будет рассказать историю, и чем быстрее вы ее закончите.
Означает ли это, что «ядра с максимальной функциональностью» не будут надежными и эффективными?
Не обязательно, хотя это зависит от того, что означает «максимальная функциональность». Например, если медиа-плеер, почтовый клиент и текстовый процессор внутри ядра помогут ему достичь «максимальной функциональности»? Может быть. Имеет ли это смысл? No.
Для этого обсуждения я буду использовать следующее определение:
- максимальная функциональность: совместимость с максимальным количеством аппаратных средств возможного
В практическом плане это означает, что если вы должны были обменять некоторый компонент A на какой-либо другой компонент B (например, сетевую карту), машина должна продолжать работать нормально, а не отказываться от загрузки.
В этом смысле ядро может иметь «максимальную функциональность» без полностью, жертвуя «эффективностью и надежностью».
Код должен быть добавлен для того, чтобы ядро позволяло идентифицировать компоненты, загружать их драйверы и т. Д., Что увеличило бы вероятность появления ошибок при вводе кода и объеме обработки чтобы позаботиться о дополнительных функциях. И даже тогда большинство ошибок будут только временными.
Итак, как вы можете видеть, есть компромисс. Итак, что относительно микроядра?
Микро-ядро специально стремится к управлению этим компромиссом, нажимая менее критичные «службы» за пределы ядра ... что, в свою очередь, означает, что вещи, которые обычно имеют возможность разбивать ядро (например, плохой водитель), и, следовательно, вся машина, выталкивается наружу. Это ограничивает количество сбоев, которые они могут вызвать, если/когда они ошибочно ведут себя.
После запуска ядра они запускаются как приложения для пользовательского пространства (например, аналогичные блокноту) вместо пространства ядра (например, драйвер видеокарты в монолитном ядре), и если какие-либо из этих служб или приложений будут иметь проблемы и авария, сама машина с большей вероятностью выживет вместо отображения BSoD или эквивалента.
Например, если текстовый редактор выходит из строя, отключается только приложение. Если драйвер графической карты, работающий в ядре, выйдет из строя, вам, скорее всего, придется перезагрузиться.
Но, как я уже говорил, это компромисс. Например, перемещение функциональности ядра снаружи в пользовательскую землю приводит к некоторым штрафам за эффективность/скорость. То, что раньше было простым вызовом функции в монолитном ядре (например, Linux) в рамках одного и того же процесса в пространстве ядра, теперь нуждается в перераспределении межпроцессной связи с несколькими независимыми задачами вне себя, что требует большего количества переключателей контекста между ними , и время, прежде чем задача может быть завершена.
По аналогии, представьте, что вы читаете книгу с несколькими персонажами, которые делают важные решения в ключевых точках истории, но это главной книга фокусируется только на главного характера, а последствия этих решений для с поддержкой персонажей рассматриваются в отдельных книгах с боковой книгой. Основная книга сама по себе будет короче и проще, но тот факт, что вам приходится постоянно переключаться между книгами, чтобы на самом деле читать все, означает, что вам потребуется больше времени, чтобы закончить ее.
Надеюсь, это поможет.
Как автор определил термины «надежный» и «эффективный» в контексте книги до чтения этого раздела? – ray
Читайте также [Операционные системы: три простых пьесы] (http://pages.cs.wisc.edu/~remzi/OSTEP/), и до этого wikipage на [операционных системах] (https://en.wikipedia.org/wiki/Operating_system) –
Типичным примером [монолитных ядер] (https://en.wikipedia.org/wiki/Monolithic_kernel) является [ядро Linux] (https://en.wikipedia.org/wiki/Linux_kernel) который на практике довольно успешный, надежный и эффективный (и имеет * множество функциональных возможностей). Вы должны попытаться установить некоторый [дистрибутив Linux] (https://en.wikipedia.org/wiki/Linux_distribution) на свой компьютер. –