囲みコラム

プロセス境界と遠隔オブジェクト


チーム、すなわち一般的なOSの用語でいうプロセスは、仮想記憶に基づくメモリ保護など、OSの働きによって他のプロセスと干渉しないように守られています。これによって、他のプロセスの動きを意識しないでプログラミングすることができるのです。ここでは、プロセス同士を互いに保護するために設けられた「壁」のことを「プロセス境界」と呼びます。そして、アプリケーション同士がプロセス境界を超えてデータ交換するための仕組が、アプリケーション間通信の機構です。第3章で述べたように、BeOSにはマイクロカーネルが提供するスレッド間通信機構があり、これを利用してアプリケーション間通信を行えます。

第3章の説明で、BLooperクラスとBHandlerクラスによるメッセージ通信のフレームワークについて述べました。BeOSでは、マイクロカーネルのスレッド間通信機構を利用してメッセージ通信のフレームワークが構築されており、オブジェクト間のメッセージ通信にスレッド間通信を統合しています。つまり、BLooperオブジェクト同士のメッセージ通信は、スレッド間の通信でもあるのです。BMessengerクラスは、この仕組を応用したものです。異なるアプリケーションの中のBLooperオブジェクトに対し、スレッド間通信機構を使ってメッセージを送ることにより、あたかも同じアプリケーション内のオブジェクトを相手にするのと同じようにメッセージ通信することができます。言い換えると、BeOSではアプリケーション間通信とオブジェクト間のメッセージ通信を共通に扱えるのです。

これに対し、MacOSやWindows、またUnix系OSなど従来のOSでは、フレームワークが提供するオブジェクトはアプリケーション内部でしか有効でなく、プロセス境界を超えてメッセージを交換することはできません。つまり、オブジェクト同士のメッセージ交換と、アプリケーション間通信とは別の流儀でプログラミングしなければいけません。この問題に対する対策としては、Microsoft社のCOM/DCOMなどの、アプリケーション間通信用のオブジェクトモデルがあります。しかし、それらはC++などのプログラミング言語とは独立したものであるため、両者が並立してしまい、理解やプログラミングを困難にしているのが実情です。

上に述べたように、BeOSでは同一アプリケーション内でのオブジェクト間通信と、他のアプリケーションの中にあるオブジェクトとの通信が透過です。つまり、BMessengerクラスを利用することにより、相手のオブジェクトが同じアプリケーションの中にあるのか違うアプリケーションの中にあるのかを意識しないでプログラミングできるのです。ここでは、BMessengerを通してメッセージ通信するオブジェクトのうち、他のアプリケーションの中にあるものを指して「遠隔オブジェクト」と呼びます。このような、遠隔オブジェクトの利用が可能なAPIを提供したOSには、他にNEXTSTEPが有名です。しかし、BeOSの方がメッセージ通信の考え方が徹底しており、それだけシンプルで理解しやすいものになっています。


Art of BeOS Programming
koga@stprec.co.jp