Mach
Материал из Википедии — свободной энциклопедии
Mach — это микроядро операционной системы. Разработано в Carnegie Mellon University в качестве исследования, в основном для распределеных задач. Это одно из первых микроядер, которое до сих пор используется во множестве ОС на микроядре.
Проект в Carnegie Mellon University разрабатывался с 1985 по 1994 год, закончился на Mach 3.0. Некоторое число разработчиков продолжило Mach иследования. Mach был разработан как замена ядру в BSD версии Unix, поэтому ни одна новая операционная система не создана вокруг него. Сегодня экспериментальные иследования Mach закончены, однако Mach и его потомки используются в нескольких коммерческих операционных системах, таких как NEXTSTEP и OPENSTEP, а также Mac OS X (включая XNU).
Mach логическое продолжение Accent ядру, разработаному в Carnegie Mellon University. Главный разработчик Mach, Ричард Рашид (Richard Rashid), работал на Microsoft с 1991 в высоких позициях возглавляя отделение Microsoft Research. Другой разработчик Mach, Эви Теваниан (Avie Tevanian), был бывшей главной отдела програмного обеспечения в NeXT, затем работал в Apple до Марта 2006.
Содержание |
[править] Концепция
Так как Mach был спроектирован как быстрая замена традиционному Unix ядру, обсуждение фокусируется на отличиях Mach от Unix. Стало понятным что Unix концепция все-файл больше не работает на современных системах, однако такие системы как Plan 9 от Bell Labs пытаются следовать этому пути. Однако эти же разработчики заметили потерю гибкости такого подхода. Другой уровень виртуализации может заставить систему "работать" снова.
Критическая абстракция в Unix это конвейеры (pipe). Что похоже на конвейеры и позволит на более общем уровне сделать доступным различные перемещения информации между программами. Такая система может существовать используя межпроцессорное взаимодействие (IPC): Похожая на конвейеры система позволяющая перемещать "любую" информацию между двумя програмами, похожая на файловую ифонмацию. В то время во многгих системах, включая различные Unix, были добавлены различные IPC реализации уже несколько лет, они были для специальных целей и не могли обеспечить то что создатели Mach от них ждали.
В Carnegie Mellon University начали разработку ядра Accent, используя IPC, базирующийся на разделяемой памяти. Accent был экспериментальной системой со множеством возможностей, разрабатываемых по веянию моды за все время разработки. Дополнительно, полезность Accent для иследования была ограничена, потому что он не был Unix совместимым, а Unix был уже стандартом де-факто во всех иследовательских ОС. Также, Accent был жестко привязан к платформе на которо разрабатывался, и на начало 1980ых похоже что скоро будет много новых платформ, многие из которых очень различны.
Mach начат значиетльна как попытка создать легко-определяемый, Unix-основанный, портируемый Accent. В результате получился короткий список основных концепций:
- "задача" - набор ресурсов которые позволяют "потокам" исполнятся
- "поток" - единица исполняющаяся на процессоре
- "порт" определяет защищенный конвейер для IPC между задачами
- "сообщение" перемещается между программами через порт
Mach разработан на концепциях IPC Accentа, но сделан системой большей похожей на Unix, которая позвляет запускать Unix программы с минимальными или без изменений. Чтобы этого добится в Mach появилась концепция "порта", представляющего конец в двухстороннем IPC. Порты были защищены и имели права как файлы в Unix, используя очень похожую на Unix модель защиты. Дополнительно Mach разрешал любой программе владеть привелегиями, которыми обычно владеет только ядро, позволяя непривилегированному уровню (user-space) обращатся к аппаратному обеспечению.
В Mach, как в Unix, ОС опять стала главным образом набором утилит. Как Unix, Mach держал концепцию драйвера для работы с аппаратным обеспечением. Однако все драйверы для существующего аппаратного обеспечения должны быть включены в микроядро. Другие архитектуры базирующиеся на Слои Абстракции от Оборудования или экзоядрах могут перемещать драйверы из микроядра.
Главным отличием от Unix было, что утилиты должны были работать не с файлами, а с задачами. Больше кода было перемещено из ядра в непривелигированный режим, в результате более маленького ядра, появился термин микроядро. В отличие от традиционных систем, под Mach процесс, или "задача", может состоять из набора потоков. Mach был первой ОС которая определила понятие поток в этом смысле. Задачи ядра были уменьшены до рыботы с оборудованием и поддержке утилит.
Существование портов и использование IPC определяет большинство различие между Mach и традиционными ядрами. В Unix, вызыващий ядро совершает операцию называемую "системный вызов" или "сигнал". Программа использует библиотеку чтобы разместить данные в известном месте в памяти и затем совершает ошибку. Когда система в первые запускает ядро, она устанавливает обработчик ошибок, поэтому программа совершающая ошибку вызывает ядро, которое иследует информацию в него пришедшию и совершает действия.
В Mach, IPC используется для этой цели. Прогамма спрашивает ядро доступ к порту, затем использует механизм IPC для посылки сообщений в порт. Эти сообщения обрабатываются системными вызовами, как в других ядрах, в Mach практически все запросы обрабатываются другой программой.
Использование IPC для передачи сообщений поддерживает потоки и конкуренцию. Так как задачи состоят из множества потоков, и их код в потоках использует механизм IPC. Mach может заморозить или разморозить поток, пока сообщение обрабатывается. Это позволяет системе быть распределеной на множество процессоров, используя разделяемую память прямо в большинстве сообщений Mach, или путем добавления кода для копирования сообщения в другой процессор если требуется. В традиционном ядре это трудно реализовать, потому что система должна быть уверена, что различные программы не пытаются писать в туже самую память на различных процессорах. В Mach это хорошо определено и легко реализуется; процесс совершающий доступ к памяти, портам делается гражданином системы.
Система IPC имеет проблемы с производительностью, потому несколько стратегий было разработано чтобы снизить их влияние. В частности, Mach использует единый механизм разделения памяти для физической передачи сообщений от одной программы к другой. Физически копирования сообщения будет медленным, поэтому Mach обращается к блоку управления памятью (MMU) для быстрого соотношения данных из одной программы в другую. Только если данные записываются они будут физически скопированы, процесс называющийся копирование-при-записи (copy-on-write; cow).
Сообщения также проверяются на целостность ядром, чтобы избежать плохих данных которые уронят одну из программ составляющую систему. Порты были разработаны на основе файловой системы Unix. Это позволело портам использовать существующие концепции навигации по файловой системы, а также права и доступы.
Разработка такой системой cтановится более простой. Большая часть системы может быть запущена, отлажена и создана с помощью тех же утилит, что и программы для традиционной системы. С монолитным ядром ошибка в коде требует выключения целой машины и перезагрузке, в то время как в Mach, требуется только перезапуск программы. Дополнительно пользователь может указывать системе включит, выключить какие возможности ему нужны. Так как ОС это коллекция программ, они могут добавлять или удалять части просто запуская или убивая их, как и любую другую программу.
[править] Разработка
Mach изначально распологался как дополнительный код написаный к существующему 4.2BSD ядру, который позволял команде работать на системе задолго до того как она была завершена. Работа началась с уже готовой Accent IPC/порт системы, и переместилась на другие ключевые части OS, задачи, потоки и виртуальная память. Эти части были переписаны на вызов функций в Mach; параллельно с этим велась работа над 4.3BSD.
В 1986 система была завершена и могла запускатся на DEC VAX. Несмотря на мало практичное значение, цель создать микроядро была воплащена в жизнь. Вскоре последовал выпуск версий для IBM PC/RT и Sun Microsystems 68030 рабочих станций, предоставляя портируемость системы. К 1987 в список включены Encore Multimax и Sequent Balance. Release 1 вышел в этот год, а Release 2 в следующий.
Все это время обещанное "настоящее" микроядро не было создано. Эти ранние версии Mach включали большую часть 4.3BSD ядра, системы известные как POE, в результате это ядро было фактически больше чем Unix на котором оно базировалось. Однако, цель переместить Unix слой из ядра, где оно более просто разрабатывалось и заменялось была достигнута. К сожалению, производительность оставляла желать лучшего, и набор архитектурных изменений было сделано чтобы решить эту проблему.
В результате Mach 3 вышел в 1990, и произвел интенсивный интерес. Маленькая команда, которая сделала Mach, портировала его на множество платформ, включая сложные мультироцессорные системы которые создавали серьезные проблемы для старомодных ядер. Также был вызван интерес в коммерческом рынке, где число компаний хотело иметь возможность менять платформы, если бы они портировали свои ОС на Mach, то могли бы безболезнено менять платформы.
Mach получил видимое ускорение когда Open Source Foundation анонсировало что они будут создавать будущую версию OSF/1 на Mach 2.5, и были бы рады использовать Mach 3. Mach 2.5 так же был выбран для NeXTSTEP систем и некоторым количеством комерческих мультипроцессорных производителей. При помощи Mach 3 было совершено некоторое число попыток портировать другие ОС на это ядро, включая IBM Workplace OS и несколько попыток от Apple Computer создать кросс-платформенную версию Mac OS.
Некоторое время казалось что каждая ОС созданая в конце 1990ых будет базироватся на Mach.
[править] Проблемы с производительностью
Mach изначально позиционировался как замена классическому Unix, и по этому причине содержит множество Unixовых идей. К примеру, Mach использует систему прав и безопасности основанную на Unixовой файловой системе. Так как ядро исполняется в привелигированом режиме (kernel-mode) и возможно, что некоторая програма пошлет команду, которая повредит систему, и поээтому ядро проверяет каждое сообщение. Также большинство функциональности было расположено в программах исполнуяющихся в непривелигированом режиме (user-space), это значит что необходим некоторый способ разрешения таким програмам дополнительных действий, например работа с аппаратным обеспечением.
Некоторые возможности Mach базировались на тех же механизмах IPC. К примеру, Mach с легкостью может поддерживать многопроцессорные компьютеры. В традиционном ядре экстенсивная работа проделывается, чтобы обеспечить реентерабельность или прерываемость программ запущеных на разных процессорах, которые могут вызывать ядро в одно и тоже время. В Mach кусочки операционной системы изолированы в серверах, которые могут запускатся, также как и другие программы, на любом процессоре. Потому теоретически ядро Mach также должно быть реентерабельным, но на практике это не пролема, потому что все что нужно Mach, так это направить запрос какой-нибудь непривелигированной программе. Mach так же включал сервер который может перенаправлять сообщения не только между программами6 но и по сети. Работа в этой области была продела в конце 1980ых и начале 1990ых.
К сожалению использование IPC для большинства задач снижает производительность. Сравнения проведеленых в 1997 году показали, что Unix построенный на Mach 3.0 на 50% медленне чем традиционный Unix.
Иследования показали, что производительность падает из-за IPC. И что достичь ускорения за счет раздробления ОС на маленькие сервера не возможно. Множество попыток улучшить производительность Mach было сделано, но в середине 1990 большинство интереса исчезло. Концепция системы основаной на IPC похоже умерла.
Фактически испедование природы проблем производительности подняло несколько интересных фактов. один был что IPC сам по себе это не проблема: проблема в том что необходимо отображать память для его поддержки, но это добавляет только небольшное количество времени. Большинство (около 80%) тратится на дополнительные задачи что тратит ядро на сообщение. В первую очередь проверку прав порта и целостность сообщения. В тестах на Intel 80486DX-50 стандартный Unix вызов занимает около 21 микросекунды, соответсвующий вызов в Mach занимает 114 микросекунд. Из них 18 микросекунд относятся к аппаратному обеспечению; остальное относится к различным функциям ядра Mach.
Когда Mach впервые был использован в серьезных разработках (2.x версия), производительность была ниже чем в традиционных ядрах примерно на 25%. Эта цена не вызывала беспокойство, потому что система хорошо портировалась и работала на множестве процессоров. Фактически система скрыла серьезные проблемы с производительностью до выхода Mach 3, когда множество разработчиков попыталось создать системы запущеные в непривелегированом режиме.
Когда Mach 3 попытался переместить ОС в непривелегированый режим, потеря производительности стала заметной. Расмотрим простой пример: задача спрашивает время. Посылается сообщение ядру Mach, это вызывает переключение контекста, отображение памяти, затем ядро проверяет сообщение и права, если все хорошо, то вызывается переключение контекста на сервер, затем сервер выполняет действия и посылает сообщение назад, ядро выделяет ещё памяти, и переключает контекст дважды.
Но тут ещё есть проблема, она заключается в том когда мало памяти и используется сохранение страниц памяти на внешний носитель. Традиционные монолитные ядра знают где ядро и его модули, а где память которую можно выгружать. В то время как Mach не имеет ни малейшего понятия из чего состоит система. В место этого он использует единое решение, которое добавляет проблем с производительностью. Mach 3 дает простой менеджер памяти, который обращается к другим которые выполняются в непривелигированом режиме, что заставляет систему делать дорогие IPC вызовы.
Многие из этих проблем существуют в любой системе которым необходимо работать на многопроцессорной машине, и в середине 1980ых казалось что будущий рынок будет наполнен ими. Фактически эволюция не работает как ожидается. Мультипроцессорные машины использовались в серверных приложениях в начале 1990ых, но затем исчезли. Тем временем производительность CPU возрастала на 60% в год, умножая неэффиктивность кода. Плохо, что скорость доступа к памяти растет только на 7% в год, это значит что цена обращения к памяти не уменьшилась, и вызовы IPC Mach'а которые не сохраняются в кеше работают очень медлено.
Несмотря на возможности Mach, такие потери производительности в реальном мире не применимы. Поэтому большинство сообщества разработчиков ОС посчитало что использование IPC в качестве основы ОС изначально неудачно.
[править] Возможные решения
Как мы установили выше большинство производительности Mach 3 теряется на IPC вызовах. Однако концепция "многосерверной системы" все ещё обещающа, поэтому оно требует иследований. Разработчикам необходимо аккуратно изолировать код в модули, которые не делают вызовов от сервера к серверу. К примеру, большая часть кода для работы с сетью должна быть помещена в отдельный сервер. Под Unix это не так то просто, потому что система базируется на использовании фаловой системы для всего от сети до безопасности.
Большинство разработчиков застраяло на оригинальной коцепции единого большого сервера, который предоставляет функциональность ОС. Также для простоты разработки, они разрешили операционной системе работать в привелигированом и непривелигированом режиме. Это позволяет им разрабатывать в непривелигированом режиме и иметь все возможсноти идеи Mach, и затем перемещать отлаженный сервер в привелигированный режим чтобы иметь лучшую производительность. Несколько операционных систем разработано подобным методом, известным как "ко-локейшн" (co-location), это используется в Lites (порт 4.4BSD Lite), MkLinux, OSF/1 и NeXTSTEP/OPENSTEP/Mac OS X. В ChorusOS сделали это возможностью базовой системы, разрешив северам переходить в привелигированый режим с помощью встроеных механизмов.
Mach 4 пытался решить эту проблему, с помощью радикального набора улучшений. В частности, он находил програмный код, который обычно не записываем, и поэтому копирование при записи случается редко. Это делало возможным не сопостовлять память между процессами (map memory) для IPC, а вместо этого использовать локальные места программ. Это создало концепцию "шаттлов" и увеличило производительность, но разработчикам досталась сложность с управлением состояниями. Mach 4 также включил встроенные механизмы ко-локейшна.
Во всех тестах IPC производительность была названа источником проблемы, ей причисляется 73% потеряных циклов.
В середине 90ых работа над микроядерными системами повседневно остановилась. Хотя маркет верил что все новые системы будут микроядерными в 90ых, сегодня только одна широкоиспользуемая система Mac OS X, используел ко-локейшн сервер поверх сильно модифицированной Mach 3.
[править] Следующее поколение
Иследования показали, что проблема производительности IPC не такая страшная как выглядит. Напоминаем что одно сторонний вызов на BSD занимает 20 микросекунд, в то время как на Mach 114. Из 114, 11 это переключение контекста, идиентичного BSD. Дополнительно 18 используется менеджером памяти для отображения сообщения между непривелигированной средой исполнения и привелигированной (user-space и kernel-space). Это добавляет только 31 микросекунду, больше чем традиционный вызов, но не намного.
Оставшаяся часть проблемы это проверки прав доступа к порту у сообщений. В то время как это выглядит очень важным, фактически, это требуется только на Unix системах. К примеру однопользовательская система, запущенная на мобильном телефоне, может не нуждаться в таких возможностях, и это тип систем, в которых Mach может быть использован. Однако Mach создает проблемы когда память перемещается в ОС, другие задачи могут не нуждаться в этом. DOS и ранние Mac OS имели единое адресное пространство, разделяемое всеми процессами, поэтому в таких системах отображение памяти пустая трата времени.
Эти реализации положили начало второе поколение микроядер, которое уменьшает сложность системы размещая большинство функциональности в непривилегированном режиме исполнения. Например, ядро L4 включает только 7 функций и использует 12 килобайт памяти, когда Mach 3 ввключает около 140 функций и использует 330 килобайт памяти. IPC вызов на L4 на 486DX-50 занимает только 5 микросекунд, быстрее чем Unix вызов на этой же системе, и в 20 раз быстрее чем Mach. Конечно, если игнорировать факт, что L4 не обрабатывает разрешения и безопасность, но оставляя это для непривелигированных программ, которые могут выбирать сколько времени им требуется.
"Потенциальные" ускорения L4 основаны на факте, что непривилегированные приложения часто предоставляют множество функций, которые формально поддерживаются ядром. Сравнивая конечную производительность, MkLinux в ко-локейшн режиме по сравнению с L4 портом запущеным в непривелигированном режиме. L4 добавляет только 5%-10% потерь, в то время как Mach 15%, все это более интересно учитывая двойные переключения контекста.
Новые микроядра изменили индустрию в целом, множество умерших проектов, таких как GNU Hurd получили новое внимание.
[править] Операционные системы основанные на Mach
- GNU Hurd/GNU Mach
- Lites
- MkLinux
- mtXinu
- MachTen
- MacMach
- Mac OS X
- NEXTSTEP
- OSF/1
- Workplace OS
- xMach
- UNICOS MAX