[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

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

セマフォ (semaphore)

pointこの用語のポイント

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

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

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

スポンサーリンク

簡単に書くよ

セマフォ (semaphore)とは

排他制御のための仕組み
であり

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

image piyo

詳しく書くよ

ちょっと小難しい言い方をすると、共有資源に対するアクセス可能な数を示す値がセマフォです。
資源にアクセスする度にセマフォの値を増減することによって、排他制御を実現します。

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

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

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

排他制御は「誰かが使っているときは他の人は使っちゃ駄目だよ」を実現する仕組みです。
大雑把に「ダブルブッキングしないようにする仕組み」と捉えても構いません。

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

セマフォ

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

セマフォ2

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

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


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

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

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

セマフォ3

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

セマフォ4

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

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

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

セマフォ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

一言でまとめるよ

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

一番上に戻るよ
スポンサーリンク