# Mach (Kernel)

Mach ist ein Mikrokernel, der 1985–1994 im Rahmen eines DARPA-finanzierten Projekts an der Carnegie Mellon University (CMU) entwickelt wurde. Das Design-Ziel für Mach war ein Unix-kompatibles Betriebssystem, der Kernel ist jedoch prinzipiell für verschiedene Betriebssysteme verwendbar. Bis Version 2 war ein vollständiger 4.3BSD-Kernel Teil von Mach, der jedoch in Mach 3.0 entfernt werden konnte. Für das Betriebssystem OSF/1 wurde der ursprüngliche CMU-Mach3-Kernel weiterentwickelt und von anderen Mach-Implementierungen weiterer Betriebssysteme als Open Software Foundation Mach Kernel, kurz OSF MK, übernommen. An der Universität von Utah wurde in der Flux Research Group bis 1996 an Mach 4 gearbeitet, das als Basis für die freie Implementierung GNU Mach diente.
Mach gilt heute als erste Mikrokernel-Generation. Der L4-Mikrokernel hat die größte Schwäche von Mach, den zu langsamen Interkommunikationsprozess, annähernd behoben und gilt als zweite Mikrokernel-Generation. Deshalb wird Mach manchmal auch als überholt bezeichnet.

## Entwicklung

Mach wurde unter Leitung von Richard Rashid und Avie Tevanian an der Carnegie Mellon University, kurz CMU, 1985 als Nachfolger von Accent entwickelt. Accent war ebenfalls von Rashid am CMU zwischen 1979 und 1981 entwickelt worden und lief dort bis 1985 auf den hauseigenen Rechnern, wurde aber schließlich durch den Erfolg von Unix obsolet.
Mach hätte ursprünglich wohl MUCK heißen sollen, für englisch Multiprocessor Universal Communication Kernel. Der endgültige Name „Mach“ war zwar keine Abkürzung mehr, doch waren die wesentlichen Ziele der Entwicklung damit klar abgesteckt: Multiprozessorfähigkeit, leichte Portierbarkeit sowie Nutzung von Interprozesskommunikation (IPC, kurz für englisch interprocess communication). Als Mikrokernel sollte Mach sehr klein bleiben und nur die nötigsten Funktionen erledigen. Das Konzept der Interprozesskommunikation zur Verarbeitung von Mach messages zur Verwaltung einzelner darauf laufender Prozesse wurde von Accent übernommen, die virtuelle Speicherverwaltung sowie die Process- und Thread-Verwaltung sind jedoch Neuentwicklungen.
Zu Entwicklungsbeginn wurde 4.2BSD-Unix als Grundlage für ein Mach-Betriebssystem verwendet. In diesen bestehenden BSD-Kernel wurden nach und nach Mach-Komponenten eingebaut, um die vorhandenen Kernel-Funktionen zu ersetzen bzw. – wie später vorgesehen – diese Funktionen auf die Abstraktion im Mach-Mikrokernel aufbauen zu lassen. Obwohl es hauptsächlich um den Mikrokernel ging, wollte man von Anfang an die Unix-Kompatibilität bewahren. Später war geplant, dass auch andere existierende Betriebssysteme auf Mach als Kernel laufen sollten, darunter auch System V, VMS und sogar MS-DOS.
Das Mach-Betriebssystem wurde auf 4.3BSD aktualisiert, als dieses 1986 verfügbar wurde. Bis zur ersten veröffentlichten Version im selben Jahr, Mach 1.0, wurde an der Verbesserung der Geschwindigkeit gegenüber dem vorhandenen monolithischen Kernel gearbeitet. 1988, mit Mach 2.0, lief der Kernel bereits auf den Architekturen DEC VAX, IBM-RT-PC und Sun 3 und wurde z. B. von BBN Advanced Computers Inc., Evans and Sutherland Computer Division, Encore Computers und NeXT für kommerziell vertriebene Unix-Betriebssysteme, u. a. auf den Rechnerarchitekturen IBM RP3, Sequent Balance, Macintosh II, IBM 370 und Intel 80386 genutzt. Bis Mach 2.6 waren noch große Teile des BSD-Kernels selbst enthalten, womit Mach zwar größer als ein reiner BSD-Kernel war, aber auch voll dazu kompatibel. Mit Mach 3.0 von 1989 wurden alle BSD-Bestandteile ausgelagert und Mach zum Mikrokernel, dem anfänglichen Entwicklungsziel. Der verbleibende reine µ-Kernel war dadurch leichter für weitere Betriebssysteme nutzbar. Nachdem CMU Mach3 veröffentlichte, wurde der µ-Kernel vom OSF Research Institute im Rahmen des OSF/1-Betriebssystems weiterentwickelt. Durch die zahlreichen Verbesserungen erhielt dieser Kernel den Namen OSF MK.
Auf OSF MK, dem verbesserten Mach3-Kernel, wurde ab 1995 MkLinux entwickelt und gleichzeitig OSF MK auf die PowerPC-Plattform portiert. MkLinux ist als Single Server angelegt, das heißt, Linux wird als einzelner Prozess (englisch task) auf dem Mach3-Mikrokernel ausgeführt. Auf OSF MK basiert ebenfalls der in Rhapsody und macOS eingesetzte XNU-Kernel, der jedoch als Hybridkernel ausgelegt ist und somit nicht mehr nur dem Mikrokernel-Konzept von Mach entspricht.
Aufbauend auf CMU Mach3, wurde an der Universität von Utah, kurz UU, in der Flux Research Group der Abteilung Computerwissenschaften (englisch Departement of Computer Science), bis 1996 an Version 4 von Mach gearbeitet. Mach4 hätte als Kernel für ein Betriebssystem im Rahmen des Flux-Projekts dienen sollen, wurde jedoch nach kurzer Zeit nicht mehr weiterentwickelt und zugunsten von OSKit aufgegeben. OSKit beinhaltet die ursprünglich für Mach4 entwickelten Kompatibilitätsschichten (englisch glue-code), um Linux-Treiber und Unix-Komponenten mit relativ geringem Aufwand auf andere Betriebssysteme portieren zu können.
Mach4 diente als Basis für die freie Implementierung GNU Mach, die beim GNU-Betriebssystem eingesetzt wird. Aufbauend auf den Mach-Mikrokernel stellt GNU Hurd die Unix-kompatible Betriebssystemkomponente (analog zu BSD-Unix bei CMU Mach). In den 1990er Jahren wurde Linux als (monolithischer) Kernel benutzt, was GNU/Linux als vorläufiges GNU-Betriebssystem hervorbrachte, bis der GNU-eigene Kernel – GNU Hurd – benutzbar war. (Siehe GNU/Linux-Namensstreit.)

## Eigenschaften

Zu den Design-Zielen von Mach zählte zusätzlich auch Multitasking und Speicherschutz. Als Mikrokernel soll Mach so wenig der traditionellen Kernel-Funktionen wie möglich und gleichzeitig so viele wie nötig implementieren. Daraus ergaben sich diese vier Kernaufgaben:
* Prozess- und Thread-Verwaltung, englisch tasks and threads
* Interprozesskommunikation, IPC
* virtueller Speicher
* Scheduling
Als minimale Abstraktion bietet Mach letztlich folgende Systemkomponenten, die sehr stark auf die Interprozesskommunikation (IPC) zurückgreifen:
* task: ein Prozess, der einen oder mehrere Threads enthalten kann
* thread: die kleinste Ausführungseinheit, die Teil eines Prozesses ist
* port: ein einfacher Objektreferenzmechanismus von Mach, implementiert durch den Mach-IPC-Mechanismus
* port set: eine Gruppe von ports, die sich einen gemeinsamen message queue teilen
* message: eine grundlegende Methode zur Kommunikation zwischen Threads
* memory object: ein Speicherobjekt, das von Prozessen genutzt werden kann

## Beispiele

* MACH 0.x–2.5 Referenzimplementation
** Mach-Betriebssystem der Carnegie Mellon University (CMU)
* MACH 2.0
** NeXTStep bis 0.9 (1988), das auf den ersten NeXTcubes vorinstallierte Betriebssystem
* MACH 2.5
** OSF/1 (ab 1989), später Digital UNIX und Tru64 UNIX (HP; bis 2012)
** NeXTStep 1.0–3.3 (1989–1995)
** OPENSTEP 4.0–4.2 (1996–1997)
* CMU Mach3
** OSF/1 (ab 1989)
* OSF MK, verbesserter CMU-Mach3-Kernel durch die Open Software Foundation
** OSF/1 (ab 1990) und dessen Nachfolger Tru64 UNIX (1993–2012)
** MkLinux (1996–2002) – Linux-Kernel als einzelner Task im Mach-Kernel
* Mach4, Weiterentwicklung durch die Universität von Utah
* GNU Mach, Weiterentwicklung von Mach4 durch das GNU-Projekt
** in Form von GNU Hurd, u. a.
*** Debian GNU/Hurd (seit 1998)
* Mach-basiert (nur teilweise implementiert oder stark verändert), Beispiele:
** OS/2 Warp Connect, PowerPC edition (Beta-Versionen ab 1994)
** in Form von XNU, einem zum Hybridkernel weiterentwickelten OSF-MK-Kernel u. a. mit Komponenten des FreeBSD-Kernels:
*** Rhapsody (1997–2000)
*** Darwin (ab 1999) als Basis von macOS, iOS, iPadOS, tvOS, watchOS und audioOS