セマフォは以下の図にあるように、ある資源の排他制御を行うための制御方法です。今、タスク1とタスク2が資源R2を利用するときを考えます。資源Rはひとつのタスクからしか利用できないとします。

タスク1は資源Rを利用するときにP操作を行います。P操作を行うとSから1と引きます。するとSが0になります。また、資源Rの利用が終わると、V操作を行います。V操作を行うとSから1を足します。Sが1になります。

タスク2が資源Rを利用するときは、 同様にP操作を行いますがSが0のため資源Rを利用するために待ち状態になります。タスク1は資源Rを利用し終わるとSは1になるので、このときタスク2は資源Rを利用できるようになります。

このようにSに同時に利用できるタスクの数を入れておくと、その数だけ同時にタスクを利用できるようになります。(この場合は同時に利用できるタスクが1です) タスクはSの値をみれば、今資源を利用できるのかどうかを判別できます。

このSが腕木式信号のような役割をしているのですね。

semaphore.gif