【せまふぉ】

セマフォ とは?

💡 共有リソースへの「同時アクセス数」を制御する交通整理の仕組み
📌 このページのポイント
セマフォの仕組み(駐車場モデル) カウンタ 3 wait() P操作 signal() V操作 共有リソース(駐車場) 最大3台まで同時利用可 スレッド A スレッド B スレッド C 待機中 スレッド D スレッド E カウンタ=0 で待機 完了して 退出 カウンタ+1 wait(): カウンタ{'>'} 0 なら -1 してアクセス許可 / カウンタ = 0 なら待機 signal(): カウンタ +1 して待機中スレッドに通知 / Mutexはカウンタ=1の特殊ケース
セマフォの仕組み
ひよこ ひよこ

セマフォって何?

ペンギン先生 ペンギン先生

共有リソースへのアクセスを制御するための仕組み。駐車場の「残り台数」のイメージで、カウンターが0になったら新たに入れない(待たせる)、車が出たらカウンターを増やして次の車が入れる、という仕組み。プログラムでは「同時に使えるスレッド数を制限」するのに使う。

ひよこ ひよこ

ミューテックスとどう違うの?

ペンギン先生 ペンギン先生

ミューテックス(mutex)は「一度に1つのスレッドだけ使える(1台分の駐車場)」という特殊なセマフォ。セマフォはカウンターが複数(N台分の駐車場)を表現できる。また、ミューテックスはロックしたスレッドのみが解放できるが、セマフォは別のスレッドが解放できる。

ひよこ ひよこ

デッドロックって何?

ペンギン先生 ペンギン先生

複数スレッドが互いの解放を待って永遠に動けなくなる状態。スレッドAがリソース1を持ったままリソース2を待ち、スレッドBがリソース2を持ったままリソース1を待つ、という状況。セマフォやロックの取得順序を統一するなどで防ぐ必要がある。

ひよこ ひよこ

実際のプログラミングでセマフォってどう使うの?

ペンギン先生 ペンギン先生

たとえばデータベースへの同時接続数を制限したいとき、セマフォのカウンターを最大接続数に設定する。接続するときにacquire(カウンター-1)、切断時にrelease(カウンター+1)する。Pythonだとasyncio.Semaphore(10)で同時10接続までに制限できるよ。

ひよこ ひよこ

セマフォを使わないとどんな問題が起きるの?

ペンギン先生 ペンギン先生

たとえば100個のURLを並列でダウンロードするとき、セマフォなしだと100個のHTTP接続が一気に開いてサーバーに負荷をかけたり、自分のPCのメモリが不足したりする。セマフォで「同時に10個まで」と制限すれば安全に処理できる。実はOSのファイルディスクリプタにも上限があって、それを超えるとプログラムがクラッシュするんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
セマフォって出てきたら「共有リソースへの同時アクセス数を制御する同期機構、スレッドの競合防止に使う」と思えばOK!
📖 おまけ:英語の意味
「Semaphore」 = 腕木式信号機・手旗信号
💬 鉄道の腕木式信号機(セマフォ)から命名。Dijkstraが1965年に論文で発表した。「P」はオランダ語proberen(試みる)、「V」はverhogen(増やす)の頭文字
← 用語集にもどる