セマフォ
セマフォ(英:semaphore)とは、複数のプログラム(タスク)が同時に処理を行う環境(並列処理)で、共有資源に対して同時にアクセスしても問題なく動作できる仕組みのひとつです。
共有資源に対して同時にアクセスしても問題なく動作できる仕組みを「排他制御」といい、排他制御には「ロック」や「ミューテックス」「セマフォ」などがあります。
排他制御とは
排他制御とは、共有資源に対して同時にアクセスしても問題なく動作できる仕組みのことです。
例えば、次の図のようにプログラムAとプログラムBがアクセスできる共有の領域の値に対して、お互い1を加算して共有の領域へ書き込むプログラムがあるとします。
上記図のようにプログラムAは「10 + 1」で「11」を書き込み、プログラムBは「11 + 1」で「12」を共有の領域に書き込んでいます。
上記の図は想定どおりに動作していますが、排他制御をしていないと同時アクセスが発生した場合、次の図のような問題が発生することがあります。
上記図では、プログラムAとプログラムBが同時に共有の領域にアクセスしたため、どちらも領域から取得した「10」という値をもとに計算しており、本来であればプログラムAとプログラムBが動作した後は「12」にならなければいけない値が「11」になっています。
スポンサーリンク
このように、排他制御を行っていないと整合性が保たれないデータになってしまう可能性があります。
排他制御には「ロック」や「ミューテックス」「セマフォ」などがあります。
セマフォの仕組み
セマフォの仕組みはシンプルです。セマフォ変数に、共有状態を記録しておき、空いていれば使用する、空いていなければ待機する(待ち行列に並ぶ)だけです。
セマフォで行う操作は次の2つです。
操作 | 説明 |
P操作 | セマフォ変数の中身が1以上のときは、セマフォ変数を1減算する。セマフォ変数の中身が0のときは、待機(待ち行列に並ぶ)する。 |
V操作 | セマフォ変数の中身を1加算し、待ち行列の先頭プログラムが実行できるようにする。 |
次の図は、セマフォのイメージ例です。セマフォ変数が1以上のときは空きがある状態、セマフォ変数が0のときは空きがない状態をあらわしています。
上記図では、セマフォ変数Sの初期値を「1」としています。(セマフォ変数の初期値には、共有資源に同時にアクセス可能な数を設定します。今回の例は「1」なので、共有資源に同時にアクセスできる数は「1」です)
- プログラムAが「P操作」を行う(セマフォ変数Sを1減算する)
- プログラムBが「P操作」を行うもセマフォ変数Sが0のため待機
- プログラムA処理中
- プログラムAの処理が終わったので「V操作」を行う(セマフォ変数Sに1加算する)
- プログラムBが「P操作」を行う(セマフォ変数Sを1減算する)
- プログラムB処理中
- プログラムBの処理が終わったので「V操作」を行う(セマフォ変数Sに1加算する)