ホームに戻る
出典 :
セマフォ - Wikipedia
関連 :
タスク(スレッド)間通信
目次 :

セマフォ(Semaphore)とは

並列プログラミング(マルチタスク)環境において、プログラムの実行単位(タスク)間で共有する資源へのアクセスを制御する機構。 多くのオペレーティングシステムで提供されている。 各タスクが共有資源へのアクセスを安全に(競合することなく)行うため、 資源への同時アクセスの本数が資源の数を超えないよう制限し、資源(へのアクセス権)に空きが無い場合は、 最後にアクセスしようとしたタスクを空きができるまで待たせる機能を有している。 セマフォ(カウンティングセマフォ)は、有限個の資源へのアクセスをセマフォカウンタによって制御する。 セマフォカウンタの値が、現在アクセス可能な資源の残数を表しており、 資源を獲得する際にカウンタを減算(P操作)、使用後の資源を解放(返却)する際にカウンタを加算(V操作)する。即ち、
  1. 資源を獲得する(P操作)
  2. 資源を使用する
  3. 資源を解放する(V操作)
が、セマフォを使用する際の一連の流れとなる。 画像 管理する資源の個数が 1 のセマフォをバイナリセマフォと呼ぶ。バイナリセマフォは後述のミューテックスと共通の振舞をし、実装に差が無いことも多い。

注意すべき点

複数の資源に対して使用する(セマフォカウンタの初期値が1を超える)場合、セマフォは単に個数のみを保持する。 即ち、空いている資源のいずれを獲得するかを選択することはできない。 また、セマフォの使用に当たり、以下のような操作は禁忌であり、行うとその資源の使用に際しての公平性・安全性が損なわれ、 プログラムの性能低下・不正動作・フリーズ・クラッシュなどの要因となる。

ミューテックス(Mutex)とは

2つの実行単位(タスク)が共用資源にアクセスするのを防止するための機構。 先述の通りバイナリセマフォ(セマフォカウンタのとり得る値が 0 と 1 )と動作上は等価であり、システムによっては実装が同一である。 ただし意味づけには若干の差異があり、ミューテックスが実行単位に結びついているのに対し、セマフォは資源に結びついている。 即ち、ミューテックスは2つの実行単位の排他制御に用いられ(複数の資源を管理することもある)、 (バイナリ)セマフォは一つの資源の排他制御に用いられる(実行単位がいくつあるかは問わない)。