「排他制御」とは?わかりやすく解説!【共有ロック・占領ロック】

基礎

「排他制御(はいたせいぎょ)」とは、簡単にいうと「複数人で同時アクセスして、ゴチャゴチャにならないようにするルール」のことです。

実際には「このシステム排他制御つけてる?」「このシステムは排他的だね。」という使い方をします。
排他制御はコンピュータの至る所で使われているルールなので、覚えておいて損はないですよ!

排他制御の身近な例

複数人で更新しているブログがあるとします。
今、Aくんが記事を編集しています。
同じタイミングでBくんが同じ記事を編集しようとしましたが
「他の人が編集中なので、記事を開くことができません。編集が終わるまでお待ちください。」
とエラーが表示されてしまいました。

これが、排他制御です。

もしも排他制御がなかったら、Aくん・Bくんどちらかが編集した記事が、上書きされてしまったかもしれません。

設計者は「1つのデータに複数人がアクセスする可能性があるシステム」の場合、ほぼ必ず排他制御を施しています。
上記のようなブログシステムもまた然り。

いろんな排他制御

排他制御と一言でいっても、種類はいろいろあります。

共有ロック

「書込」は禁止されますが、「読込」は出来ます。
つまり「保存はできないけど、閲覧はできるよ!」という状態です。

占領ロック

「書込」も「読込」も禁止されます。
上記であげたブログの例は、占領ロックということになりますね。

例外:デッドロック

稀に起こる面白い現象に「デッドロック」というものもあります。
これは排他制御ではなく、排他制御でおこるバグの名称です。

デッドロックは、同時にロックすべきものが2つ以上ある場合におこるバグです。
2つあるうちの1つをAくんが、もう1つをBくんが、偶然同時刻にロックしてしまい
お互いにもう1つのファイルがロック解除されるのを待ってる状態のまま、処理が停止してしまうことをいいます。

Aくん「ファイル1は俺がロックしたぞ。さて、ファイル2もロックしよう・・・ってあれ?ファイル2誰かがロックしてるなぁ。仕方がない、空くまで待とう。」
Bくん「ファイル2は俺がロックしたぞ。さて、ファイル1もロックしよう・・・ってあれ?ファイル1誰かがロックしてるなぁ。仕方がない、空くまで待とう。」

_人人人人人人人人人人人_
> そのまま10年が経過 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

デッドロックになってしまったら、永遠に処理が進むことはありません。処理を停止しない限り、ずっと待ちぼうけです。
運悪くデッドロックが起きてしまわないよう、プログラムにはしっかりデッドロック防止処理を組み込まなければいけませんね。


Category
9WEB