II-8-9. セマフォ、共有メモリ、メッセージキューの利用

プロセス間通信で必要な手段であるセマフォ、共有メモリ、メッセージキューについてそれぞれの概念を理解させる。セマフォを利用した排他制御、共有メモリを利用したプロセス間のデータ転送、メッセージキューを利用したプロセス間通信の具体的な方法を解説する。

【学習の要点】

* プロセス同士が通信する際には、一方のプロセスが、他方のプロセスの処理の完了を待つ必要がある場合がある。これを、互いのプロセスの同期を取るという。

* プロセスを同期する代表的な手法に、セマフォを用いる方法がある。よく使われるバイナリセマフォは、0と1の状態を持ち、プロセスが処理を続行可能であるか否かの判断を行うために用いられる。

* プロセスはそれぞれが独自のアドレス空間を持ち、原則として互いのメモリ領域に踏み入ることはできない。例外として、共有メモリは二つ以上のプロセスがアドレス空間を共有することを可能にする。

* メッセージキューはカーネルによって保持されるキューで、プロセスやスレッドはメッセージを置いたり取り出したりといった操作を非同期で行うことができる。

図II-8-9. 2つのスレッドが共有リソースにアクセスする例

【解説】

1) 同期とセマフォ

* 複数のプロセス間、またはスレッド間でデータを共有する場合、一方のプロセスまたはスレッドがデータの内容を変更している間、他方のプロセスまたはスレッドはその変更の完了を待つことが必要である。このことを同期をとるという。

* Linuxは複数の同期手段を提供する。ミューテックスと条件変数を使った同期、セマフォを使った同期が比較的よく利用される。

* セマフォを使った同期の基本的な概念は、カーネル内またはファイルシステム名前空間上に存在する単一のセマフォを、複数のプロセスが監視することである。この流れは概ね以下の通りである。

- プロセス1と2は、セマフォへの参照を作成する。

- プロセス1が、自分の処理が続行可能かどうかをセマフォに問い合わせる。

- セマフォはプロセス1の処理の続行を許し、それを記録する。

- プロセス2が自分の処理が続行可能かどうかをセマフォに問い合わせる。

- セマフォはプロセス1が処理中にプロセス2の処理の実行を許すかどうか決定する(このポリシーはセマフォの種類により異なる)。

- セマフォが処理の続行を許せばプロセス2は処理を続行する。そうでなければプロセス1の処理の完了を待つ。

2) 共有メモリ

* ひとつのプロセス内の複数のスレッドは、それぞれがプロセスのアドレス空間を共有することができるが、異なるプロセス同士は通常これができない。

* プロセスのアドレス空間は、通常自身のプロセスからのみ参照を許すが、共有メモリの仕組みを利用すると、プロセスは自分のプロセス空間のある範囲を他のプロセスに公開することができる。

* 共有メモリ領域は、参照を許されたそれぞれのプロセスから直接に(カーネル内バッファを経由せずに)読み書きできるため、最も高速なプロセス間通信といえる。

* それぞれのプロセスは並列に動作するにも関わらず共有メモリ領域を参照できるので、この領域を不正に変更されることのないよう適切な同期をとる必要がある。

3) メッセージキュー

* メッセージキューは、リンク構造を持ったカーネル内の構造体であり、非同期のプロセス間通信を実現する方法である。

* あるプロセスがメッセージキューにメッセージを置くと、構造化されたデータ(レコード)としてカーネル内に保持される。次に別のプロセスは、このレコードを読むことができるようになる。

* それぞれのメッセージには優先度を設定することができる。

* メッセージを読む側のプロセスが、キュー内のメッセージの有無を知る方法は、ブロックして待つ(同期をとる)か、ブロックせずにポーリングするか、シグナルによって通知を受けるかのいずれかである。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。