Продолжаю наблюдать за развитием GNU Hurd. Напомню, что Debian
GNU/Hurd стоит на одном из моих ПК как основная система. Мне интересна
концепция микроядерной ОС - разработчики микроядер обещают высокую
надёжность и возможность легко расширять и изменять систему под свои
нужды.
Надёжность достигается путём переноса большей части
функциональности, составляющей собственно ОС, в пространство
пользователя. То есть, если в обычных (монолитных) операционных
системах драйвер файловой системы является частью ядра ОС, то в
микроядерной ОС этот драйвер работает, как обычная программа-сервер,
обслуживающая запросы.
Эта концепция напоминает деловые связи, которые возникают в
обществе людей. Вот пример: Боб выращивает помидоры в теплицах. Он
получает каждую неделю удобрения для помидор от Мэлори. Так же раз в
месяц к нему приходит электрик Дэйв, который обслуживает
автоматическую систему полива. Если, например, Мэлори заболеет и не
сможет обеспечивать какое-то время Боба удобрениями, то Боб может
обратиться к Джону (другому поставщику) и тот доставит ему
удобрения. То есть, бизнес Боба почти не пострадает от того, что
Мэлори заболел, так как он является внешним "сервисом", который Боб
использует. С другой стороны, некоторая часть работы выполняется самим
Бобом - например, сбор и упаковка помидор перед продажей. Так же в
небольшой фирме Боба работает его супруга, Элис - она отвечает за учёт
средств и поддержку web-сайта фирмы Боба.
Продолжая аналогию, монолитная ОС напоминает фирму, где вся работа
выполняется сотрудниками, т.е. внутренними сервисами (разработка ПО,
обслуживание электросети и канализации, уборка помещений и т.п.). Если
один из сотрудников заболел - например, уборщик мусора - то повсюду
будет скапливается мусор (который некому выносить), и в конце-концов
вся деятельность фирмы остановится (если уборщик не поправится в
скором времени). Разумеется, это чисто теоретический пример и общество
людей гораздо более гибко, чем ядра операционных систем - в реальной
жизни уборщику найдут временную замену, или даже каждый сотрудник
будет самостоятельно выносить мусор.
Следущим важным моментом является то, что микроядра гораздо меньше
по размеру (да, приставка микро- здесь используется не просто так).
Так, например, ядро MINIX3 - одной из широко известных микроядерных ОС
- содержит примерно 10000 строк кода [1]. Чем меньше кода, тем проще
его поддерживать и вылавливать ошибки. Меньше кода, меньше ошибок,
надёжнее ОС.
В современном мире уже почти каждый холодильник и телефон работает
под управлением ОС и/или может быть подключён к компьютеру. Поэтому
многим подобным устройствам необходим драйвер, который обеспечивает
взаимодействие с устройством, с его аппаратным обеспечением. В
монолитой ОС драйверы включаются в состав ядра и (очевидно) работают в
пространстве ядра. Таким образом, драйверы являются "доверенными
лицами" ядра. ОС полагается на них, когда нужно взаимодействовать с
вашим USB-вентилятором или записать данные на жёсткий диск. Однако,
если драйвер работает неправильно, то это может привести (и вероятнее
всего, приведёт) к нестабильной работе ядра и всей ОС.
Здесь стоит заметить, что ядро Linux, хотя и монолитно по своей
природе, предоставляет механизм "модулей ядра", благодаря которому
функциональность ядра может быть расширена "на лету" путём загрузки
модулей. Вам не нужно включать в ядро драйверы для _всех_ устройств -
вы можете собрать ядро с драйверами только для тех устройств, которые
у вас есть. Большинство драйверов так же позволяют скомпилировать их,
как модули, которые могут быть загружены в ядро при загрузке или во
время работы ОС (как правило, без перезагрузки) - например, при
появлении нового устройства.
С другой стороны, реализация драйверов, как процессов, работающих в
пространстве пользователя (что является подходом, принятым в
микроядерных ОС), позволяет обезопасить ядро от возможных ошибок в
драйверах (ведь даже опытные программисты делают ошибки).
Одним из замечательных примеров надёжности микроядерных ОС явлется
так называемый сервер реинкарнации (reincarnation server), который
является частью ОС MINIX3, и который автоматически перезапускает
серверы, если они по каким-то причинам сбоят и аварийно завершают свою
работу [2].
Тем не менее, микроядерные ОС обладают своими недостатками -
например, их намного сложнее разрабатывать, и обычно они обладают
более низкой производительностью (хотя, например, микроядро L4
достаточно быстро[3]).
Исследования в области микроядер ведуться десятки лет, но на данный
момент можно назвать лишь несколько успешных проектов в этой
области. Микроядро MINIX и микроядро Mach (третья версия которого
лежит в основе GNU Hurd и Darwin) - пожалуй, самые известные.
Всё вышесказанное не претендует на полноту и безошибочность, так
как мои познания в этой области являются достаточно скромными. За
дополнительной информацией вы можете обратиться к соответствующим
статьям в Википедии (например, [4] хорошо написана) и другим
источникам.
Ссылки: