Mach () — микроядро операционной системы, разработанное в Университете Карнеги — Меллона при проведении исследовательских работ в области операционных систем, главным образом распределённых и параллельных вычислений. Это один из самых первых примеров микроядра, но до сих пор он является стандартом для других подобных проектов.

Проект существовал с 1985 по 1994 год и был закончен выпуском Mach 3.0. Несколько исследовательских групп продолжили разработку Mach; например, Университет Юты некоторое время вёл проект Mach 4The Mach 4 Project . Mach разрабатывался как замена ядру BSD UNIX, поэтому не было необходимости в разработке нового операционного окружения. Дальнейшие научно-исследовательские работы по проекту Mach, были закончены; несмотря на это, Mach и его производные используются в ряде коммерческих операционных систем, например, NeXTSTEP, наиболее заметной из которых является macOS, в которой используется ядро XNU, вобравшее в себя Mach 2.5. Система управления виртуальной памятью Mach была перенята разработчиками BSD в CSRG и используется в современных UNIX-системах, производных от BSD, например, FreeBSD. Ни macOS, ни FreeBSD не сохранили микроядерной архитектуры, используемой в Mach, хотя macOS предлагает для использования в приложениях микроядерную систему межпроцессного взаимодействия и примитивы управления.

Mach является логическим продолжением ядра Accent, также разработанного в Carnegie Mellon University. Ведущий разработчик проекта Ричард Рашид с 1991 года работает в Microsoft в подразделении Microsoft Research. Ещё один из основных разработчиков, Аветис Теванян, работал главой отдела разработки программ в NeXT до марта 2006.

Концепция Mach был разработан как быстрая замена традиционному ядру Unix. Unix-концепция «всё — файл» не всегда работает в современных системах, но такие системы, как Plan 9 от Bell Labs, всё же пытаются следовать по этому пути. Разработчики Mach заметили негибкость такого подхода, и предложили другой уровень виртуализации.

Одна из важнейших абстракций в 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) обращаться к аппаратному обеспечению.

Как и Unix, операционная система в Mach сводится в основном к набору утилит. Как и в Unix, в Mach есть концепция «драйвера» как посредника между ядром и аппаратным обеспечением. Однако все драйверы для существующего аппаратного обеспечения должны быть включены в микроядро. Другие архитектуры, базирующиеся на слоях абстракции от оборудования или экзоядрах, могут отделять драйверы от микроядра.

Главным отличием от Unix было то, что утилиты должны были работать не с файлами, а с задачами. Больше кода было перемещено из ядра в непривилегированный режим. Ядро за счёт этого стало существенно меньше, отсюда термин микроядро для обозначения ядра Mach. В отличие от традиционных систем, под Mach процесс (или «задача») может состоять из набора потоков. Mach был первой ОС, которая определила понятие «поток» в этом смысле. Задачи ядра были сведены к работе с оборудованием и поддержке утилит.

Существование портов и использование IPC определяет большинство различий между Mach и традиционными ядрами. В Unix для обращения к ядру используются «системные вызовы» или «сигнал». Программа использует библиотеку, чтобы разместить данные в известном месте в памяти, и затем вызывает специальное программное прерывание. Когда система впервые запускает ядро, она устанавливает обработчик этого прерывания, поэтому программа, порождающая прерывание, вызывает ядро, которое исследует пришедшую информацию и совершает действия.

В Mach для этой цели используется IPC. Программа запрашивает у ядра доступ к порту, а затем использует механизм IPC для посылки сообщений в порт. В других ядрах эти сообщения обрабатываются системными вызовами; в Mach практически все запросы обрабатываются другой программой.

Использование IPC для передачи сообщений поддерживает потоки и конкуренцию. Так как задачи состоят из множества потоков и их код в потоках использует механизм IPC, Mach может заморозить или разморозить поток, пока сообщение обрабатывается. Это позволяет системе быть распределённой на множество процессоров, используя разделяемую память непосредственно в большинстве сообщений Mach, или путём добавления кода для копирования сообщения в другой процессор, если требуется. В традиционном ядре это трудно реализовать, потому что система должна быть уверена, что различные программы не пытаются писать в одну и ту же память на различных процессорах. В Mach это хорошо определено и легко реализуется; процесс, совершающий доступ к памяти или портам, делается «гражданином» системы.

Система IPC имеет проблемы с производительностью, для преодоления которых было разработано несколько стратегий. В частности, Mach использует единый механизм разделения памяти для физической передачи сообщений от одной программы к другой. Физическое копирование сообщения будет медленным, поэтому Mach обращается к блоку управления памятью (MMU) для быстрого соотнесения данных в одной программе и в другой. Только если данные записываются, они будут физически скопированы, процесс, называющийся «копирование при записи» (copy-on-write; cow).

Сообщения также проверяются на целостность ядром, чтобы избежать плохих данных, которые выведут из строя одну из программ, составляющих систему. Порты были разработаны на основе файловой системы Unix. Это позволило портам использовать существующие концепции навигации по файловой системе, а также права доступа.

По сравнению с более традиционными ОС разработка такой системы становится проще. Большая часть системы может быть запущена, отлажена и создана с помощью тех же утилит, что и программы для традиционной системы. С монолитным ядром ошибка в коде требует выключения целой машины и перезагрузки, в то время как в 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 — прототипы, доказывающие её работоспособность, включали большую часть ядра BSD 4.3, в результате чего это ядро было фактически больше, чем 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), это значит, что необходим некоторый способ разрешения таким программам дополнительных действий, например работу с аппаратным обеспечением.