セマフォ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索

セマフォ(: semaphore)はコンピュータにおいて、古典的でかつ現在も利用される同期機構の一種。エドガー・ダイクストラが考案した。

一般には、並列処理の実行環境において、排他区間を確保し、資源に同時アクセスできる上限を規定したい時に用いる。

semaphore」の語義は腕木通信で、それから派生した鉄道腕木信号(や自動車方向指示器)に由来する。 日本語でのセマフォは本用途(コンピュータプログラミング関連)に限られる。

語源の腕木式信号機

目次

[編集] 概要

セマフォは、状態を保持しアトミックな操作が可能なカウンタ(1ビットの場合もある(バイナリセマフォ))と、それを操作する、処理の要求通知であるP操作[1]と、処理の終了通知であるV操作[2]からなる。

複数のタスク間で、有限個の資源を共有するためのセマフォの使用法を説明する。まず、セマフォを共通領域に確保し、同時に使用可能な資源の個数を初期値としておく。

  • 資源を使いたいタスクはP操作を行う。
  • P操作はセマフォ変数が0でなければ1減算し資源を使う。
    • 0なら他のタスクが使用中なので待ち状態となる。
  • 資源を使い終わったタスクは、V操作を行う。
  • V操作はセマフォ変数を1加算することで他の待ち状態のタスクに資源を明け渡す。

応用例としてデータベースへの多重アクセス回避手段として用いる。

[編集] 使用例

同時に5つのアクセスにしか応答できないサーバがあった場合、そのサーバを呼び出すプログラムに初期値5のセマフォを予め作成しておく。

サーバにアクセスする処理があった場合は以下のように組み立てる。

  1. セマフォに対してP操作を行う
  2. サーバにアクセスし処理を行う
  3. セマフォに対してV操作を行う

こうすることによって、この処理を行うタスクやスレッドが複数発生したとしても、サーバにアクセスしようとするものは常に5つを超えないようにできる。 6つめのタスクがこの処理を開始しても、P操作のときセマフォの値が0になっているため、そのタスクは待機状態になるためだ。このタスクはどこかのタスクがV操作を行うと再開する。

[編集] 環境毎の使用方法

[編集] Windows

WindowsWin32 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クラスが用意されている。

[編集] 脚注

  1. ^ :Passeren = 腕木を下げる(通行許可)
  2. ^ :Verhoog = 腕木を上げる(通行禁止)

[編集] 関連項目

個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語