Real-Time Mach について



Real-Time Mach とは何か?

Real-Time Mach はマイクロカーネルアーキテクチャに基づいた リアルタイム・オペレーティングシステム(OS)です. いわゆる組み込み型コンピュータ(embedded computer)からワークステーションまで, ハードリアルタイムアプリケーションからソフトリアルタイムアプリケーションまで, 幅広い要求に応えることができる分散リアルタイム OS ファミリの提供を目指しています.

Real-Time Mach を使うと,

  1. 資源の保証 -- プログラムを実行するのに必要な などの予約,予約に基づいた資源配分,資源配分の調停
  2. 優先度の保証 -- 優先度逆転をひきおこさない同期制御(排他制御)
  3. 用途に応じたOSの作成 -- ハードウェアやアプリケーションの規模や性質に応じた必要最小限規模のOSの作成
ができるようになります. 何かの処理が速くなるのではなく, 処理の予測可能性(predictability)の向上や ものごとの優先度に応じた処理の保証を目指しています.

割り込み応答時間のみを追及したリアルタイムOSでは, 優先度逆転現象によって最高優先度のプロセスが低優先度のプロセスによって ブロックされることがあります. これは,緊急時における処理が不可能となり得ることを意味しています. すなわち,ハードリアルタイムシステムで必要な predictability がありません. Real-Time Mach は,このようなことを防ぐことを目指しています. NASAで打ち上げたマーズパスファインダーが火星上で制御不能となる事故があり, ソフトウェアのバグと報じられていましたが, これは優先度逆転現象によって引き起こされたものです.

Real-Time Mach では, さまざまなスケジューリングポリシが選択可能なリアルタイムスケジューラとともに, このような優先度逆転を起こさないように工夫された同期制御機構を備えています. また,ハードリアルタイムシステム向けのツールとして Scheduler 1-2-3 と ARM を備えています. Scheduler 1-2-3 は, アプリケーション設計時に スレッドセットがスケジュール可能かを検証するツールです. ARM は,リアルタイムアプリケーション走行中にリアルタイムにイベントを収集し, タイミングを検証するためのツールです.

予測可能性を向上させるためには, スケジューラや同期制御機構以外での工夫も必要です. Real-Time Mach では, 指定されたメモリ領域をページアウトしないようにしたり (メモリのワイアリングをしたり), キャッシュメモリを制御したり, メモリ領域を予め確保したり, メモリの利用状況に応じてワイアリングをしたり することができます. また,Real-Time Mach ファミリの一員には メモリベースのファイルシステム, リアルタイムプロトコル処理システム, ディスク帯域幅制御システム, ネットワーク帯域幅制御システム, メモリへの自動圧縮ページインページアウトシステム などがあり, その目的に応じて,予測可能性を向上させるために利用することができます.

さて,UN*X流のOSのような公平を目指した資源管理では, 優先度の低いプロセスが資源を食いつぶすことで 優先度の高いプロセスへのサービスをほぼ不能とすることができます. これは,いわゆる Denial of Service が容易におきることを意味しています. Real-Time Mach では, 様々な資源を予約メカニズムを提供しており, これを利用することで特定のプロセスに対して資源を確保し, 必要な資源が食いつぶされないようにすることが可能となっています.

Real-Time Mach はマイクロカーネルアーキテクチャを採用しているため, OS環境を提供するサーバを自由に交換することができます. つまり,開発時にはフルの 4.4BSD 環境を利用し, 実行時にはメモリベースのコンパクトなシステムを利用する, 逆に,分散共有メモリやパラレルシェルを利用したPCクラスタを利用する, といったことが可能です.

Real-Time Mach は様々なアーキテクチャのコンピュータで動作しますが, 最も簡単に利用できるのは i386 以上を用いた PC/AT 互換機です. PCCard もサポートしていますので,ノートPCでも動きます.

欠点もないわけではありません. サポートしているデバイスがLinuxやFreeBSDに比べて少ない, BSDシステムとして利用したときにモノリシックカーネルシステムに比べて重い, という点があげられます.

マイクロカーネルアーキテクチャとは何か?

マイクロカーネルアーキテクチャとは,OSを

に分けて実現しようというものです. マイクロカーネルはカーネルレベルで動作し, サブシステムサーバはユーザレベルのプロセスとして動作するのが一般的です. これに対し, 従来のUn*x系のOS(Solaris, Linux, FreeBSD など)は, モノリシックカーネルアーキテクチャに基づいています.

マイクロカーネルアーキテクチャはモノリシックカーネルアーキテクチャに比べると,

  1. マイクロカーネル上に,様々なOSを同時に実現することが容易である.
  2. リアルタイム機能のサポートが容易である
  3. カーネルの巨大化を避けることが可能で,OSの拡張性,保守性が向上する
  4. マイクロカーネルにハードウェアの依存性を吸収させることで, OS全体の移植が容易となる.
というような特徴があると言われています. ただ,3番目後半と4番目後半はマイクロカーネルアーキテクチャの特徴というのは言い過ぎで, アーキテクチャによらず正しく設計されていればそうなっているはずです. よくあるマイクロカーネルに対する誤解としては, というものがありますが,これは間違いです.

マイクロカーネルだけではセルフコンパイルはできませんし, プログラムをロードするだけでも大変なことが多いです. このため, ほとんどのマイクロカーネルアーキテクチャをとるOSでは, Un*x personality を実現するシステムサーバを用意しています.

Real-Time Mach マイクロカーネルとはどんなものか?

Real-Time Mach マイクロカーネル Mach 3.0 マイクロカーネル に対してリアルタイム機能や資源予約機構などの新しい機能を加えたものです. Mach 3.0 にリアルタイム機能を加えたことから, RT-Mach 3.0 とも呼ばれることもありますし, 単に RT-Mach と呼ばれることもあります. また,最近は資源予約機能を主な売りとしているため, Carnegie-Mellon University (CMU) の開発グループでは Resource Kernel とも呼んでいます. 現在配布されているバージョンは, CMU で開発されたものをもとに 慶應義塾大学 MKng プロジェクト で開発したもの, それをもとにさらに CMU で改良を加えたものなどがあります. JAIST でも盛んに改良が行われており, 主要なものは MKng プロジェクトの成果にマージされています. NTT で開発した機能は MKng プロジェクトの成果にマージされていますが, さらに改良したもの(FreeBSD 2.2.8R 対応とインストーラの導入など)を公開 しています.

Real-Time Mach で利用できる personality server には何があるか?

これには,

などがあります. POE, Lites, RTS, RT-Java, GNU Hurd はライセンスフリーです. 現在,BSDSS は配布されていません. また,プロトコル処理を専門に行うサーバとして, があります.これらはライセンスフリーです. なお,NPS は RTS と統合されています.

UX と POE

以前の CMU 版 RT-Mach 上で安定して動くのは,UX, POE, RTS でした. UX はフルの4.3BSDの機能を持っていますが,BSDのライセンスがないと入手できません. 一方,POE はライセンスフリーですが, 単独ではネットワークは使えませんし, ファイルシステムへの書き込みもできません. 固定的な応用でプログラムをブートするときに用いたり, 自分用の OS personality server を作成するときのスケルトンとして用いられています. もちろん,x-kernel を同時に動かせば TCP/IP の処理はできます. だからといって telnet とかがすぐに使えるようになる訳ではありませんが.

POE と UX は同時に動作するようになっており, UX から POE を立ち上げたり, POE から UX を立ち上げたりして, UX の世界と POE の世界をひとつのマイクロカーネル上に同時につくることが可能です. POE は同時に複数立ち上げても大丈夫です. マルチパーソナリティシステムとかOSをユーザレベルでデバッグするとかの実験ができます. もちろん,ディスクを分ければ,UX を複数同時に立ち上げることも可能で, たとえば,UX から gdb を立ち上げ,そのなかから UX を立ち上げてデバッグをする ということもできます.

Lites

Lites は 4.4BSD Lite の機能をフル実装しており,ライセンスフリーです. これは,Mach 4 用の部分しか保守されていなかったので,木原誠司氏他が Lites を Mach 3.0 や RT-Mach へのポーティングしました. また,MKngプロジェクトにおいてもたくさんの改良がなされ, 安定して動くようになりました. ただ,UXに比べてパフォーマンスが悪い点が気になります. これは RT-Mach へのポーティングの仕方が悪いのではなく, Lites のもともとの設計が良くないのかもしれません. 現在の RT-Mach では,Lites をメインの OS personality server として用いています.

Lites から Lites を 2nd OS server として そのまま立ち上げることができるようになっています. この場合,stdin/stdout が Lites のコンソールになりますので, xterm を開いて,そこで 2nd Lites を起動することもできます. もちろん,ディスク(またはディスクスライス)を別にしないと, ファイルシステムが壊れてしまいますが.

RTS

RTSはリアルタイム処理向けの OS personality で,ライセンスフリーです. Un*x と似た機能を提供していますが, ファイルシステムはメモリベースとなっています. RTS はマイクロカーネルと予めリンクして利用するのが一般的です.

RT-Java

Real-Time Java server が RT-Mach マイクロカーネルの上で動きます. RT-Java はマイクロカーネルと予めリンクして利用するのが一般的です. 筆者は動かしたことがないので,これ以上のことはわかりません.

MDOS

DOSサーバです.最近の RT-Mach マイクロカーネルの上で動くかどうかはわかりません.

US

US とは 4.3 BSD ベースのマルチサーバです. これまで紹介した personality server はシングルサーバで, 単一のプログラム(というか,プロセス,というか,タスク)で ひとつの personality を実現していますが, US は複数のサーバで Un*x personality を実現しています. マルチサーバとすることで, OS の機能の一部分を取り替えたり,追加したり, モノリシックカーネルにモジュールをロードする方法ではできない 様々なおもしろいことができます.

パフォーマンス的には UX と遜色のない結果が出ているそうです. なお,US 全体を入手するためには BSD ライセンスが必要です. ライセンスフリーでないファイルを取り除いたものがフリーに配布されていますが, このままではコンパイルできません. 欠けている部分を補うのはかなり大変な作業になると思います.

GNU Hurd

GNU Hurd はマルチサーバで実現されています. GNU Hurd は GNU Mach 特有のインターフェースを使っていないようなので RT-Mach でも動きます. Hurd のカーネルである GNU Mach と RT-Mach の違いには次のものがあります.

というわけで,Hurd を使うためにはちょっとした工夫が必要になります. 具体的には Lites 上で Hurd を起動するためのプログラムをつくり, 2nd OS server として Hurd を立ち上げることになります. このコードは update 3 に含まれています.

現在分かっている大きな問題は,setuid され(もしくは,オーナが root で設定されたトランスレータで), かつ,ダイナミックリンクされたプログラムのうち,libnss_*.so をダイナミックにロードするプログラムが動かないという点です. libc.so から libnss_*.so をダイナミックにロードするところがうまく動かないようです. これを回避するには,

のいずれかの方法をとる必要があります.これは VMまわりの問題と想像していますが,何が原因かはよくわかっていません. また,いくつかのサーバ(トランスレータ)において, たくさんのスレッドをフォークしてシステムが遅くなっていくという現象もみられますが,これは RT-Mach が悪いのではなく,Hurd の各サーバ(トランスレータ)内で, フォーク回数の上限値を設定するようにコーディングされていないためで,gnumach 上でも同様の現象がみられます.

ちなみに GNU Mach は U. of Utah の Mach 4 から派生したもので, さらに Mach 4 は Mach 3.0 から派生したものです. Mach 4 は migrating thread, つまり,RPC をするとサーバにスレッドが移動するというモデルもサポートしています. これは Georgia Tech の Clouds や Georgia Tech の人たちが CMU に移ってから作った Alpha Kernel の流儀のスレッドモデルですね.


Real-Time Mach のスペックは?

サポートハードウェア

MKng プロジェクトの活躍で RT-Mach が動作する環境はだいぶよくなりました. サポートしている CPU としては, Intel i386 系, MIPS R3000, R4000, R5000 系, Super SPARC, PPC 603, 604(?) などがあります. Mach 3.0 では 68k, 88k, Alpha などでも動いていたので, それらへのポーティングは難しくないと思います. 具体的には,

PC ですとちょっとだけ古めのボードを積んだものであれば動くでしょう. FreeBSD 2.2.0 程度が動けば動く確率が高いです. また,たいていの laptop PC でも動きます. もちろん,PCCard (PCMCIAカード) も通常通り使えます. 詳しくはこちらをご覧下さい. 上記以外の Macintosh なら Mach + MkLinux でよければ, AppleThe Open Groupによる移植を利用できます. Linux server を RT-Mach 上へポーティングするとうれしいかもしれません. Lites には,古いですが Linux emulation 機能も入っています.

マイクロカーネル

システムサーバ

そのほか


Real-Time Mach の入手法は?

これらのコードを入手したい場合には, 我々の RT-Mach のホームページをご参照下さい. 現在配布中の RT-Mach は,全てライセンスフリーとなっています.

最も簡単に RT-Mach を利用するためには, FreeBSD 2.2.8R がインストールされた PC に RT-Mach NR2 のバイナリパッケージを pkg_add することです. もちろん,両者がマージされたディストリビューションを使って, PC に FreeBSD 2.2.8R もろともインストールしてしまうのもいいでしょう. これらをゲットする方法も ここをどうぞ. これらは基本的に PC アーキテクチャ用ですが, それ以外のソースコードも入っています.


Our extensions and ST-II protocol server

NTTでなされたカーネル拡張,バグ修正,ST-II Protocol Server 等は 上記のコードにマージされています.


Satoshi Moriai / 盛合 敏

$Id: intro-j.html,v 1.22 2006/07/19 10:57:15 kihara Exp $