セマフォ (セマフォ) とは | 意味や読み方など丁寧でわかりやすい用語解説

作成日: 更新日:

セマフォ (セマフォ) の読み方

日本語表記

セマフォ (セマフォ)

英語表記

semaphore (セマフォア)

セマフォ (セマフォ) の意味や用語解説

セマフォは、コンピュータのオペレーティングシステムにおいて、複数のプログラムや処理単位が同時に動く環境、すなわち並行プログラミングで利用される、重要な仕組みの一つである。その主な目的は、複数のプロセスやスレッドが共有リソースへ同時にアクセスすることによって生じる問題を未然に防ぐことにある。共有リソースとは、ファイル、メモリ領域、データベースの接続、プリンタなどのように、複数のプロセスから利用される可能性のある対象全般を指す。もし、何の制御もなしに複数のプロセスが同時に共有リソースの内容を書き換えようとすると、データの不整合や破損が発生し、システム全体が予期しない動作を引き起こす可能性がある。このような、実行のタイミングによって結果が変わってしまう危険な状態を競合状態と呼ぶ。セマフォは、この競合状態を回避するための排他制御や、プロセス間の処理の順序を調整する同期を実現するために用いられる。 セマフォの核心は、内部に非負の整数値を持つカウンターと、プロセスを待機させるためのキュー(待ち行列)で構成されている点にある。このカウンターの値が、現在利用可能な共有リソースの数を表している。セマフォに対して行われる基本的な操作は、P操作とV操作の二種類である。これらの操作名は、考案者であるエドガー・ダイクストラが用いたオランダ語に由来する。P操作は、リソースの利用を要求する際に実行される。P操作が行われると、まずセマフォのカウンターの値が1だけ減らされる。もし減算後のカウンターの値が0以上であれば、プロセスはリソースの利用権を獲得し、処理を続行できる。しかし、もしカウンターの値が負になった場合、それは利用可能なリソースがないことを意味する。その場合、P操作を実行したプロセスは処理を中断され、セマフォの待機キューに入れられて待機状態となる。一方、V操作は、リソースの利用が終了した際に実行される。V操作が行われると、セマフォのカウンターの値が1だけ増やされる。この操作は、リソースを一つ返却したことを意味する。カウンターを増やした後、もし待機キューに待機中のプロセスが存在すれば、その中から一つを選んで待機状態を解除し、実行可能な状態に戻す。これにより、待っていたプロセスはリソースの利用権を獲得し、中断していた処理を再開できる。P操作とV操作は、その処理の途中で他のプロセスに割り込まれることのない、不可分な操作(アトミック操作)として実行されることが極めて重要である。これにより、セマフォ自体のカウンター値の更新が競合状態に陥ることを防いでいる。 セマフォはそのカウンターが取りうる値の範囲によって、大きく二つの種類に分類される。一つはバイナリセマフォである。これは、カウンターの値が0と1の二値しか取らない特殊なセマフォだ。カウンターが1のときはリソースが利用可能、0のときは利用中であることを示す。実質的に、一つのリソースへのアクセスを同時に一つに限定するためのロック(ミューテックス)として機能し、純粋な排他制御を実現する目的で広く用いられる。あるプロセスが一度に一つしか実行してはならない処理区間(クリティカルセクション)を保護する際に有効である。もう一つはカウンティングセマフォである。これは、カウンターが0以上の任意の整数値を取ることができる、より一般的なセマフォだ。初期値をリソースの総数(例えば、データベースの接続プールのコネクション数など)に設定しておくことで、同時にアクセスできるプロセスの数を制限することができる。例えば、最大5つまで同時に接続を許可するリソースがある場合、セマフォのカウンターの初期値を5に設定する。プロセスがリソースを要求するたびにP操作でカウンターが減り、5つのプロセスが利用を開始するとカウンターは0になる。6つ目のプロセスがアクセスを試みると、P操作によって待機させられることになる。利用が終わったプロセスがV操作を行うとカウンターが1に戻り、待機していたプロセスが処理を再開できるようになる。このように、カウンティングセマフォは複数の同種リソースの数を管理するのに適している。 セマフォは排他制御だけでなく、プロセス間の同期にも利用される。例えば、あるプロセス(生産者)がデータを生成し、別のプロセス(消費者)がそのデータを利用するような状況を考える。消費者は、生産者がデータを生成し終えるまで処理を開始できない。この場合、セマフォの初期値を0に設定しておく。消費者は処理の開始前にP操作を実行しようとするが、カウンターが0であるため待機状態に入る。生産者はデータの生成が完了した時点でV操作を実行し、カウンターを1にする。これにより、待機していた消費者のP操作が完了し、処理を再開できる。このように、セマフォを用いることで、特定のイベントが発生するまでプロセスの実行を待たせることが可能となる。ただし、セマフォを利用する際にはデッドロックに注意が必要である。デッドロックとは、複数のプロセスが互いに相手が保持しているリソースの解放を待ち続けることで、全プロセスが永久に停止してしまう状態を指す。複数のセマフォを扱う際には、リソースを獲得する順序を全てのプロセスで統一するなど、慎重な設計が求められる。

セマフォ (セマフォ) とは | 意味や読み方など丁寧でわかりやすい用語解説