相互作用と通信
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/03 17:00 UTC 版)
並行コンポーネント間の通信には、例えば以下の二通りがある。 ケース1:相互通信の明示的操作を要求する形式 同期傾向になる。明示的操作は特別なプログラム構文を必要にする。ソフトウェアトランザクショナルメモリ、クリティカルセクション同期などのモデルに従っての実装になる。 共有メモリ通信 並行コンポーネントたちは共有メモリの内容を更新することで通信を行う。JavaやC#が用いている。クリティカルセクションを定めてロックオブジェクトを用いての同期でその範囲を並行性制御する。ロック手法にはセマフォ、ミューテックス、モニタ、バリア、読み書きロックなどがある。スレッドセーフが重視されている。 ケース2:相互通信をプログラマから隠蔽する形式 非同期傾向になる。上の明示的操作をコード評価/呼出しやデータ参照/代入といった標準構文でまかなえる。プロセス計算、Futureパターンなどのモデルに従っての実装になる。 メッセージパッシング通信 並行コンポーネントたちはメッセージの交換で通信を行う。Erlang、Go、Scala、OpenMPI、Occamなどが用いている。メッセージ交換は通常非同期だが、チャネル(英語版)という同期形式もあり、こちらでの送信側は受信側がメッセージに応答するまで待機する双方向通信になる。 非同期なメッセージ交換での送信側は、受信側がいま応答できるかどうかに関係なくメッセージを送れる単方向通信になる。これは送って祈る(send and pray)と形容されている。ここでの送信型は、メッセージを送るとすぐにfutureやpromiseと呼ばれる抽象的な応答オブジェクトを受け取れるので基本的に待機することはない。メッセージパッシング通信は、共有メモリ通信よりも平易で堅牢であるが、オーバーヘッドが大きいとも考えられている。メッセージパッシングには数々の数学的理論があり、アクターモデルやプロセス計算などが有名である。
※この「相互作用と通信」の解説は、「並行計算」の解説の一部です。
「相互作用と通信」を含む「並行計算」の記事については、「並行計算」の概要を参照ください。
- 相互作用と通信のページへのリンク