COM のマーシャリング関連の用語

概要

COM (Component Object Model) におけるマーシャリングに関連した用語の意味を調べた時のメモです。 主に自分用。

用語

Process (プロセス)
プログラムコードと仮想メモリ空間、データ、システムリソースの集まり。
Thread (スレッド)
プログラムの制御が進む道、あるいはその流れ。 スレッドはプロセスの中に一つ以上存在し、 コードを連続して実行する。
Marshaling (マーシャリング)
プログラムが、プロセスやアパートメントのメモリ空間を超えて情報を送受信する過程を指す
RPC (Remote Procedure Calls)
別のメモリ空間にロードされた関数を呼ぶ事。 「リモート」という言葉が暗示するように、 ネットワークをまたがって関数を呼び出すのが本来の形 (少なくとも Win32 の実装ではローカルでの呼び出しも可能)。 不正確な表現かもしれないが、要するに他のプロセスの関数を呼び出す事。 RPC の実行は意味的に関数呼び出しなので、 関数をロードしている側のプロセスに引数データを転送し、 実行が終わるまで待って、 転送されてくる返値を受け取る形となる。
Proxy object (プロキシ オブジェクト)
クライアントのメモリ空間で動作する COM オブジェクトで、 サーバが同じメモリ空間に存在するとクライアントに思わせるのが役割。 したがって、 プロキシーオブジェクトはサーバと同じインタフェース(メソッド)を用意し、 メソッドが呼び出されると実際のサーバへそのパラメータを転送する。 なお、メソッドの実行結果は stub から受信して解釈、クライアントへ返す。
Stub object (スタブ オブジェクト)
サーバのメモリ空間で動作する COM オブジェクトで、 クライアントが同じメモリ空間に存在するとサーバに思わせるのが役割。 したがって、 スタブ オブジェクトはマーシャリングされてきたメソッド呼び出しの情報を解釈し、 サーバのメソッドを実際に呼び出す。 なお、メソッドの実行結果は逆にプロキシ オブジェクトへとマーシャリングして返す。
Apartment (アパートメント)
COM オブジェクトが存在する仮想的な空間。 すべての COM オブジェクトは必ずどこか一カ所のアパートメント内に存在する。 アパートメントはプロセス内に複数存在でき、 アパートメント内には一つ以上のスレッドが存在する。 COM オブジェクトのメソッドはそのオブジェクトが属するアパートメント内のスレッドからのみアクセスが可能で、 その他のアパートメントからアクセスするにはプロキシを介す必要がある。 CoInitializeEx で生成されるが、 引数でスレッドモデルを選択する (STAMTA のどちらか)。
STA (Single-Threaded Apartment)
内部にスレッドが一つだけ存在できるアパートメント。 COM フレームワークの決まり事として、 STA 内の COM オブジェクトへのアクセスは同期的に行われる。 このためデッドロックをはじめとする同期問題は起こらないが、 すべてのアクセスに同期処理が必要なので速度が低下するデメリットもある。 なお、COM はこの同期処理に Windows メッセージキューを利用するためプロセスの主スレッドは Windows メッセージループを実装する必要がある (COM が不可視ウィンドウを作り、 それに「RPC を実行する」というメッセージを投げる)。
MTA (Multithreaded Apartment)
内部にスレッドが複数存在できるアパートメント。 STA と違って COM オブジェクトへのアクセスが同期的に行われない。 もし COM サーバが MTA での利用を考えていない場合、 オブジェクト生成の部分でさっそく同期問題が起こる可能性もある。 おそらく「STA のみ対応」の COM サーバは MTA で利用しない方が無難だろう。 なお、よく設計されたマルチプロセッサ対応クライアントでは、 同期処理がボトルネックになる STA より MTA の方が速度面で有利と考えられる。 また STA のクライアントには同期処理用にメッセージループが必要だったが、 MTA では不要。

参考文献