ホームに戻る
出典 :
プロセス間通信 - Wikipedia POSIX - Wikipedia 第3回 タスク間同期・通信機能1 | トロンフォーラム 第4回 タスク間同期・通信機能2 | トロンフォーラム 第5回 タスク間同期・通信機能3 | トロンフォーラム
関連 :
ソケット パイプ セマフォとミューテックス キュー(Queue)とスタック(Stack)
目次 :

プロセス間通信(Inter-Process Communication : IPC)とは

コンピュータで動作する複数のプロセスが相互にデータをやり取りすること、およびそのためにOSが提供する仕組みを指す。
同一コンピュータ内(ローカル)の別プロセスと通信する場合と、異なるコンピュータ(リモート)のプロセスと通信する場合の両方がある。
また、ほとんどの手法は(同一プロセス内の)スレッド(タスク)間通信にも用いることが可能である。
(「スレッド間通信」はプロセス間通信の別名で、「アプリケーション間通信」とも呼ばれる。)
手法ごとにレイテンシ(遅延)や扱えるデータが異なるため、ユースケースに応じて適切な手法を選ぶ必要がある。

プロセス間通信の意義

プロセス間通信は情報の授受だけでなく、相手プロセス(の特定タスク)の実行タイミングを制御(同期)するために用いられる。
(ここでの「同期(制御)」は「同期(処理)」とは異なる点に注意。)
即ち、通信が行われるまで相手タスクを待機させ、通信を契機として相手タスクの処理を再開させる。

プロセス(タスク)間通信を用いない場合

画像
タスク#1が発した要求をタスク#2が処理するという関係だが、タスク#2は共有メモリに「要求」が格納されていないかポーリング(定期的に問い合わせ)し、
「要求」があればそれを処理、「完了通知」を共有メモリに格納する。タスク#1は「完了通知」が格納されていないかをポーリングする。
この場合、それぞれのタスクが「要求」「完了通知」を無限ループで待っており、
これらが格納されていない ( = 有意な処理を行わない)間もタスクが動作し続けるためCPU資源を浪費し、スループットの低下や消費電力の増大を招く
その周回で有意な処理を行わない場合に一定時間タスクを休眠させることで、CPU資源の消費を抑えることはできるが、
「要求」(または「完了通知」)に即応できなくなるため、スループットは悪化する。

プロセス(タスク)間通信を用いた場合

画像
タスク#1は「要求」を発行後、「完了通知」が通知されるまで休眠(待ち状態に移行)する。
タスク#2は有意な処理を行っていない間休眠しており、「要求」が通知されたタイミングで起床する。
通知された「要求」を処理して「完了通知」を発行した後、次の「要求」まで休眠する。
タスク#1は「完了通知」が通知されたタイミングで起床し、処理を再開する。
この方式では、 それぞれのタスクは有意な処理を行っている間のみ動作するため、CPU資源の消費を最低限に抑えることができるとともに、
メッセージの到着を契機として処理を開始するため即応性を高められる

プロセス間通信の主な手法

下記のもの以外は割愛。
手法 提供しているOS 備考
POSIX準拠OS Windows その他
ファイル
イベントフラグ(シグナル) Windowsでは、プロセスを跨いでの利用は推奨されていない
詳細は後述
メッセージバッファ 詳細は後述
メールボックス 詳細は後述
ソケット 詳細はリンク先参照
パイプ / 名前付きパイプ 詳細はリンク先参照
セマフォ / ミューテックス 詳細はリンク先参照
共有メモリ

イベントフラグ(シグナル)

画像
「別タスクの特定の処理が完了したタイミングで処理を行いたい」場合などに用いる。
「フラグ待ち」となったタスク#1は、イベントフラグがセットされるまで休眠し、フラグのセットとともに起床する。
「フラグ待ち」に移行した時点ですでにフラグがセットされている場合はそのまま処理を継続する。
オン・オフだけでなく、「(インクリメントされた結果)一定の値に達するまで待つ」フラグも存在する。

メッセージバッファ

画像
宛先のタスクを指定して、可変長の情報(メッセージ)を送信する機構。
送信側はメッセージをメッセージバッファ領域に格納し、受信側はメッセージバッファ領域からメッセージを一つ取り出す。
バッファが空の場合にメッセージを受信しようとすると受信待ちとなり、バッファに十分な空きがない場合にメッセージを送信しようとすると送信待ちとなる。
実際にメッセージが移動する点で、後述のメールボックスと異なる。

メールボックス

画像
メッセージバッファ同様、宛先タスクにメッセージを送信する機構。
メッセージバッファがメッセージそのものを送信するのに対し、メールボックスはメッセージの先頭アドレスのみを通知する。
このため、必要最小限のメモリを動的に確保するだけでよく、メッセージのサイズが大きい場合に(実際にメッセージを移動しない分)メッセージバッファよりも高速に処理できる。
但し、受信側がメッセージを受信し終えるまでにメッセージが改変されることが無いようにする必要がある。