メッセージ (コンピュータ)
メッセージ(テンプレート:Lang-en-short)とは、言付け、伝言、伝送文などの意味がある。 計算機科学におけるメッセージパッシングとは並列コンピューティング、オブジェクト指向、プロセス間通信で使われる通信方式である。プロセスもしくはオブジェクトといったモデルではメッセージ(ゼロ以上のバイト、複雑なデータ構造、プログラムコードも)を送ったり受けたりできる。メッセージを待つことによって同期 (計算機科学)することも出来る。メッセージパッシングに基づく主なモデルとしてアクターモデルやプロセス代数がある。
Microsoft Windows などのオペレーティングシステムにおいて、メッセージとは、オペレーティングシステム上で動くアプリケーションで、オペレーティングシステムが管理しているデバイスからの入力をアプリケーションまで伝えることまたはその内容のことである。
オペレーティングシステムはメッセージをメッセージキューに保管し、アプリケーションはメッセージキューに保管されていたメッセージを受け取り、それを元に処理を行う。例えば「(10, 20) 左クリック」という情報をオペレーティングシステムが感知したらオペレーティングシステムはその情報をメッセージキューに保管する。アプリケーションはそのメッセージを受け取って対応した処理を行う。
アプリケーションは常にオペレーティングシステムからのメッセージを待機するようなプログラムになっており、この一連のプログラムの機構をメッセージループという。
目次
[非表示]概要
メッセージパッシングはひとつもしくは多くの受信者に対して送信者がデータを配送できる通信方法である。メッセージの形として遠隔メソッド呼び出し(RMI[1])、シグナル、データパケットなどがある。メッセージパッシングシステムを設計するとき、デザインは次のように選択される
- 個々のメッセージの送受信を確実に行うかどうか
- メッセージが送信した順序通りに受信されることを保証するかどうか
- メッセージのやりとりは一対一、一対多(マルチキャストもしくはブロードキャスト)、多対一(クライアントサーバモデル)か
- 通信の同期が必要か
重要な理論上の基礎であるアクターモデル、プロセス計算といった並行計算はメッセージパッシングを基礎としている。メッセージパッシングを使った並行システムは、言語内の機能としてメッセージパッシングする場合と言語からの一連のライブラリ呼び出しで実現する場合がある。 前者の例は多くの分散オブジェクトシステムが含まれる。後者の例としては、カーネルとサーバブロック間でメッセージをやりとりするマイクロカーネルオペレーティングシステムや、高性能計算における Message Passing Interface がある。メッセージパッシングの概念は、グラフモデル上のベイズ推定などでも使われている。
メッセージパッシングシステムとモデル
分散オブジェクトや ONC RPC、CORBA、Java RMI、DCOM、SOAP、.NET Remoting、CTOS、QNX Neutrino RTOS、OpenBinder、D-Bus のような遠隔メソッド呼び出しや似たものはメッセージパッシングシステムである。メッセージパッシングシステムは共有のないシステムと呼ばれている。なぜならば、メッセージパッシング型のシステムは、メッセージという抽象化によってその下位に存在する状態変化や実装などを隠蔽するものだからである。
メッセージパッシングモデルはデータを端末(アクター、プロセス、スレッドなど)に送信するような通達方式で、プログラミング言語で典型的に定義されている。そのようなメッセージングはSOAPによってWebサービスの中で使われている。この考え方はパケットより大きく、任意に信頼性や耐久性や安全性やトランザクションを追加したものを除く高いレベルのメッセージデータグラムである。メッセージもまた一般的に同じ向きのプロセス間通信につかわれる。また別の一般的に使われる技術はストリームもしくはパイプで、そのようなデータは初歩的なデータアイテムの一連として送信される(仮想回線の高等レベルでは)。
同期通信と非同期通信
同期メッセージパッシングシステムでは送信者と受信者がお互いにメッセージの転送を待つ。つまり、送信者は受信者がメッセージを受信するまでプログラムを再開できない。
同期通信は二つの利点がある。利点の一つ目はメッセージ転送において送信者と受信者で同期をとるため、プログラムを単純化できることである。利点の二つ目はバッファを必要としないことである。メッセージはいつでも受信側に保存される。なぜならば、送信者は受信者の準備が完了するまで送信を待つためである。
非同期メッセージパッシングシステムは受信者から送信者に準備が出来る時間を待たずにメッセージを送る。非同期通信の利点はお互いに待つことがないので、お互いの計算をオーバーラップして行える。
同期通信は送信者がいつも受信者が続ける前にメッセージを応答したことを確実にする非同期通信をベースに築かれている。
非同期通信はバッファを必要とするが、そのバッファが満杯になると問題の原因になる。送信者をブロックするか今後のメッセージを切り捨てるか判断をしなければならない。送信者をブロックはすれば、予期しないデッドロックを引き起こすかもしれない。メッセージを捨てた場合通信の信頼性は無くなる。
メッセージパッシングと関数呼び出しの比較
メッセージパッシングはプログラム間で情報を受け渡す為のもうひとつの通信方法、つまりCallと対比されるべきである。伝統的なCall
においては、引数は典型的には一つ以上のレジスタか引数のアドレスを内包しているパラメタリストを通じて(受信者の)"callee"に渡される。この通信形式はメッセージパッシングと比較して少なくとも三つの大きな違いがある。
- 合計メモリ使用量
- 通信速度
- ローカリティ
メッセージパッシングではどの引数も、新しいメッセージの中にコピーするのに十分なメモリを余計に必要とする。これはオリジナルの引数のサイズの大小によらない。一つの引数がwebページを記述するHTML文字列10,000オクテットとして(この記事と同じ位のサイズ)、受信プログラム(ローカルプログラムでないならば)に完全にそのサイズをコピーして(そして送信しなければならない)。 対照的に、callならば、それぞれの引数に対してアドレスを渡すのに4から8バイトしか必要でない、さらにレジスタならゼロストレージで、ゼロ送信タイムである。これは勿論分散システムでは不可能である。受信者のアドレス空間の(絶対)アドレスがリモートプログラムでは通常意味が無いからである。ただし、もし、calleeが前もってcallerのメモリの完全な(少なくとも一部)コピーを有していたなら相対アドレスが利用可である。
メッセージパッシングスタイルの例
他のプログラミングモデルへの影響
オブジェクト指向の幾つかの専門用語の中にメッセージはオブジェクトにコントロールを渡すという意味で使われる。もしオブジェクトがそのメッセージに応答したならばそれはそのメッセージに対するメソッドを持っている。詳しくはオブジェクト指向プログラミングを参照すること。
純粋なオブジェクト指向ではメッセージパッシングは排他的にダイナミックディスパッチに投げられる様に機能する。
同じメッセージを二回同じオブジェクトに送信した場合、普通そのメソッドを二回請求する結果となる。もし、名前と引数が同じならば二つのメッセージは同じメッセージタイプと考えられている。
オブジェクトは自分のメソッド本体から他のオブジェクトにメッセージを送信できる。メッセージパッシングシステムの中で、究極遅延束縛[2])が可能である。
アラン・ケイ は彼の視点のオブジェクト指向プログラミングの中ではオブジェクトよりも重要なコンセプトだが、人々はよくそのポイントと場所を見逃し、オブジェクト自体に重点をおきすぎ、十分メッセージをその間に送ってないと主張した。ライブ分散オブジェクトのプログラミングモデルはこの所見を踏まえて作られた。それは分散型データフローのコンセプトを使い複雑な分散型システムの振る舞いをメッセージパターンの(高レベル)機能スタイル仕様書とみなした。
幾つかの言語では、あるオブジェクトがメッセージをハンドルするメソッドを持っていなくとも、それを持っているであろう他のオブジェクトを知っている場合に、メソッド呼び出しを1つのオブジェクトから他のオブジェクトへフォワーディング、もしく委譲することをサポートしている。メッセージ転送を参照。
1977年、カール・ヒューイットは計算制御構造は「メッセージパッシングのパターン」と見ることができると主張した[3]。
関連項目
- イベント駆動型プログラミング
- メッセージループ
- メッセージ指向ミドルウェア
- IoC
- en:Active message
- en:Database-centric architecture
- en:Dynamic dispatch
- en:Message loop in Microsoft Windows
参考文献
- Ramachandran, U.; M. Solomon, M. Vernon (1987年)"Hardware support for interprocess communication." Proceedings of the 14th annual international symposium on Computer architecture, ACM Press
- McQuillan, John M.; David C. Walden (1975年)"Some considerations for a high performance message-based interprocess communication system." Proceedings of the 1975 ACM SIGCOMM/SIGOPS workshop on Interprocess communications, ACM Press
- Shimizu, Toshiyuki; Takeshi Horie, Hiroaki Ishihata (1992年)"Low-latency message communication support for the AP1000." Proceedings of the 19th annual international symposium on Computer architecture, ACM Press