情報処理試験を勉強していると、「セマフォって結局何?ミューテックスと何が違うの?」と混乱しがちです。この記事では、セマフォの意味とP操作・V操作の仕組みを「信号機」の例えで噛み砕いて解説します。
対象試験と出題頻度
セマフォは、基本情報技術者・応用情報技術者で出題されるテーマです。
OSのタスク管理における排他制御の仕組みとして、「セマフォを用いる目的」を問う定番問題が繰り返し出題されています。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★☆☆
ランクB(標準)覚えておくと有利
用語の定義
セマフォ(Semaphore)とは、一言で言うと
「複数のタスクが共有資源へ同時にアクセスするのを防ぐための排他制御の仕組み」
のことです。
イメージとしては、「交差点の信号機」です。
信号機がなければ、複数の車が同時に交差点に突入して衝突事故を起こします。信号機が青→赤を切り替えることで、一度に通過できる車を制限し、安全に交差点を共有できます。
セマフォも同じで、「今この資源を使えるタスクは何個か」をカウンターで管理し、順番を制御する仕組みです。実際に「Semaphore」は英語で信号機を意味します。
📊 セマフォの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Semaphore |
| 分類 | OS(オペレーティングシステム)のタスク管理・同期制御 |
| 構成要素 | セマフォ変数(整数型)、P操作、V操作、待ち行列 |
| 提唱者 | エドガー・ダイクストラ(1965年) |
解説
マルチタスクOSでは、複数のタスク(プロセス)がCPU時間を分け合いながら並行して動きます。このとき、プリンタやメモリ上の共有データなど「同時に使われると困る資源」が存在します。
もし2つのタスクが同時に同じデータを書き換えると、一方の更新が上書きされて消えるデータ不整合が起きます。これを防ぐために生まれたのが、ダイクストラが考案したセマフォという同期機構です。
P操作とV操作の動き
セマフォは「セマフォ変数S」という整数値のカウンターと、2つの不可分操作で動きます。ここだけは確実に押さえてください。
| 操作 | 動作内容 | 信号機での例え |
|---|---|---|
| P操作 (Proberen=試す) |
Sが1以上なら S を 1 減らしてクリティカルセクションに進入。Sが0なら待ち行列に並ぶ。 | 青信号なら通過し、信号を赤に変える。赤信号なら停止線で待つ。 |
| V操作 (Verhogen=増やす) |
S を 1 増やす。待ち行列にタスクがあれば、先頭のタスクを実行可能状態にする。 | 交差点を通過し終わったら信号を青に戻し、次の車を通す。 |
P操作・V操作はそれぞれ「途中で割り込まれない不可分操作(アトミック操作)」として実行されます。
途中で中断されると制御が崩壊するため、OS側が不可分性を保証しています。
図解:セマフォによる排他制御の流れ
セマフォ変数 S の初期値が 1(バイナリセマフォ)の場合、2つのタスクがどう動くかを時系列で示します。
バイナリセマフォの動作フロー(S の初期値 = 1)
| 順序 | タスクA | タスクB | S の値 | 状況 |
|---|---|---|---|---|
| ① | P操作 → S を 1→0 | — | 0 | Aが資源を獲得 |
| ② | 共有資源を使用中 | P操作 → S=0 なので待ち | 0 | Bは待ち行列へ |
| ③ | V操作 → S を 0→1 | 待ち行列で待機中 | 1 | Aが資源を解放 |
| ④ | — | 実行可能状態へ → S を 1→0 | 0 | Bが資源を獲得 |
▲ Sが0のときP操作を実行したタスクはブロックされ、V操作で起こされる
バイナリセマフォとカウンティングセマフォ
何となくで覚えたい人向け:詳細をクリックして確認
セマフォには2種類あります。
| 種類 | Sの初期値 | 用途 |
|---|---|---|
| バイナリセマフォ | 0 または 1 | 1つのタスクだけが資源を使う排他制御。ミューテックスと似た動作。 |
| カウンティングセマフォ | 2 以上の任意の整数 | 同時に複数のタスクが資源を使える場合の制御。例えばプリンタが3台あるなら初期値を3にする。 |
IPA試験ではバイナリセマフォ(初期値1)の出題が中心です。カウンティングセマフォの存在を知っていれば十分で、深追いは不要です。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 セマフォの核心を3行で
・共有資源への同時アクセスを防ぐ排他制御の仕組み
・P操作(Sを減らして進入 or 待ち)とV操作(Sを増やして解放)の2操作で動く
・P操作・V操作はOSが不可分性を保証するアトミック操作
試験ではこう出る!
セマフォは、FE・APの午前問題で「セマフォを用いる目的」を問う形式が定番です。FE H29秋では午後問題にも登場しています。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| AP H30春 午前 問18 |
セマフォを用いる目的として適切なものを選ぶ。 | ・正解は「共有資源を管理する」 ・スタック、スラッシング、セグメンテーションがひっかけ |
| FE H19春 午前 問29 |
上記AP H30春 問18と同一構成の問題(流用)。 | ・FEとAPで同じ問題が出回る典型例 ・選択肢・正解ともにほぼ同一 |
| 旧SW H17春 午前 問24 |
セマフォに関する記述のうち適切なものを選ぶ。 | ・正解は「V操作は待ちタスクを実行可能状態にする」 ・P/V操作の順序制約やセマフォ数の制限は誤り |
| FE H29秋 午後 問2 |
プロセスの排他制御をセマフォ変数で実現する処理の穴埋め。 | ・P操作・V操作の実行タイミングを具体的に問う ・バイナリセマフォ(初期値1)の動作理解が必須 |
📝 IPA試験での出題パターン
パターン1:「セマフォを用いる目的を選べ」
4つの選択肢から「共有資源の管理」を選ぶ形式。ひっかけとして「スタックの実現」「スラッシング回避」「セグメンテーション実現」が混ざる。セマフォと直接関係ない用語を消去法で消せば正解できる。
パターン2:「P操作・V操作の動作として正しいものを選べ」
旧SW H17春のように、P操作・V操作の性質を問う形式。「V操作で待ちプロセスを実行可能状態にする」が正解。「P操作の前にV操作が必要」「V操作は連続実行できない」「使えるセマフォは1つだけ」はすべて誤り。
試験ではここまででOKです。カウンティングセマフォの詳細やOSカーネル内部の実装まで問われることはないので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. セマフォを用いる目的として、最も適切なものはどれでしょうか?
- A. 複数のタスクが並行動作する環境で、共有資源への同時アクセスを制御する。
- B. 仮想記憶でページの入れ替えが頻発するスラッシングを回避する。
- C. メモリ空間を可変長のセグメントに分割して管理する。
正解と解説を見る
正解:A
解説:
セマフォは、セマフォ変数とP操作・V操作によって共有資源への排他アクセスを実現する仕組みです。AP H30春 午前問18・FE H19春 午前問29でまさにこの観点が問われています。
選択肢Bはスラッシングの説明です。スラッシングは仮想記憶管理におけるページフォルト多発の問題であり、排他制御とは無関係です。選択肢Cはセグメンテーション(セグメント方式)の説明です。メモリの分割管理手法であり、タスク間の同期制御とは目的が異なります。
よくある質問(FAQ)
Q. セマフォとミューテックスは何が違いますか?
ミューテックス(Mutex)は「ロックを獲得したタスク自身が解放しなければならない」という所有権の概念を持つ排他制御です。一方、セマフォにはロックの所有者という概念がなく、P操作を実行したタスクとV操作を実行したタスクが別でも構いません。また、ミューテックスは常に0か1の二値ですが、セマフォはカウンティングセマフォのように2以上の値を取れます。IPA試験の範囲では「セマフォ=共有資源の管理」と覚えておけば得点に支障はありません。
Q. セマフォを使うとデッドロックは防げますか?
防げません。セマフォは排他制御の仕組みであって、デッドロックの防止機構ではありません。タスクAがセマフォ1をP操作し、タスクBがセマフォ2をP操作した状態で、互いにもう一方のセマフォを待ち合うとデッドロックが発生します。デッドロックの回避にはセマフォの獲得順序を統一するなどの設計上の工夫が別途必要です。
Q. P操作・V操作の「P」と「V」は何の略ですか?
オランダ語に由来します。Pは「Proberen(試す)」、Vは「Verhogen(増やす)」の頭文字です。提唱者のダイクストラがオランダ人だったため、オランダ語の命名がそのまま定着しました。英語の文献では P操作を wait、V操作を signal と表記することもあります。
Q. 実務のプログラミングでセマフォを使う場面はありますか?
あります。たとえばJavaにはjava.util.concurrent.Semaphoreクラスが標準で用意されており、データベースコネクションプールの同時接続数制限などに使われます。C言語ではPOSIXセマフォ(sem_init、sem_wait、sem_post)が一般的です。ただし、アプリケーション層ではミューテックスやロック機構のほうが使用頻度が高く、セマフォはOS内部やリアルタイムシステムでの出番が多い傾向です。