「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

セマフォ

pointこの用語のポイント

point排他制御のための仕組み(のひとつ)だよ

pointあと何人使えるよ!を表す数字だよ

point同期処理に使われる場合もあるよ

スポンサーリンク

簡単に書くよ

セマフォ(英:semaphore)とは

排他制御(ダブルブッキングしないようにすること)のための仕組み
であり

同時に使える人の数が決まっている物に割り当てられた「あと何人の人が使えるよ」を表した数字
です。


image piyo

詳しく書くよ

ちょっと小難しい言い方をすると

共有資源に対するアクセス可能な数を示す値

が「セマフォ」です。
資源にアクセスする度にセマフォの値を増減することで、排他制御を実現します。

……と言われても、何がなんだか分かりませんよね。

大丈夫です。
順番に説明していきます。

まず予備知識として「排他制御」を理解しておいてください。

排他制御は「ダブルブッキングしないようにすること」です。
同時に使われるとマズい(おかしくなる)ものに組み込む仕組みで、1つの物を同時に使わせないための工夫です。

例えば、そうですね。

ピヨ太君が、とあるファイルに文章を書いていたとしましょう。

セマフォ

ピヨ太君が文章を書いている中、ピヨ子さんも同じファイルに文章を書きました。

セマフォ2

そうすると、ファイルの中身はどうなるでしょう?
可能性としては

1.最初に書いていたピヨ太君の書いた内容が残る
2.後から書いたピヨ子さんの書いた内容が残る
3.2人の書いた内容がごちゃまぜになる


のどれかでしょうか。
いずれにせよ望ましい状態ではなさそうです。

このような事態を避けるために「誰かがファイルに書いているときは他の人は書いちゃダメ」というルールと、それを実現するための仕組みを導入しました。

具体的には、ファイルを使っているときは使っている人の名前を書いたメモを置いておくことにしたのです。
ピヨ太君がファイルに書いているときは「ピヨ太が書き込み中」というメモを置いておきます。

セマフォ3

そうすれば、メモを見たピヨ子さんは「ピヨ太が使ってるのね。また後にしましょ」と判断できますよね。

セマフォ4

これで、2人が同時に文章を書いてファイルの中身がおかしくなる事態は避けられます。
このような、ダブルブッキングを避けるための仕組みを「排他制御」と言います。

なんでここで排他制御の説明をしたかというと、セマフォは排他制御を実現するための仕組みだからです。
それを踏まえて、読み進めてください。

ある日のことです。
ピヨ太君が握手会を開催することにしました。

セマフォ5

ピヨ太君には左手と右手があります。
両手を使えば、同時に2人の人と握手できます。

そこで、ピヨ太君のマネージャは「ピヨ太握手可能人数:残り2名」と黒板に書きました。

セマフォ6

さてさて、握手会の始まりです。
サクラとして雇われたピヨ子さんが握手をしに来ました。

セマフォ7

ピヨ太君はピヨ子さんと握手をしています。
ピヨ太君の片手がピヨ子さんとの握手に使われています。

ピヨ太君は片手のみ空いている状態です。
あと1人の人と握手できます。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り1名」と黒板の内容を書き換えました。

セマフォ8

おっと、また誰か握手をしに来たようです。
今度は、冷やかしでやってきたアクマ君でした。

セマフォ9

ピヨ太君は、ピヨ子さんと握手している手とは逆の手で、アクマ君と握手をします。
これでピヨ太君の両手はふさがりました。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り0名」と黒板の内容を書き換えます。

セマフォ10

おっと、またまた誰か握手をしにやってきました。
今度はピヨ太ママがやってきたようです。
ピヨ太君、意外と人気者ですね。

セマフォ11

でも、残念。
今は「ピヨ太握手可能人数:残り0名」です。

仕方がないので、ピヨ太ママには待っていてもらいます。

セマフォ12

おっと、ピヨ子さんが空気を読んだようです。
ピヨ太ママが待っているのを察して、帰って行きました。

セマフォ13

ピヨ子さんが帰ったので、ピヨ太君の片手が空きました。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り1名」と黒板の内容を書き換えます。

セマフォ14

そういえば、ピヨ太ママが待っていましたね。
早速ピヨ太ママが握手をしました。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り0名」と黒板の内容を書き換えます。

セマフォ15

このお話に登場した黒板の内容

ピヨ太握手可能人数:残り○名

がセマフォです。

セマフォは「あと何人使えますよ」を表す数値です。
誰かが使い始めたら、値から「1」引きます。
使い終わったら「1」足します。

セマフォの値が0になったら、そいつはもういっぱいいっぱいです。
それ以上の人数で使うのはダブルブッキングになってしまいます。
そこで、セマフォの値が0の場合は、誰かが使い終わって1以上に戻るのを待ちます。

このような仕組みで排他制御を実現するのがセマフォです。

なお、セマフォを確保する操作(セマフォの値から1引く操作)を「P操作」と言います。
確保したセマフォを解放する操作(セマフォの値に1足す操作)を「V操作」と言います。
余裕があれば、併せて覚えてあげてください。

また、セマフォは同期処理に使われる場合も あります。
同期は「足並みを揃える」的な意味ね。

先程「セマフォの値が0の場合は、誰かが使い終わって1以上に戻るのを待ちます」と書きました。

そうです。
待つのです。

これを利用して足並みを揃えられます。

例えば、ここに2つのプログラム、プログラムAとプログラムBが あったとしましょう。

セマフォ16

プログラムAの方が足が速いです。
プログラムBを置いてけぼりにして、処理をガンガン進めていきます。

セマフォ17

そんなウサギさんタイプのプログラムAに「ファイルaの中身を見なさい」な処理を組み込んでおくのです。
ファイルaのセマフォの値は「0」にしておきます。

セマフォ18

そうすると、プログラムAは「ファイルaの中身を見なさい」な処理に来た時点で止まります。
ファイルaの中身を見たいけど使用可能人数の残り(セマフォの値)が0なので見られないからです。
使用可能人数の残りが1に戻るのを、じーっと待ちます。

セマフォ19

そうこうするうちに、プログラムBが追い付きました。
そうしたら、ファイルaのセマフォの値を「1」に書き換えます。

セマフォ20

セマフォの値が1になると、プログラムAはファイルaの中身を見られます。
つまり、処理が再開するわけです。

これでまた、プログラムAとプログラムBは同じ位置から処理が始まりますね。
同期が取れている状態です。

セマフォ21

このように、セマフォを使ってプログラム(正確にはスレッド間の足並みを揃えることもできます。


image piyo2

一言でまとめるよ

まぁ「セマフォ」って単語が出てきたら「『あと何人の人が使えるよ』を表した数字なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像001
書籍画像017

おまけ

■訳してみるよ

「semaphore(セマフォ)」の意味は

・手旗信号
・信号装置


とかです。


■検索してみる?




書籍画像
わわわ説明術コラム
宣伝だよ
エンジニア育成現場の「失敗」集めてみた。 42の失敗事例で学ぶマネジメントのうまい進めかた
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
実践サイバーセキュリティ入門講座 現場に残された痕跡からハッカーの攻撃を暴け