ロック処理
読み:ロックしょり
排他制御
の方法の一つで、一つの
リソース
のアクセスが競合しないよう、特定の一つだけにアクセスを許し(ロックする)、他を排除する方法。
目次
概要
特徴
手法
プロセスのロック
ファイルのロック
アトミック
誤解
注意点
概要
複数の
プロセス
が同時にある一つのデータに対する処理を行なうと、データが壊れることがある。
例えば、Webの
アクセスカウンター
などは、アクセスが競合する可能性が高いものの代表である。そして実際に競合してしまうとファイルが壊れ、カウンターが0に戻る、というような現象が発生することになる。
それを避けるため、あるプロセスがその処理を始めたら他のプロセスがそれを出来ないようにする。なお、操作をするプロセスが全て
アトミック
な操作であれば、ロック処理は必要ない。
特徴
手法
プロセスのロック
セマフォ
ミューテックス
スピンロック
ファイルのロック
flock
アトミック
ロック処理を記述する際には、その確認と更新(
テスト&セット
)の手順がアトミックな操作になっている必要がある。
もしこれがアトミックでないと、ロック状態を確認してからロックを行なう際に、更新寸前で他のプロセスが確認を行なってしまってロックしたことを認識できない場合があるためである。
このためロック処理は、ロック操作そのものがロックされているかどうかの確認を兼ねている必要がある。OSの機能として用意されているロック(flockや
セマフォ
など)は一般にこれが保証されている。
誤解
それ以外にロック操作として利用できるものとしてはリネーム操作やディレクトリ作成操作などがあるが、これがアトミックになっているかどうかはOSの仕様を確認する必要がある。
多くの素人が「ファイルの有無を条件式で確認し、無ければファイルを作成してロックとする」などとしているが、これは全くロック処理になっていない。
注意点
ロック処理に必要なものとしては、「データ読み込み」、「内容の更新」、「データを書き込み」という一連の手順全体を丸ごとロックしなければいけない。
しかし、素人はこれを個別にロックまたは最後の書き込みのみロックすれば良いのか、と勘違いしやすいようだ。
再検索