セマフォ(semaphore)
同時に使える数を数えておき、空きが無いあいだは待たせる仕組み。
もう少し詳しい説明
セマフォは、同時に使える数を数えておいて、空きが無いあいだは待たせる仕組みです。
コインパーキングを思い浮かべてください。入口の看板に「空車 3」と出ています。1台入れば「空車 2」に減り、1台出れば増える。0 になったら、誰かが出るまで次の車は入れません。これがセマフォのやっていることそのものです。
なぜ必要なのか
同時に触られると困るものが世の中にはあります。
ここでいう処理は、コンピュータの中で動いているプログラムの流れ1本ぶんを指します。プロセスやスレッドと呼ばれるものです。このあと「2つの処理が」と書くときは、機械の中で流れが2本、同時に動いていることを指しています。
1台しかないプリンタに2つの処理が同時に印刷を始めたら、紙の上で文字が混ざります。同じデータを2つの処理が同時に書き換えたら、片方の更新が消えます。こうした事故を防ぐために、同時に使ってよい数を決めて、そこで止める必要があります。
この「同時に触らせない」という考え方全体が排他制御(同じものを2つの処理が同時に書き換えないよう、順番に1つずつ使わせること)で、セマフォはその実現方法の1つです。ここは上下関係なので、並べて問われたときに取り違えないでください。
2つの操作だけでできている
セマフォの操作は2つしかありません。
- P操作:使う前に行う。数を 1つ減らす。0 なら空くまで待つ
- V操作:使い終わったら行う。数を 1つ戻す
(PとVは、この仕組みを考えたダイクストラというオランダの研究者が使った、オランダ語の頭文字から来ています。日本語の意味と結びつかないので、「Pが先、Vがあと」とアルファベット順で覚えるのが確実です。)
駐車場でいえば、P が入場、V が出庫です。必ず対で呼ぶのが鉄則で、V を書き忘れると数が戻らず、後続が永久に待たされます。
数の初期値を 1 にすると、「同時に使えるのは1つだけ」になります。これを二値セマフォ(値が0か1しか取らないセマフォ)と呼び、鍵そのものとして使えます。同じ役目のものをミューテックス(mutual exclusion=相互排除の略。同時に1つしか使わせない仕組み)と呼ぶこともあります。
デッドロックとの関係
セマフォは待たせる仕組みなので、使い方を誤ると止まったままになります。
処理Aがセマフォ①を取ってから②を待ち、処理Bが②を取ってから①を待つ。こうなると互いに相手が返すのを待ち続け、どちらも進みません。これがデッドロック(2つの処理が、互いに相手の持っているものを待ち続けて、どちらも進めなくなる状態)です。
言葉だけだと分かりにくいので、料理に置き換えます。
ステーキと、付け合わせのほうれん草のソテーを作ります。台所にあるのはまな板が1つとフライパンが1つだけ。この2つが、取り合いになる資源(処理が動くために使うもの。プログラムの世界なら、プリンタ・ファイル・データなどがこれにあたります)です。
手順は、それぞれこうなります。
- ステーキ:フライパンで焼いてから、まな板で切る
- ほうれん草:まな板で切ってから、フライパンで焼く
2品を同時に進めると、こうなります。
| いま使っているもの | 次に使いたいもの | |
|---|---|---|
| ステーキ | フライパン(焼き上がった) | まな板(切りたい) |
| ほうれん草 | まな板(切り終わった) | フライパン(焼きたい) |
ステーキはフライパンの上で焼き上がり、まな板へ移したい。でもまな板にはほうれん草が載っています。そのほうれん草は切り終わってフライパンへ移したいのに、フライパンにはステーキが載っている。どちらも空くのを待っていて、どちらも空きません。
どちらの手順も間違っていないのに止まる、というのがこの状態の厄介なところです。ステーキは焼いてから切るもので、ほうれん草は切ってから焼くもの。どちらも正しいのに、同時に進めた途端に動かなくなります。
現実の台所なら、どちらかをいったん皿に移せば済みます。ところがプログラムは、いったん取った資源を、自分から途中で手放すようには作られていません。使い終わるまで握り続けます。そのため、放っておけば止まったままです。
大事なのは向きで、セマフォはデッドロックを解決する仕組みではありません。むしろデッドロックは、セマフォのような排他制御を使った結果として起こります。選択肢に「デッドロックを検知して解消する」と書いてあれば、それは誤りです。
防ぎ方の基本は、取る順番を全員でそろえることです。全員が①→②の順で取ると決めておけば、輪ができません。
覚え方:看板の数を増減させるだけ
セマフォ(semaphore)は、もともと鉄道の腕木式信号機を指す言葉です。線路のわきに立つ柱から腕木(うでぎ)が横に伸びていて、その腕木が上がっているか下がっているかで、進んでよいかを知らせていました。
覚えるときは、「空車 3」の看板を思い浮かべてください。やっていることは、その数を1つ減らす(P)か、1つ戻す(V)かだけ。0 なら待つ。仕組みとしてはこれだけで、それ以上のことはしません。「強制終了させる」「検知する」といった、能動的に何かをする説明が出てきたら誤りだと判断できます。
試験ではこう出る
科目A(旧・午前)のソフトウェア分野で出ます。
多いのは、セマフォの説明として正しいものを選ばせる問題です。P操作とV操作が何をするかを問う形もあります。応用情報では、複数の処理がセマフォを取り合う様子を追わせ、デッドロック(互いに待ち合って進めなくなる状態)が起こる条件や、その回避方法(取る順番を全員でそろえる)まで踏み込みます。
排他制御・セマフォ・デッドロックは、同じ話の別の側面として並べて出題されます。「同時に触らせない仕組み」が排他制御、「その数え方の1つ」がセマフォ、「取り合って止まった状態」がデッドロック。この3つの位置関係を押さえておけば、どれを聞かれても迷いません。
関連する用語
- 排他制御
- 同時に触られると困るものに鍵をかける仕組み。セマフォはその実現方法の1つ
- デッドロック
- 鍵を取り合った結果、互いに待ち合って動けなくなる状態
- プロセスとスレッド
- プログラムを動かす単位。資源を取り合うのはこれらどうし
- P操作・V操作
- セマフォを1つ減らす操作がP、1つ戻す操作がV。使う前と使った後に行う
- 排他制御の粒度
- 同時に使える数が1つだけのものは、二値セマフォやミューテックスと呼ぶ
- キュー
- 先に入れたものから先に出す入れ物。待っている相手の管理に使われる
ミニクイズ
セマフォの説明として、最も適切なものはどれか。
正解は 2番:共有資源を同時に使える数を管理し、空きが無いあいだは要求した処理を待たせる
セマフォは、同時に使ってよい数を数えとして持ち、使うときに1つ減らし、返すときに1つ戻します。0になったら空きが出るまで待たせる、という単純な仕組みです。使っている側を強制終了させることはなく、あくまで待たせるだけです。互いに待ち合う状態はデッドロック(2つの処理が、互いに相手の持っているものを待ち続けて進めなくなる状態)ですが、セマフォはそれを検知したり解消したりする仕組みではありません。むしろ、セマフォの取り合い方を誤るとデッドロックが起こります。独立したメモリ(プログラムとデータを置いておく記憶装置)の領域を割り当てるのはプロセス(OSから見た、実行中のプログラム1つぶんのまとまり)の性質で、セマフォの役目ではありません。
この分野をまとめて解く → システム構成要素とソフトウェアのミニテスト(全28問)
最終更新:2026-09-16