セマフォ
排他制御のための仕組み(のひとつ)だよ
あと何人使えるよ!を表す数字だよ
同期処理に使われる場合もあるよ
簡単に書くよ
セマフォ(英:semaphore)とは
排他制御
(ダブルブッキングしないようにすること)のための仕組み
であり
同時に使える人の数が決まっている物に割り当てられた「あと何人の人が使えるよ」を表した数字
です。
詳しく書くよ
ちょっと小難しい言い方をすると
共有資源に対するアクセス可能な数を示す値
が「セマフォ」です。
資源にアクセスする度にセマフォの値を増減することで、排他制御を実現します。
……と言われても、何がなんだか分かりませんよね。
大丈夫です。
順番に説明していきます。
まず予備知識として「排他制御」を理解しておいてください。
排他制御は「ダブルブッキングしないようにすること」です。
同時に使われるとマズい(おかしくなる)ものに組み込む仕組みで、1つの物を同時に使わせないための工夫です。
例えば、そうですね。
ピヨ太君が、とあるファイルに文章を書いていたとしましょう。
ピヨ太君が文章を書いている中、ピヨ子さんも同じファイルに文章を書きました。
そうすると、ファイルの中身はどうなるでしょう?
可能性としては
1.最初に書いていたピヨ太君の書いた内容が残る
2.後から書いたピヨ子さんの書いた内容が残る
3.2人の書いた内容がごちゃまぜになる
のどれかでしょうか。
いずれにせよ望ましい状態ではなさそうです。
このような事態を避けるために「誰かがファイルに書いているときは他の人は書いちゃダメ」というルールと、それを実現するための仕組みを導入しました。
具体的には、ファイルを使っているときは使っている人の名前を書いたメモを置いておくことにしたのです。
ピヨ太君がファイルに書いているときは「ピヨ太が書き込み中」というメモを置いておきます。
そうすれば、メモを見たピヨ子さんは「ピヨ太が使ってるのね。また後にしましょ」と判断できますよね。
これで、2人が同時に文章を書いてファイルの中身がおかしくなる事態は避けられます。
このような、ダブルブッキングを避けるための仕組みを「排他制御」と言います。
なんでここで排他制御の説明をしたかというと、セマフォは排他制御を実現するための仕組みだからです。
それを踏まえて、読み進めてください。
ある日のことです。
ピヨ太君が握手会を開催することにしました。
ピヨ太君には左手と右手があります。
両手を使えば、同時に2人の人と握手できます。
そこで、ピヨ太君のマネージャは「ピヨ太握手可能人数:残り2名」と黒板に書きました。
さてさて、握手会の始まりです。
サクラとして雇われたピヨ子さんが握手をしに来ました。
ピヨ太君はピヨ子さんと握手をしています。
ピヨ太君の片手がピヨ子さんとの握手に使われています。
ピヨ太君は片手のみ空いている状態です。
あと1人の人と握手できます。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り1名」と黒板の内容を書き換えました。
おっと、また誰か握手をしに来たようです。
今度は、冷やかしでやってきたアクマ君でした。
ピヨ太君は、ピヨ子さんと握手している手とは逆の手で、アクマ君と握手をします。
これでピヨ太君の両手はふさがりました。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り0名」と黒板の内容を書き換えます。
おっと、またまた誰か握手をしにやってきました。
今度はピヨ太ママがやってきたようです。
ピヨ太君、意外と人気者ですね。
でも、残念。
今は「ピヨ太握手可能人数:残り0名」です。
仕方がないので、ピヨ太ママには待っていてもらいます。
おっと、ピヨ子さんが空気を読んだようです。
ピヨ太ママが待っているのを察して、帰って行きました。
ピヨ子さんが帰ったので、ピヨ太君の片手が空きました。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り1名」と黒板の内容を書き換えます。
そういえば、ピヨ太ママが待っていましたね。
早速ピヨ太ママが握手をしました。
ピヨ太君のマネージャは「ピヨ太握手可能人数:残り0名」と黒板の内容を書き換えます。
このお話に登場した黒板の内容
ピヨ太握手可能人数:残り○名
がセマフォです。
セマフォは「あと何人使えますよ」を表す数値です。
誰かが使い始めたら、値から「1」引きます。
使い終わったら「1」足します。
セマフォの値が0になったら、そいつはもういっぱいいっぱいです。
それ以上の人数で使うのはダブルブッキングになってしまいます。
そこで、セマフォの値が0の場合は、誰かが使い終わって1以上に戻るのを待ちます。
このような仕組みで排他制御を実現するのがセマフォです。
なお、セマフォを確保する操作(セマフォの値から1引く操作)を「P操作」と言います。
確保したセマフォを解放する操作(セマフォの値に1足す操作)を「V操作」と言います。
余裕があれば、併せて覚えてあげてください。
また、セマフォは同期処理に使われる場合も あります。
同期は「足並みを揃える」的な意味ね。
先程「セマフォの値が0の場合は、誰かが使い終わって1以上に戻るのを待ちます」と書きました。
そうです。
待つのです。
これを利用して足並みを揃えられます。
例えば、ここに2つのプログラム、プログラムAとプログラムBが あったとしましょう。
プログラムAの方が足が速いです。
プログラムBを置いてけぼりにして、処理をガンガン進めていきます。
そんなウサギさんタイプのプログラムAに「ファイルaの中身を見なさい」な処理を組み込んでおくのです。
ファイルaのセマフォの値は「0」にしておきます。
そうすると、プログラムAは「ファイルaの中身を見なさい」な処理に来た時点で止まります。
ファイルaの中身を見たいけど使用可能人数の残り(セマフォの値)が0なので見られないからです。
使用可能人数の残りが1に戻るのを、じーっと待ちます。
そうこうするうちに、プログラムBが追い付きました。
そうしたら、ファイルaのセマフォの値を「1」に書き換えます。
セマフォの値が1になると、プログラムAはファイルaの中身を見られます。
つまり、処理が再開するわけです。
これでまた、プログラムAとプログラムBは同じ位置から処理が始まりますね。
同期が取れている状態です。
このように、セマフォを使ってプログラム(正確にはスレッド)間の足並みを揃えることもできます。
一言でまとめるよ
まぁ「セマフォ」って単語が出てきたら「『あと何人の人が使えるよ』を表した数字なんだな~」と お考えください。






