セマフォ 【semaphore】
概要
セマフォ(semaphore)とは、コンピュータで並列処理を行う際、同時に実行されているプログラム間で資源(リソース)の排他制御や同期を行う仕組みの一つ。当該資源のうち現在利用可能な数を表す値のこと。セマフォはコンピュータ上の共有資源について、利用可能な資源の数を指し示している。プログラムが資源を占有するときはセマフォの値から1を減じ、処理が終わって解放する際には1を加える。セマフォが0のときは空いている資源がないため正の値になるまで待機する。セマフォの値を同じ資源に同時にアクセスできるプロセスの数として扱う場合もある。
資源を獲得しセマフォを減じる処理を「P操作」、資源を解放しセマフォを加える処理を「V操作」という。関数名などではP操作を「down」「wait」「acquire」「pend」などの語で、V操作を「up」「signal」「release」「post」などの語で表すことが多い。
セマフォによる同期
セマフォの値の増減はどのプログラムからも常に可能であるため、同期処理に用いることもできる。例えば、一方のプロセスが共有資源に書き込んだデータをもう一方が読み込む処理について、書き込み側がセマフォを減じておくことで、書き込み処理が完了するまで読み込み側を待たせておくといった処理が可能となる。
セマフォとミューテックス
資源が複数ある場合を「計数セマフォ」あるいは「カウンティングセマフォ」と呼び、資源が一つの場合(値が0と1に限られる)を「2進セマフォ」あるいは「バイナリセマフォ」という。バイナリセマフォは当該資源が利用可能か不可能かを表すと考えられ、特定の資源の競合を防止する「ミューテックス」(mutex)とほぼ同じ機能となる。
歴史
セマフォは1960年代に著名なコンピュータ科学者のエドガー・ダイクストラ(Edsger W. Dijkstra)氏が考案した手法で、英単語の “semaphore” の原義は鉄道の腕木式信号機である(「手旗信号」などの意味もある)。同じ線路に同時に複数の列車が侵入することを防ぐ信号の役割を排他制御になぞらえた名称となっている。