セマフォ
出典: フリー百科事典『ウィキペディア(Wikipedia)』
セマフォ(Semaphore)は、コンピュータにおいて、古典的でかつ現在も利用される同期機構の一種。エドガー・ダイクストラが考案した。
一般には、並列処理の実行環境において、排他区間を確保し、資源に同時アクセスできる上限を規定したい時に用いる。
語源のSemaphoreの大元は手旗信号で、それから派生した鉄道の腕木信号に由来する。 日本語でのセマフォは本用途(コンピュータ、プログラミング関連)に限られる。
目次 |
[編集] 概要
セマフォは、処理の要求であるP操作(蘭Passeren : 腕木を下げる=通行許可)と、処理の終了通知であるV操作(蘭Verhoog : 腕木を上げる=通行禁止)からなる。
複数のタスク間で一つの資源を共有するため、セマフォではまず、セマフォ変数を共通領域に確保し、 任意の正の整数値を初期値としておく。セマフォの種類によっては初期値が1のものもあり、その場合、セマフォはミューテックスと等価の挙動を示すことになる。
資源を使いたいタスクはP操作を行う。 P操作はセマフォ変数が0でなければ1減算し資源を使う。 0なら他のタスクが使用中なので待ち状態となる。 資源を使い終わったタスクは、V操作を行う。 V操作はセマフォ変数を1加算することで他の待ち状態のタスクに資源を明け渡す。
応用例としてデータベースへの多重アクセス回避手段として用いる。
[編集] 使用例
同時に5つのアクセスにしか応答できないサーバーがあった場合、そのサーバーを呼び出すプログラムに初期値5のセマフォを予め作成しておく。
サーバーにアクセスする処理があった場合は以下のように組み立てる。
- セマフォに対してP操作を行う
- サーバーにアクセスし処理を行う
- セマフォに対してV操作を行う
こうすることによって、この処理を行うタスクやスレッドが複数発生したとしても、サーバーにアクセスしようとするものは常に5つを超えないようにできる。 6つめのタスクがこの処理を開始しても、P操作のときセマフォの値が0になっているため、そのタスクは待機状態になるためだ。このタスクはどこかのタスクがV操作を行うと再開する。
[編集] 環境毎の使用方法
[編集] Windows
WindowsのWin32 APIでは、CreateSemaphore
関数と ReleaseSemaphore
関数を使う。
[編集] .NET Framework
.NET Frameworkでは、Semaphore
クラスを使う。ただし、バージョン1.1以前では、自作するかWin32 APIを呼び出す必要がある。
[編集] Java
Javaでは、java.util.concurrent.Semaphore
クラスを使う。Java 5 以降で使用可能である。
[編集] Perl
Perlでは、Thread::Semaphore
モジュールを使う。
[編集] Python
Pythonでは、threading
モジュール中に Semaphoe
クラスが用意されている。