今回は,並列処理をする上で必要である,簡単なプロセス間通信を説明する.
プロセス間通信は,文字通り「プロセス間の通信」である.UNIX 系 OS では, 各プロセスは,独立したメモリ空間に割り当てられているので, 特別な,通信方法を提供しなければならない.一方,スレッドなど,「軽量プロセス」 というプロセスは,各スレッドが,同一メモリ空間に割当てられているので, 「共有メモリ」をプロセス間の通信に使えばよい.
UNIX 系のオペレーティングシステムでは,以下の 2 つの「プロセス間通信」 が提供されている.
当初より,UNIX は,設計として,各プロセスは独立したメモリ領域に 割り当てられたので,「プロセス間通信」は,必須であった. 「シェル(コマンドインタプリタ)の機能」として,コマンド間でデータをやり取りする 処理が主であった.このプロセス間通信をパイプ(pipe) という. ソケット(socket) は,1980 年代になって,ネットワークを介した プロセス間通信として設計,開発された. サーバクライアント(server client)通信 は, そのソケットを用いて実現されることが多い.
スレッドが考案された後では,複数のスレッドが,同一のメモリ空間に 割り当てられるので,スレッド間で通信を行う場合は,共有するメモリ領域 (共有メモリ)への入出力により処理される.しかし,この場合は,セマフォなどの 同期処理を使う必要がある.
スレッド間の通信は,以下のように表すことができる.
この「共有メモリ」は,「有限バッファ問題」の有限バッファと考えればよい.
Xinu のプロセス間通信は,「ポート」という番号により識別されたメモリを介して 処理される.「受信」状態を追加する.
preceive 関数の呼び出しで,「受信」状態となり,psend 関数 の呼び出しで,再開することができる.この処理により,「ポート」を介して 通信が行われる.preceive 関数の呼び出しにより,CPU の実行権を「放棄」して 他のプロセスに実行を許している点が重要である.一般に,通信を行う際には, 通信の内容(メッセージ(message)という) を待つ間,CPU の実行権を放棄 しなければならない(以下,プロセス間通信をメッセージ通信という).
Xinu のプロセスは,「スレッド」と同様に,全てのプロセス間でメモリを 共有しているので,メッセージ通信は,「共有メモリ」を介した実現となる.
「ポート」の生成は,pcreate 関数を呼び出せばよい.
プロセス間通信であるが,「ポート番号」を指定してメッセージを送る.
メッセージは,整数型の値である.
メッセージの受信は,ポート番号を指定する.