こんにちわ。
20代の頃を中心にシステム開発の仕事をしていました。
できれば、個人的にはずっとパソコンをメインにプログラム開発の仕事をしたかったのですが、仕事なのであまり好きではないオフコンやUNIXでのシステム開発もけっこうやりました。

特に制御のシステムではマルチプロセス、マルチタスクのプログラミングにおいてUNIXのシステムコールの中でプロセス間通信のお世話になりました。
ただ、プロセス間通信を含むマルチプロセス、マルチタスクのプログラムの仕組みを考えることは頭の体操をやっているようで楽しかったです。
UNIXのプロセス間通信
プロセス間通信は、コンピュータで複数のプロセス間(または複数のスレッド間など)でデータをやりとりするための仕組みのことをいいます。
特にUNIXに限った話ではないのですが、自分がUNIXでよく使ったので、UNIXの話になります。
通信するプロセスは同一コンピュータ上にある場合もあれば、ネットワークで接続された別のコンピュータ上の場合もあります。
プロセス間通信をする目的や理由は以下のものが考えられます。
- 情報の共有
- 計算の高速化
- モジュール性の向上
- 利便性
ぼくの場合は、モジュール性の向上や利便性、プログラムの可読性から利用することが多かったです。
IPCは「スレッド間通信」や「アプリケーション間通信」と呼ぶ場合もあります。
主なプロセス間通信の方法
ぼくは、シグナル、メッセージキュー、ソケット、名前付きパイプ、セマフォ、共有メモリなどをプロセス間通信として、使ったこともあります。
ある意味、ファイルもプロセス間通信の手段と言えますがそれだったら、データベースを使いますよね。(笑)
他にも、メモリマップトファイル、メッセージパッシング、Binder(Androidで使えるらしい)なるものがるようですが、ボクが若い頃はそういうのなかったような気がします。
もしくは単に知らなかっただけか。。。
シグナルは、MS-DOSの世界でいうと割り込みに該当します。
これは使いどころが難しいです。(笑)
実際、WindowsではCのランタイムライブラリでのみ実装しており、IPCとしての利用はあまりされないようです。
ソケットは、コンピュータ間の通信でよく使われますし、使いましたね。
その一方で、名前付きパイプはたまにしか使いませんでした。
その中で、ぼくがよく使ったのは、System-V系のUNIXに実装されていた、メッセージキュー、セマフォ、共有メモリでした。
これらはSystem-V系のUNIXが発祥です。
なので、UNIXの中ではある時期から、Sytem-V系のUNIXを好むようになりました。
メッセージキュー、セマフォ、共有メモリ
メッセージキューはとってもプログラミングに便利でした。
メッセージキューはプロセス間通信や同一プロセス内のスレッド間通信に使われるソフトウェアコンポーネントで非同期型通信プロトコルの一種を提供しています。
何がいいかというと、送信側と受信側がメッセージキューに同時にやり取りしなくともよいことです。
とにかく、送りたいときにメッセージを送って、取り出したいタイミングでメッセージを取り出せばいいわけです。
キューに置かれるメッセージは、受信側がそれを取り出すまで格納されたままとなります。
そして、プロセス間でなんらかの同期をとりたいときは、セマフォを使います。
セマフォは、もともと並列プログラミング環境での複数のプロセスなどが共有する資源にアクセスするのを制御する際の、単純な変数または抽象データ型のことを言います。
あるリソースを使用する際や解放する際にその内容を安全に競合状態になることなく書き換えたり、必要に応じて資源が使用可能になるまで待つことができます。
ある意味、セマフォは競合状態を防ぐフラグのような使い方をよくしました。
そして、共有メモリですが複数のプログラムが同時並行的にアクセスすることのできるメモリ空間のことをいいます。
複数のプロセス間の通信手段として使う場合と、単に複製を用意する冗長さを防ぐ目的の場合が考えられますが、通常はプロセス間でデータをやりとりする効率的な手段として使われることが多いです。
当時はこれらの機能がそろっていたので、ぼくにとってはBSD系のUNIXよりも使いやすいとよく思いました。
ちなみにLinuxでも、共有メモリー、セマフォ、マップドメモリー、パイプ、ソケット通信など使えるようですね。
最後までおつきあい、ありがとうございました。
朋花 神戸 芦屋 荒川 関学
コメント