セマフォ
読み:セマフォ
外語:semaphore

 並行して動作するプロセス間で、同期をとったり、排他制御をするための機構。
目次

概要
 マルチタスクOSなど、並行して複数のタスク/プロセスが動作できるオペレーティングシステム(OS)で用意される。
 例えば、IPC(UNIXのAPIの一種)ではプロセス間通信のための機能として用意され、プロセス間の共有資源へのアクセス衝突を防止(排他制御)するために共有メモリー上のフラグ変数を格納したデータ配列およびそれに対する操作機能として提供/利用されている。
 OSにより仕様や使い方に差はあるが、一般にセマフォ用のデータは配列のためフラグは複数個用意することが可能で、処理内容によって使い分けることができる。
 またセマフォ変数にはバイナリセマフォと汎用セマフォの2種類を利用することができる。

特徴

動作
 セマフォの配列への操作処理(値の参照から更新またはブロッキングまで)はOS側でアトミックに行なわれることが保証されており、他のプロセスからの処理が割り込むことはない。
 これは、排他制御処理における重要な前提である。

バイナリセマフォ
 バイナリセマフォは0か1のどちらかの値しか持たないセマフォで、重要度の高い処理のブロックに用いられる。
 フラグは初期化によって最初1はセットされ、特定のプロセスが処理開始時にAPIを呼びフラグをデクリメント(-1)し、処理の終了と共にAPIを呼びインクリメント(+1)する。
 他のプロセスがこれを同時に処理しようとすると、フラグが0になっているためにデクリメントに失敗して処理がブロックされ、そのプロセスはOSレベルで休止状態にされる。後に処理が完了しフラグが1に戻ると、プロセスキューに溜められた休止中のプロセスがOSによって順にチェックされ、処理が再開される。
 なお、フラグ操作に失敗したときに自動的にプロセスを休止しないノンブロッキング指示を与えることもでき、この場合のプロセスの挙動はプログラム側に委ねられる。

汎用セマフォ
 汎用セマフォはカウンターであり、資源に一定の空き数がある場合に利用される。
 基本的に値は資源の空き数に設定され、特定のプロセスが処理開始時に値のデクリメント(-1)を行ない、処理終了時にインクリメント(+1)を行なう。空き数を使い切り、デクリメントに失敗した場合のブロッキング処理はバイナリセマフォと同様である。

実例

TRON
 μITRONを初めとするTRONでは、バイナリセマフォに対応している。
 実装により仕様差はあると思われるが、非常にシンプルなもので、概ね次のように書かれる。
 #define SEM_TEST 1; // セマフォID(プログラマーが衝突しないように管理する)
 wai_sem(SEM_TEST); // セマフォを取得
 ;;;; // 処理
 sig_sem(SEM_TEST); // セマフォを返却
 TRONの仕様では、wai_sem()からsig_sem()までがアトミックであることが保証されている。
 実装によっては、wai_semの第二引数でタイムアウトの時間を設定でき、ブロッキングしない動作が可能なものもある。

UNIX
 SVR4、POSIX.1-2001以降で対応するIPCでは、semget()、semctl()、semop()などのシステムコールを利用して操作する。
 TRONとは違い非常に複雑な設計となっており、多機能だがその分使い方も難しい。

再検索