セマフォ
セマフォ(英: semaphore)はコンピュータにおいて、古典的でかつ現在も利用される同期機構の一種。エドガー・ダイクストラが考案した。
一般には、並列処理の実行環境において、排他区間を確保し、資源に同時アクセスできる上限を規定したい時に用いる。
「semaphore」の語義は腕木通信で、それから派生した鉄道の腕木信号(や自動車の方向指示器)に由来する。 日本語でのセマフォは本用途(コンピュータ、プログラミング関連)に限られる。
目次 |
[編集] 概要
セマフォは、状態を保持しアトミックな操作が可能なカウンタ(1ビットの場合もある(バイナリセマフォ))と、それを操作する、処理の要求通知であるP操作[1]と、処理の終了通知であるV操作[2]からなる。
複数のタスク間で、有限個の資源を共有するためのセマフォの使用法を説明する。まず、セマフォを共通領域に確保し、同時に使用可能な資源の個数を初期値としておく。
- 資源を使いたいタスクは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 2.0以降では、System.Threading.Semaphore クラスを使う。バージョン1.1以前では自作するかWin32 APIを呼び出す必要がある。
[編集] Java
Javaでは、java.util.concurrent.Semaphore クラスを使う。Java 5 以降で使用可能である。
[編集] Perl
Perlでは、Thread::Semaphore モジュールや、新しくはCoro::Semaphore モジュールなどを使う。
[編集] Python
Pythonでは、threadingモジュール中に Semaphoreクラスが用意されている。