メッセージパッシング

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータサイエンスでは、メッセージパッシングコンピュータ上で動作を呼び出す(つまり、プログラムを実行する)ための手法です呼び出し側プログラムは、プロセスアクターまたはオブジェクトの場合があります)にメッセージを送信し、そのプロセスとそのサポートインフラストラクチャに依存して、適切なコードを選択して実行します。メッセージパッシングは、プロセス、サブルーチン、または関数が名前で直接呼び出される従来のプログラミングとは異なります。メッセージパッシングは、並行性オブジェクト指向プログラミングのいくつかのモデルの鍵です。

メッセージパッシングは、現代のコンピュータソフトウェアに遍在しています。[要出典]プログラムを構成するオブジェクトが相互に作用する方法として、また異なるコンピューター(インターネットなど)で実行されているオブジェクトとシステムが相互作用する手段として使用されます。メッセージパッシングは、チャネルを含むさまざまなメカニズムによって実装できます

概要

メッセージパッシングは、コンピューター上で動作を呼び出す(つまり、プログラムを実行する)ための手法です。プログラムを名前で呼び出す従来の手法とは対照的に、メッセージパッシングではオブジェクトモデルを使用して、一般的な関数を特定の実装から区別します。呼び出し側プログラムはメッセージを送信し、オブジェクトに依存して適切なコードを選択して実行します。中間層を使用する理由は、基本的にカプセル化と配布の2つのカテゴリに分類されます。

カプセル化とは、ソフトウェアオブジェクトが、他のオブジェクトのサービスがどのように実装されているかを知らなくても、気にせずに、他のオブジェクトのサービスを呼び出すことができるようにする必要があるという考えです。カプセル化により、コーディングロジックの量を減らし、システムをより保守しやすくすることができます。たとえば、開発者を呼び出すサブルーチンまたは関数を決定するIF-THENステートメントを使用するのではなく、オブジェクトにメッセージを送信するだけで、オブジェクトはそのタイプに基づいて適切なコードを選択します。

これをどのように使用できるかを示す最初の例の1つは、コンピュータグラフィックスの分野でした。グラフィックオブジェクトの操作にはさまざまな複雑さが伴います。たとえば、正しい数式を使用して囲まれた形状の面積を計算するだけでは、形状が三角形、長方形、楕円、または円のいずれであるかによって異なります。従来のコンピュータプログラミングでは、これにより、形状がどのようなオブジェクトであるかをテストし、適切なコードを呼び出す長いIF-THENステートメントが生成されます。これを処理するオブジェクト指向の方法は、 andShapeなどのサブクラス(サブクラスと)で呼び出されるクラスを定義し、その領域を計算するように要求するメッセージを送信することです。RectangleEllipseSquareCircleShapeShape次に、オブジェクトは、その種類のオブジェクトに適した式を使用してサブクラスのメソッドを呼び出します。[1]

分散メッセージパッシングは、開発者に、異なる場所にある異なる時間に異なるコンピューターで実行されるサブシステムで構成されるシステムを構築するための共通サービスを提供するアーキテクチャーのレイヤーを提供します。分散オブジェクトがメッセージを送信しているとき、メッセージング層は次のような問題を処理できます。

  • メッセージの発信元とは異なる場所で、さまざまなオペレーティングシステムとプログラミング言語を使用してプロセスを検索します。
  • メッセージを処理するための適切なオブジェクトが現在実行されていない場合は、メッセージをキューに保存し、オブジェクトが使用可能になったときにメッセージを呼び出します。また、送信オブジェクトが結果を受信する準備ができるまで、必要に応じて結果を保存します。
  • データのACIDテストなど、分散トランザクションのさまざまなトランザクション要件を制御します。[2]

同期メッセージパッシングと非同期メッセージパッシング

同期メッセージパッシング

同期メッセージパッシングは、同時に実行されているオブジェクト間で発生します。これは、JavaやSmalltalkなどのオブジェクト指向プログラミング言語で使用されます。

同期メッセージングは​​、同期関数呼び出しに似ています。関数の呼び出し元が関数が完了するまで待機するのと同じように、送信プロセスは受信プロセスが完了するまで待機します。これにより、一部のアプリケーションで同期通信が機能しなくなる可能性があります。たとえば、大規模な分散システムは、使用できるほど十分に機能しない場合があります。このような大規模な分散システムは、サブシステムの一部がメンテナンスなどのためにダウンしているときに動作する必要がある場合があります。

同期メッセージパッシングのみを使用して相互に電子メールを送信する100台のデスクトップコンピュータがある忙しいビジネスオフィスを想像してみてください。1人の作業者が自分のコンピューターの電源を切ると、他の99台のコンピューターがフリーズし、その作業員が自分のコンピューターの電源を入れ直して1通の電子メールを処理することができます。

非同期メッセージパッシング

非同期メッセージパッシングでは、要求側オブジェクトがメッセージを送信するときに、受信側オブジェクトがダウンまたはビジーになる可能性があります。関数呼び出しの例えを続けると、呼び出された関数が完了するのを待たずに、すぐに戻る関数呼び出しのようなものです。メッセージはキューに送信され、受信プロセスが要求するまで保存されます。受信プロセスはメッセージを処理し、結果をキューに送信して、元のプロセス(または指定された次のプロセス)によるピックアップを行います。[3]

非同期メッセージングには、同時に実行されない可能性のあるシステムのデータを保存および再送信するための追加機能が必要であり、通常、中間レベルのソフトウェア(ミドルウェアと呼ばれることが多い)によって処理されます。一般的なタイプはメッセージ指向ミドルウェア(MOM)です。

非同期通信に必要なバッファがいっぱいになると、問題が発生する可能性があります。送信者をブロックするか、将来のメッセージを破棄するかを決定する必要があります。ブロックされた送信者はデッドロックにつながる可能性があります。メッセージがドロップされると、通信の信頼性が失われます。

ハイブリッド

Synchronizerを使用すると、非同期通信の上に同期通信を構築できますたとえば、α-Synchronizerは、送信者が受信者からの確認メッセージを常に待機するようにすることで機能します。送信者は、確認応答が受信された後にのみ次のメッセージを送信します。一方、非同期通信は同期通信の上に構築することもできます。たとえば、最近のマイクロカーネルは通常、同期メッセージングプリミティブ[要出典]のみを提供し、ヘルパースレッドを使用して非同期メッセージングを最上位に実装できます

分散オブジェクト

メッセージパッシングシステムは、分散オブジェクトまたはローカルオブジェクトのいずれかを使用します。分散オブジェクトの場合、送信者と受信者は異なるコンピューター上にあり、異なるオペレーティングシステムを実行し、異なるプログラミング言語を使用している可能性があります。この場合、バスレイヤーは、あるシステムから別のシステムへのデータの変換、ネットワークなど。Unixのリモートプロシージャコール(RPC)プロトコルは、この初期の例でした。このタイプのメッセージパッシングでは、送信者も受信者もオブジェクト指向プログラミングを使用する必要はないことに注意してください。手続き型言語システムは、メッセージを送受信できる大きな粒度のオブジェクトとしてラップおよび処理できます。[4]

分散オブジェクトをサポートするシステムの例は、EmeraldONC RPCCORBAJava RMIDCOMSOAP.NET RemotingCTOSQNX Neutrino RTOSOpenBinder、およびD-Busです。分散オブジェクトシステムは、メッセージパッシング抽象化がメッセージ送信の実装で使用される可能性のある根本的な状態変化を隠すため、「シェアードナッシング」システムと呼ばれています。


分散または非同期のメッセージパッシングには、プロシージャの呼び出しに比べて追加のオーバーヘッドがあります。メッセージパッシングでは、引数を新しいメッセージにコピーする必要があります。一部の引数にはメガバイトのデータを含めることができ、そのすべてをコピーして受信オブジェクトに送信する必要があります。

従来のプロシージャコールは、メモリ使用量、転送時間、および局所性の点でメッセージパッシングとは異なります。引数は、通常、追加のストレージや転送時間を必要としない汎用レジスタによって、または引数のアドレス(数ビット)を含むパラメータリストでレシーバに渡されます。システムは個別のアドレス空間を使用するため、分散システムではアドレスの受け渡しはできません。

WebブラウザWebサーバーは、メッセージパッシングによって通信するプロセスの例です。URLは、プロセスの内部を公開せずにリソースを参照する例です。

サブルーチン呼び出しまたはメソッド呼び出しは、呼び出された計算が終了するまで終了しません対照的に、非同期メッセージパッシングでは、要求メッセージが送信されてからかなりの時間が経過すると、応答が到着する可能性があります。

メッセージハンドラーは、通常、複数の送信者からのメッセージを処理します。これは、単一の送信者またはクライアントプロセスの動作とは関係のない理由で、その状態が変化する可能性があることを意味します。これは、メソッドが呼び出されるオブジェクトの一般的な動作とは対照的です。後者は、メソッドの呼び出し間で同じ状態を維持することが期待されます。つまり、メッセージハンドラは揮発性オブジェクトと同様に動作します。

数理モデル

メッセージパッシングの主要な数学的モデルは、アクターモデルパイ計算です。[5] [6]数学的には、メッセージはオブジェクトに制御を渡すための単一の手段です。オブジェクトがメッセージに応答する場合、そのメッセージのメソッドがあります。

Alan Kayは、メッセージパッシングはOOPのオブジェクトよりも重要であり、オブジェクト自体が強調されすぎることが多いと主張しています。ライブ分散オブジェクトプログラミングモデルは、この観察に基づいています。分散データフローの概念を使用して、高レベルの機能スタイルの仕様を使用して、メッセージパターンの観点から複雑な分散システムの動作を特徴付けます。[7]

も参照してください

参考文献

  1. ^ ゴールドバーグ、アデル; デビッドロブソン(1989)。Smalltalk-80言語アディソンウェスリー。pp。5–16。ISBN 0-201-13688-0
  2. ^ Orfali、Robert(1996)。Essential Client / Server SurvivalGuideニューヨーク:Wiley ComputerPublishing。pp。1–22  _ ISBN 0-471-15325-7
  3. ^ Orfali、Robert(1996)。Essential Client / Server SurvivalGuideニューヨーク:Wiley ComputerPublishing。pp。95–133。  _ ISBN 0-471-15325-7
  4. ^ Orfali、Robert(1996)。Essential Client / Server SurvivalGuideニューヨーク:Wiley ComputerPublishing。pp。375–397。  _ ISBN 0-471-15325-7
  5. ^ ミルナー、ロビン(1993年1月)。「相互作用の要素:チューリング賞講演」ACMの通信36(1):78–89。土井10.1145 /151233.151240
  6. ^ カール・ヒューイット; ピータービショップ; リチャード・シュタイガー(1973)。「人工知能のためのユニバーサルモジュラーアクター形式」。IJCAI。 {{cite journal}}引用ジャーナルには|journal=ヘルプ)が必要です
  7. ^ ケイ、アラン。「プロトタイプとクラスは次のとおりです。Re:SunのHotSpot」lists.squeakfoundation.org 2014年1月2日取得
  8. ^ 「メッセージパッシングを使用してスレッド間でデータを転送する-Rustプログラミング言語」doc.rust-lang.org

さらに読む

外部リンク