|
Переводы
и публикации
ВТОРАЯ
ЧАСТЬ «МАРЛЕЗОНСКОГО БАЛЕТА»
Дискуссия
Таненбаума и Торвальдса: часть II
-
Если бы сейчас была дискуссия, - начала
женщина, волнуясь и загораясь румянцем,
- я бы доказала Петру Александровичу...
- Виноват, вы не сию минуту хотите открыть
эту дискуссию? - вежливо спросил Филипп
Филиппович.
М.А.
Булгаков «Собачье сердце»
Я
люблю диспуты и дискуссии. Ибо, как
известно, именно в спорах рождается
истина. Правда, при одном условии – если
стороны действительно стремятся не
только довести свою точку зрения до
собеседника, но и как минимум услышать
друг друга. А вот с этим, как показывает
жизнь, сложнее.
Видимо,
именно эта причина стала поводом для
появления открытого обращения Эндрю
Таненбаума, которое я не преминул
перевести на русский язык по причине
излишней, чуть ли не болезненной (на мой
личный взгляд) популярности в нашем
отечестве референций к знаменитой
дискуссии по поводу микро- и монолитных
ядер операционных систем. Тем более,
что самые ярые участники русскоязычной
части «диспута», как показывает
практика, даже и не пытались познакомиться
с оригинальным материалом.
Попытаюсь
со своей стороны этим переводом упростить
задачу членам «дискуссионного клуба».
И, по возможности, доставить несколько
приятных минут тем, кто действительно
интересуется проблемой, ибо Таненбаум
как никто умеет (что большая редкость,
увы, по нынешним временам) кратко и ясно
излагать свои мысли. А этому у Мастера
не грех и поучиться.
Оригинальный
материал находится по адресу: http://www.cs.vu.nl/~ast/reliable-os/
Предисловие
Всё
выглядит так, будто бы вернулись времена
дебатов по поводу микроядра.
Прежде,
чем перейти к собственно технической
аргументации, я хочу сказать пару вещей.
Многие люди говорили или предполагали,
что Линус и я являемся врагами или вроде
того. Это всеобщее заблуждение. Я встречал
его только однажды. Он – парень «приятный
во всех отношениях» и очень умный.
Мы с ним можем быть несогласны в некоторых
технических вопросах, но это не делает
нас врагами. Пожалуйста, не путайте
несогласие по поводу идей и личную
вражду. Я ничего не имею против Линуса
и отношусь с большим уважением к тому,
что он совершил.
В
один не очень хороший момент, на который
никто практически не обратил внимания,
пару лет назад Microsoft
заплатила парню по имени Кен Браун (Ken
Brown)
за написание книги,
в которой говорилось, что Линус выкрал
код Linux из моей операционной системы
MINIX 1. Я очень
энергично опровергал это
обвинение
с тем, чтобы не дать запятнать доброе
имя Линуса. Я могу быть не совсем согласен
с конструкцией Linux, но это его детище, а
не моё, и я был очень недоволен, когда
Браун сказал, будто бы он (Линус) скопировал
его (Linux) с моей ОС.
Прежде,
чем заняться деталями, я также хочу
сказать, что мой интерес по существу
лежит отнюдь не в области микроядер.
Мой интерес – в построении очень надёжных
(и безопасных) операционных систем, и я
думаю, что микроядра являются хорошим
инструментом для достижения этой цели.
Теперь излагаю подробнее.
Изрекающие
уста
Считается,
что на Военно-воздушной Академии в
Колорадо начертан такой девиз:
«Будь
уверен: мозг включается прежде, чем уста
изрекают».
Я
не знаю, правда это или нет, но я думаю,
что это в любом случае хорошая мысль.
С
годами не прекращаются дебаты на форумах,
таких, как Slashdot,
по
поводу того, что микроядра медленные,
как трудно программировать микроядра,
что они не используются в коммерческих
ОС и множество другой чепухи. Фактически
вся эта корреспонденция исходит от
людей, которые даже представления не
имеют, что такое микроядро и что оно
может делать. Я думаю, что уровень
дискуссии здорово бы поднялся, если бы
люди, отправляющие эту корреспонденцию,
сначала попробовали бы поработать с
микроядерной ОС и затем бы отправляли
письма вроде «Я поработал с микроядерной
ОС и сразу же обнаружил X, Y и Z». Верилось
бы лучше.
Простейший
способ проверить это – это загрузить MINIX
3 и поработать
с ней. Она свободна и имеет открытый код
(под лицензией BSD), так что, получив образ
CD, вы можете поместить его на CD-ROM,
загрузиться с него и войти в систему
как root.
Однако для того,
чтобы сделать что-нибудь полезное, вам
следует назначить логический раздел
диска (1ГБ будет достаточно) и установить
MINIX 3 в него. Пожалуйста, распечатайте и
прочитайте сначала руководство
по установке. Установка займёт
минут
10. Потом установите все пакеты на CD-ROM,
как описано в руководстве по установке.
Теперь запустите X-сервер и вы теперь
сможете получить некоторый реальный
опыт. Попробуйте пересобрать ОС целиком,
как описано в руководстве. Полная сборка
- ядро плюс драйверы и все серверы в
режиме пользователя (всего 125 компиляций)
- займёт 5-10 секунд.
Пожалуйста,
отметьте для себя, что MINIX 3 не
есть
тот самый MINIX вашего дедушки. MINIX 1 был
написан как учебное пособие; он по-прежнему
широко используется в этом качестве в
университетах. Эл Вудхалл (Al Woodhull) и я
даже написали учебник
о ней. MINIX 3 основана на ней, но изначально
создавалась как высоконадёжная,
самовосстанавливающаяся и не
раздутая операционная система,
принципиально применимая в таких
проектах, как $100
ноутбук
для детей из стран третьего мира и,
возможно, во встраиваемых системах.
MINIX 1 и MINIX 3 соотносятся так же, как Windows
3.1 и Windows
XP: совпадает
только первая часть имени. Таким образом,
даже если вы использовали MINIX 1 во время
учёбы в колледже, попробуйте поработать
с MINIX 3; вы будете приятно удивлены. Это
минимальная, но полнофункциональная
Unix-совместимая операционная система с
X, bash, pdksh, zsh, cc, gcc, perl, python, awk, emacs, vi, pine,
ssh, ftp, инструментами GNU и с более, чем 400
других программ. Всё это построено на
крошечном микроядре и доступно прямо
сейчас.
Так
что, пожалуйста,
не нужно больше
комментариев типа «Если Таненбаум
думает, что микроядра такие крутые, что
же он не сделает микроядерную ОС?».
Он сделал. (На самом деле, сделали один
из его студентов и двое из его
программистов). Она, конечно же, пока не
столь полна и стара, как Linux или BSD, но
она однозначно показывает, что создание
надёжного, самовосстанавливающегося
мультисерверного клона UNIX в пространстве
пользователя, построенного на основе
маленького и лёгкого для понимания
микроядра, возможно. Не путайте
недостаточную зрелость (мы работаем
над ОС чуть более года втроём) с различными
аспектами микроядер в целом. Мы можем
и будем добавлять в MINIX 3 со временем
дополнительную функциональность и
переносить много прикладного ПО (ваша
помощь в этом только приветствуется).
Более 400,000
посещений сайта проекта MINIX 3
уже
зарегистрировано с того момента, когда
мы начали проект в конце октября 2005
года. Попробуйте её сами и посмотрите,
что получится.
Публикация
Недавно
мой аспирант Йоррит
Хердер, мой коллега Герберт
Бос и я написали статью,
озаглавленную
«Можем
ли мы делать операционные системы
надёжными и безопасными?»
и послали
её в IEEE Computer magazine, крупнейший журнал
компьютерного сообщества IEEE. Она была
принята и опубликована в майском выпуске
2006 года. В этой статье мы утверждаем,
что для большинства компьютерных
пользователей надёжность более важна,
чем производительность, и обсуждаем 4
современных исследовательских проекта,
направленных на улучшение надёжности
ОС. Три из них используют микроядра.
IEEE разместил нашу публикацию на своём
вэб-сайте. Затем кто-то сделал ссылку
на неё на Slashdot,
возобновив, таким образом, древнюю
дискуссию по поводу сравнения микроядер
и монолитных систем. И хотя я с удовольствием
сознаюсь в соавторстве публикации, я
совсем не ожидал, что она перезапустит
дискуссию на тему «Linux отжил своё».
Линус
потом ответил
и это выглядит так, будто бы мы затеяли
новую дискуссию. Хорошо, но пожалуйста,
давайте касаться только технических
моментов.
Аргумент
Линуса
Основная
позиция Линуса заключается в том, что
микроядра требуют распределённых
алгоритмов и вообще это пóшло
( they are nasty). Я согласен с тем, что
распределённые алгоритмы – это та ещё
штуковина, хотя совместно с Маартеном
ван Стином ( Maarten
van Steen ) я написал книгу
на эту тему. Я также за последние 10 лет
придумал, написал и создал две
распределённые операционные системы, Amoeba
(для LAN) and Globe
(для WAN). Проблема
с распределёнными алгоритмами заключается
в отсутствии общей привязке ко времени
(lack of a common time reference) вкупе с вероятными
потерянными сообщениями и неопределённостью
в том, заблокирован ли удалённый процесс
или он просто медленно проистекает. Ни
одна их этих проблем не имеет никакого
отношения к микроядерным ОС, работающим
на одной машине. Так что, хотя я и
соглашаюсь с Линусом в том, что
распределённые алгоритмы сложны, но
это не имеет никакого отношения к данной
дискуссии.
Напротив,
большая часть компонентов в пространстве
пользователя является драйверами, и
они очень просто взаимодействуют с
серверами. Все драйверы символьных
устройств (они читают и записывают
потоки байтов) работают по практически
такому же протоколу, как и все драйверы
устройств с блочным доступом (они читают
и записывают блоки). Количество серверов
в пространстве пользователя довольно
мало: файловый сервер, сервер процесса,
сетевой сервер, сервер реинкарнации,
хранилище данных (data store) и ещё немного.
Каждый из них имеет чётко определённую
задачу и чётко определённое взаимодействие
с остальными частями системы. Хранилище
данных, например, обеспечивает службу
публикации/подписки (publish/subscribe service),
обеспечивая при необходимости слабую
связь (loose coupling) между серверами. Количество
серверов не сильно вырастет в будущем.
Сложность системы управляема. Это отнюдь
не умозрительное построение. Мы, в конце
концов, уже создали такую систему.
Установите MINIX 3 и проверьте код
самостоятельно.
Линус
также высказал мнение о том, что
разделяемые структуры данных – это
хорошая идея. Здесь мы с ним расходимся
во мнениях. Если вы когда-либо слушали
курс по операционным системам, вы без
сомнения помните, как много времени в
курсе и места в учебнике было уделено
семафорам и синхронизации взаимодействующих
процессов. Если два или более процессов
могут получить доступ к одной и той же
структуре данных, вам следует быть
очень-очень аккуратным, чтобы не
«подвесить» себя самого. Чрезвычайно
трудно сделать это правильно даже с
семафорами, мониторами, мьютексами и
прочими ухищрениями.
Моя
точка зрения заключается в том, что
следует избегать разделяемые структуры
данных везде, где можно. Системы должны
строиться из наименьших модулей,
полностью скрывающих свои внутренние
структуры данных от кого бы то ни было.
Они должны иметь чётко сформулированные
«тонкие» интерфейсы, которыми
остальные модули могут воспользоваться
для выполнения заданий. Это как раз то,
что декларируется в объектно-ориентированном
программировании. Я думаю, что именно
скрытая информация (a la Dave
Parnas) – вот хорошая
идея. Это означает,
что вы можете изменять структуры данных,
алгоритмы и конструкцию любого модуля
без влияния на корректность системы до
тех пор, пока вы сохраняете неизменными
интерфейсы. Этому учит любой курс по
проектированию программного обеспечения.
Фактически Линус говорит, что последние
20 лет работ в области объектно-ориентированного
программирования шли по неверному пути.
Я с этим не согласен.
Если
однажды вы решили, что ни один модуль
не должен протягивать свои маленькие
грязные лапки к структурам данных других
модулей, то следующим логическим шагом
будет помещение каждого модуля в
отдельное адресное пространство и
установка аппаратного диспетчера памяти
(MMU) для проведения этого правила в жизнь.
Применительно к операционной системе
вы берёте микроядро и набор процессов
из пространства пользователя,
взаимодействующих с использованием
сообщений и чётко определённых интерфейсов
и протоколов. Делается это для более
ясной и более ремонтопригодной конструкции
ОС. Естественно, аргументы Линуса
базируются на его опыте работы с
монолитным ядром и, вероятно, на меньшем
знакомстве с микроядрами и распределёнными
системами. Мой же собственный опыт
основан на конструировании, разработке
и реализации мной самим множества таких
операционных систем. Отсюда у нас с ним
разные точки зрения на то, что является
трудным, а что – нет.
Для
того, чтобы познакомиться с различными
точками зрения на проблематику надёжных
операционных систем, познакомьтесь с
работой Джонатана Шапиро (Jonathan Shapiro),
озаглавленной Debunking
Linus's Latest (что
переводится примерно
как «Развенчание последних высказываний
Линуса» - прим. переводчика).
Предназначены
ли микроядра для реальной жизни?
Если
кратко, то: да. Существуют бесконечные
комментарии на Slashdot примерно следующего
содержания: «Если микроядра такие
хорошие, то почему они не используются
повсеместно?» На самом деле они используются. Кроме MINIX 3,
они используются
в следующих ОС:
QNX
широко используется в реальных
коммерческих системах. Например, их
использует Cisco в старшей
модели маршрутизатора, и смею
вас
заверить, что Cisco ОЧЕНЬ
заботится о
производительности.
Одной
из ведущих операционных систем на
военном и аэрокосмическом рынках, где
надёжность является абсолютно критичным
параметром, является ещё одна микроядерная
ОС - Integrity от компании Green Hill.
PikeOS
является ещё одной микроядерной системой
реального времени, широко используемой
оборонных, аэрокосмических, автомобильных
и промышленных применениях.
Symbian
является ещё одной популярной микроядерной
ОС, используемой прежде всего в сотовых
телефонах. Однако она не является строго
микроядерной, а скорее неким гибридом
с драйверами в ядре, но с файловой
системой, а также поддержкой сетевых
взаимодействий и телефонии в пространстве
пользователя.
Я
мог бы продолжать и продолжать, но уже
и так ясно, что в приложениях, где
надёжность и безопасность являются
критически важными, разработчики
неоднократно выбирали микроядерные
ОС. И хотя персонально Линус может быть
не заинтересован во встраиваемых
системах реального времени (где
производительность, надёжность и
безопасность являются параметрами
первостепенной важности), эти рынки
огромны и множество действующих на них
компаний считают, что использование
микроядер является способом обеспечения
этих параметров.
Бросив
взгляд на мир персональных компьютеров,
мы обнаружим там L4Linux, который был написан
группой Германа Хартига (Hermann Härtig) в
Техническом Университете Дрездена. Она
запускает весь Linux в пространстве
пользователя поверх микроядра L4 с
потерей всего лишь пары процентов
производительности. Но использование
микроядра позволило людям из Технического
Университета Дрездена построить новые
системы, такие, как DROPS
(система реального времени) и NIZZA
(безопасность) поверх L4, при этом имея
доступ ко всей функциональности Linux без
его модификации для обеспечения этих
новых возможностей. Таким способом они
могут экспериментировать с новыми
возможностями и по прежнему могут
запускать уже существующие программы.
Для исследований в области операционных
систем микроядро L4 используют и другие
группы, такие, как Wombat,
паравиртуализованный Linux, спроектированный
для поддержки существующих приложений
во встроенных системах. Ещё одной ОС на
базе L4 является TUD-OS
и так далее.
Microsoft
также интересуется микроядрами. Она
ясно понимает все проблемы обеспечения
поддержки монолитных ядер как никто
другой. Windows NT 3.1 была нерешительной
попыткой создания микроядерной системы,
но она не была реализована корректно,
да и производительность была недостаточно
хороша на оборудовании начала 90х
годов, так что она (Microsoft) на время
отказалась от этой идеи. Но недавно она
снова попыталась сделать это на новой
аппаратной базе, что привело к появлению Singularity. Сегодня, как я
вижу, множество
людей полагают, что если Microsoft делала
это, то она сошла с ума. Но люди, которые
руководили проектом Singularity, Гален Хант
(Galen Hunt) и Джим Ларус (Jim Larus) – это очень
умные ребята и они хорошо понимают, что Windows на самом деле
представляет собой
такую кашу, что новый подход к её
дальнейшей реализации просто необходим.
Даже люди, работающие над Vista, видят,
что у них есть серьёзные проблемы, и
переводят драйверы в пространство
пользователя, делая именно то, что я и
пропагандирую.
Около
10
лет
назад IBM начала «с нуля» разрабатывать
новую высокопроизводительную ОС для
своих очень больших заказчиков.
Объявленной целью проекта было перемещение
системной функциональности из ядра в
серверы и прикладные программы, как это
делается в микроядре. Эта система,
называемая К42, в настоящее время
развёрнута в DoE (видимо,
Department of Energy –
Министерство энергетики США – прим.
переводчика) и где-то ещё.
Mac
OS X является разновидностью микроядерной
ОС. Внутри она состоит из Berkeley UNIX поверх
модифицированной версии микроядра
Mach. Поскольку всё это запускается в
режиме ядра (для того, чтобы выбрать всю
возможную производительность), она не
является истинно микроядерной. Однако
Университет Карнэги-Мэллона много лет
назад уже имел Berkeley UNIX, запускаемый
поверх микроядра Mach в пространстве
пользователя, так что это, вероятно,
можно было бы сделать снова, хотя и с
небольшой потерей производительности,
как в случае с L4Linux. Работа
по портированию кода Apple BSD (Darwin) на L4
находится в процессе реализации с тем,
чтобы сделать её истинно микроядерной
ОС.
Несмотря
на много обещаний и мало сделанного,
GNU HURD также основана на микроядре. Даже
на двух. Первая версия была построена
на Mach, а вторая – на L4. Третья версия
будет, вероятно, базироваться на ещё
одном микроядре, Coyotos. HURD была разработана
Ричардом Столлменом (Richard
Stallman), автором emacs, gcc и
множества других
широко используемых программ, равно
как и создателем лицензии GPL и лауреатом
престижной награды MacArthur
'Genius' Award.
Ещё
одна разрабатываемая микроядерная
система называется Coyotos, наследник EROS.
Она концентрируется больше на безопасности,
чем на надёжности, но возникновение
обоих проектов связано с тем, что раздутые
ядра могут привести к проблемам на обоих
фронтах.
И
я ещё не обсуждал гипервизоры (hypervisors)
такие, как Xen
и Trango,
которые очень сильно отличаются от
микроядер по многим параметрам, но имеют
такую общую характеристику, как крошечный
код, работающий в режиме ядра, который,
как я надеюсь, является ключом к построению
надёжных и безопасных систем.
Несмотря
на то, что MINIX 3, QNX, Integrity, PikeOS, Symbian, L4Linux,
Singularity, K42, HURD, Coyotos и другие достаточно
разнородны, я не одинок в попытке
использовать микроядра. И если вы
удивлены тем, что микроядра всё ещё не
используются широко, то я отвечу, что
это просто большая инерция системы.
Почему Linux или Mac OS X до сих пор не заменили
Windows? По той же причине: большая инерция
системы. Большинство автомобилей в
Бразилии могут работать на местном
топливе – этаноле, так что Бразилия
использует относительно немного нефти
для автомобильного
топлива. Почему же США не делают
этого
и не уменьшают свою зависимость от
непостоянного Ближнего Востока? По той
же причине: большая инерция системы.
Подвигнуть людей на изменения очень
тяжело, даже в случае вполне очевидной
практической выгоды.
Что
я пытаюсь
доказать?
На
самом деле MINIX 3 и моё исследование
посвящены вовсе НЕ
микроядрам. Они
посвящены построению высоконадёжных,
самовосстанавливающихся операционных
систем. Я буду считать, что работа
закончена, только тогда, когда больше
не останется производителей ПК с кнопкой
RESET. У телевизоров этой кнопки нет. У
музыкальных центров - тоже нет. И у
автомобилей нет кнопки RESET. Они битком
набиты разным программным обеспечением,
но не нуждаются в таких кнопках.
Компьютерам же кнопка RESET нужна потому,
что их программное обеспечение «падает»
слишком часто. Я знаю, что компьютерное
ПО отличается от автомобильного, но
пользователи просто хотят использовать
и то, и другое и не хотят выслушивать
лекции о том, почему они могут рассчитывать
на нормально функционирующие машины и
не могут рассчитывать на нормально
функционирующие компьютеры. Я хочу
построить операционную систему, которая
будет иметь характерный временной
интервал между отказами, намного больший,
чем время жизни компьютера, так чтобы
средний пользователь никогда бы не
познакомился с отказом. У MINIX 3 есть много
специфических свойств,
обеспечивающих её надёжность.
Несмотря
на то, что мы не реализовали пока всех
возможностей (например, виртуальная
память пока только в плане разработок
на конец этого года), я думаю, что улучшение
надёжности – это самый большой вызов
разработчикам операционных систем в
настоящее время. Средний пользователь
не должен волноваться по поводу обновлений
ПО или выжимания последних капель
производительности из компьютера, но
должен беспокоиться о том, чтобы его
компьютер безупречно работал все 100%
времени и никогда не отказывал.
Поинтересуйтесь, например, мнением
вашей бабушки по этому поводу.
Таким
образом, что же на самом деле микроядра
должны обеспечивать для этого? Они
делают возможным создание
самовосстанавливающихся систем. Это
то, чем я озабочен и то, чему посвящена
моя работа. Перемещение большей части
ОС в группу пользовательских процессов
– по одному для каждого драйвера и
различных серверов – отнюдь не уменьшает
количество ошибок в коде, но существенно
уменьшает возможность любой ошибки
вызвать серьёзное повреждение и сокращает
к тому же требуемый размер надёжной
части кода (trusted computing base).
В нашей конструкции
в случае отказа большинства драйверов
сервер реинкарнации может перезапустить
их свежую копию, а в дополнение сохранить
образ ядра «умершего» драйвера
в целях отладки, зафиксировать это
событие и послать e-mail администратору
или разработчику и т.п. При этом система
продолжает работать и только в очень
крайнем случае может быть аккуратно
остановлена без снижения эффективности
работы или потери данных. Некоторые
компоненты, такие, как собственно сервер
реинкарнации, файловый сервер и сервер
процессов, являются критичными и их
неисправность, естественно, приведёт
к отказу системы, но не никаких причин
позволять «обрушивать» систему
неисправным аудио-, принтерным или
сканерным драйверам. Они просто должны
быть запущены повторно и работа должна
быть продолжена. Это и есть наша цель:
системы, которые могут обнаруживать
свои собственные отказы и восстанавливаться
после них. Вы легко можете сделать это
в микроядерных системах. Это гораздо
сложнее сделать в системах с монолитным
ядром, хотя исследователи из Университета
Вашингтона выполнили неплохую работу
с Nooks,
а группа из Университета Карлсруэ также
сделала интересную работу на основе технологии
виртуальных машин.
Домашнее
задание
Прежде,
чем разглагольствовать о том, что
микроядра могут, а что – нет, возьмите
лучше и попробуйте MINIX
3, чтобы стать информированным
оратором.
Это изменит ваше мнение в лучшую сторону.
Для того, чтобы получше познакомиться
с устройством MINIX 3, почитайте статью
в майском номере IEEE Computer,
эту
статью по модульному программированию,
которая только что появилась на страницах
USENIX ;login, или этот технический
отчёт (русский
перевод всех трёх
публикаций см. на сайте http://www.minix3.ru
– прим. переводчика).
А
если вы давно уже сделали это, то отдельное
вам за это спасибо.
Эндрю
Таненбаум,
12 мая 2006 г.
|