Mach

Mach（マーク哲学者のエルンスト・マッハと同じスペル Machであることからマッハと呼ばれることもあるが、正式にはマークと呼ぶのが正しいとされる。）とは、カーネギーメロン大学のリチャード・ラシッド教授（実際の実装はアビー・テバニアンが中心Darwin Releases Sourceのリスト内からダウンロード出来るxnuのソースコードを参照）らのMachプロジェクトにより開発されたマイクロカーネルタイプのオペレーティングシステム (OS) を言う。名前は「複数非同期通信ホスト」を意味する英語「」に由来している。

 開発の経緯 
1980年代中頃、アメリカ国防総省高等研究計画局によって開発されていた実験用マルチプロセッサコンピュータ用のOSをアメリカ国防総省に提案、採用されたことにより 1985年からMachの開発は始まった。当初はスーパーコンピュータ・ワークベンチ・プロジェクト（）と呼ばれていた。

当時、米国の研究機関で主に用いられていた 4.2BSD UNIXの設計は、古く効率の悪い仮想記憶機構、マルチプロセッサマシンに対して非効率な構造、移植性の悪い冗長なコードなど、当初のUNIXでは想定していない様々な機能をカーネルに追加したため、非常に見通しの悪い構造となっていた。これを解決することがMachの目的であった。

マルチプロセッサ対応（100プロセッサ程度が想定された）
高価で少ない実メモリを想定するのではなく、巨大なメモリ空間と十分な実メモリを有効利用する
分散システムをサポートし、高速でネットワーク透過なプロセス間通信 (IPC) をサポート
移植性の高い構造
4.3BSDと完全な互換性

これらを実現することを目標に開発が行われた。

 歴史 
当初から4.3BSD UNIXと互換であることが決定されていたこともあり、4.3BSDのカーネルソースコードを元に修正を加えることで実装を行った。実際には3.0からがマイクロカーネルであり、Mach 2.5まではマイクロカーネルではない。

 Mach 1.0 
1986年リリース。研究開発の進捗報告として発表された。新しい仮想記憶とIPCは実装されていたが、タスクとスレッドはまだ実装されていなかった。

 Mach 2.0 
1988年リリース。タスクとスレッドの実装、いくつかの改善。初期のNeXTSTEPのカーネルとして利用された。

 Mach 2.5 
NFS の実装、のOSF/1のカーネルとして利用された。

 Mach 3.0 
1989年リリース。マイクロカーネル化。MkLinuxのカーネルとしても使われた。macOSのカーネルXNUにも用いられているが、実装はマイクロカーネルではない。

リチャード・ラシッド教授が1991年にマイクロソフトへ移籍した後も1994年までカーネギーメロン大学でMachプロジェクトは続いた。以後、Machの開発はユタ大学のMach 4プロジェクト、のHurdプロジェクト、カーネギーメロン大学の ARTプロジェクトなどに引き継がれていった。ユタ大学で Mach 4として分散環境を考慮したスレッドおよびメッセージの改良、Linuxデバイスドライバインターフェースの実装を行った。GNUプロジェクトではこのMach 4をベースに改良を加え、GNU Machとして公開している。ARTプロジェクトでは分散リアルタイムOS実現のため、実時間駆動型スケジューラなどがMach に組み込まれ、として公開された。これらの研究開発はMachのみならずBSDにもフィードバックされ、仮想記憶システムを含むいくつかの機能は4.4BSD Liteにも利用されている。

 Mach の基本概念 
タスク
UNIXのプロセスは計算処理とそれに必要なリソースを一体化しているのに対し、Machは計算処理とそのリソースを分離するとともに、独立に制御できるようにした。タスクはCPU実行時間（スレッド）やメモリオブジェクト、アドレス空間、ポート等のリソースの集合体である。
スレッド
UNIXのプロセスから、CPU実行時間をリソースとして分離、抽象化したもの。スレッドはCPUの処理単位であり、並列に動作することができる。スレッドは必ず一つのタスクに属し、そのタスクの全てのリソースにアクセスできる。タスクは複数のスレッドを持つこともできる。リソースの保護はタスクを単位として行われるため、UNIXプロセスと異なりメモリ空間などのリソースと直接関連しない。結果としてスレッドの生成や切り換えは高速に行われるとともに、マルチプロセッサにも最適化される。
ポート
初期のUNIXではパイプ機能が主なIPCの手法であったが、ファイルを抽象化したパイプ機能では、様々な形態のデータの受け渡しを十分に抽象化できなくなっていた。UNIXでは様々なデータの受け渡しを実現するため、様々な方法で拡張を行ったが共有メモリ、4.2BSD以降でのSocket、SystemVでの msgrop() など、Machではそれらを統合して新たにポートという概念を実装した。ポートはデータ受け渡しのために使われる通信チャネルである。構造化されたメッセージを受け渡す枠組みを実現し、ネットワーク越しの通信も含めて抽象化するとともに、高速、効率的なメッセージの送受信（out-of-lineデータ）が可能となった。
メッセージ
カーネルが管理するIPCのデータオブジェクト。メッセージは複数の型づけされたデータの集まりである。メッセージはカーネルによって管理され、ポートを通じてプロセス間の通信に用いられる。
メモリオブジェクト
MachはUNIXと異なり、仮想記憶を管理する機能をカーネル内部に実装（内部ページャ）しているだけではなく、ユーザーレベルにも開放している（外部ページャ）。ページャが操作するメモリの基本的な抽象概念をメモリオブジェクトと呼ぶ。4.3BSDでは実現できなかったcopy-on-writeやmap-on-referenceといった遅延評価のメカニズムメモリを要求された時点で確保するのではなく、使用された時点で確保する方式。メモリがコピーされた場合も、実際の動作としてはコピーではなく仮想記憶機構を利用して多重参照するだけとし、実際にコピーを行うのは、書き換えられた領域のみとなる。結果として必要最小限のメモリ確保、メモリコピーしか行われないというメリットを持つが実装され、効率よくメモリ資源を利用できるようになった。

これらのMach生まれの基本概念は、その後のUNIXのみならず、数多くのOSに多大な影響を及ぼした。

 読み方 
この新しいOSの名前をどうするのかという雑談の中で出た MUCK () というアイディアを、リチャード・ラシッド教授の同僚のイタリア人 Darlo Giuse がMachと聞き間違えたことに由来する。最終的にはコインの裏表で決定したMach(1993) p.v。従って原則英語読みの「マーク」という発音が正しい。

 Machを採用したOS 
OSF/1
NEXTSTEP - Mach用OPENSTEP
GNU Hurd (GNU Mach)
MkLinux
macOS (Darwin), iOS, iPadOS, tvOS, watchOS（ただし、実行効率を得るために実行レベルでは単一バイナリになっている）

 関連項目 
 分散オペレーティングシステム
 マイクロカーネル
 Berkeley Software Distribution (BSD)

 脚注 

 参考文献 



Category:OSのカーネル
Category:1986年のソフトウェア
Category:開発が終了したソフトウェア