コンピュータにおける一連の作業において、複数のタスク(処理)がリソース(記憶領域)を奪い合って問題が発生してしまうことがあります。
そのための対策として「排他制御」がありますが、この方法にはいくつかの種類があります。
今回はこの排他制御の手法の一つである「セマフォ」に関して解説します。
セマフォとは?
先ず、セマフォという言葉ですが、英語で書くと「semaphore」となります。意味は「手旗信号、信号装置」なのですが、セマフォの仕組みがまさに「手旗信号」のようなものなのです。
セマフォはダイクストラ法で有名な「エドガー・ダイクストラ」によって考案された排他制御の仕組みとなります。
セマフォには「セマフォ変数」という変数があり、これを使うことで排他制御ができます。
セマフォ変数にリソース(資源)の状態を常に記録し、その数字が0(空いてない)ならばそのタスクは空くまで待つ、ということです。これを「待ち行列に並ぶ」と言われたしますね。
反対にリソースが空いていて使う際にはその変数を一つ減らすことになります。
セマフォによる排他制御と流れ
先ほど説明したセマフォ変数ですが、各タスクが勝手に触って値を変えてしまうと、制御が成立しません...
そのためにセマフォ変数を制御するための命令として、「P操作」と「V操作」を使います。
セマフォの二つの命令
- 「P操作」:資源をロックする。セマフォ変数の「S」を一つ減算して、タスクの実行を継続する
- 「V操作」:資源をアンロックする。セマフォ変数の「S」を一つ加算して、待ち行列で待っている先頭タスクを実行可能状態に遷移させる
では、セマフォを使った排他制御の流れを見てみましょう!
二つのタスクが共有資源を順番にロックし、アンロックする流れとなります。
ちょっと流れが難しくみえますが、やっていることはシンプルで、
「P操作→資源ロック→V操作→資源アンロック→P操作」
の流れが続くような感じです。
まとめ
今回は排他制御の方法であるセマフォに関して解説しました。
P操作やV操作なども出てきて、言葉だけだと難しい感じがしますが、仕組みはシンプルで、セマフォ変数を使いながら各タスクがルールを守って共有資源を使い合うイメージですね。
因みにP操作のPは、オランダ語で小さくする意味の「Prolagen」で、V操作はオランダ語で大きくする意味の「Verhogen」の頭文字を取っているようですね。オランダ語なのは、考案者のエドガー・ダイクストラさんがオランダ出身だからなんでしょうね。
以上です!
排他制御に関して以下記事でも解説してますんで、併せて読んでみてください。