ロック処理
読み:ロックしょり

 排他制御の方法の一つで、一つのリソースのアクセスが競合しないよう、特定の一つだけにアクセスを許し(ロックする)、他を排除する方法。
目次

概要
 複数のプロセスが同時にある一つのデータに対する処理を行なうと、データが壊れることがある。
 例えば、Webのアクセスカウンターなどは、アクセスが競合する可能性が高いものの代表である。そして実際に競合してしまうとファイルが壊れ、カウンターが0に戻る、というような現象が発生することになる。
 それを避けるため、あるプロセスがその処理を始めたら他のプロセスがそれを出来ないようにする。なお、操作をするプロセスが全てアトミックな操作であれば、ロック処理は必要ない。

特徴

手法

プロセスのロック

ファイルのロック

アトミック
 ロック処理を記述する際には、その確認と更新(テスト&セット)の手順がアトミックな操作になっている必要がある。
 もしこれがアトミックでないと、ロック状態を確認してからロックを行なう際に、更新寸前で他のプロセスが確認を行なってしまってロックしたことを認識できない場合があるためである。
 このためロック処理は、ロック操作そのものがロックされているかどうかの確認を兼ねている必要がある。OSの機能として用意されているロック(flockやセマフォなど)は一般にこれが保証されている。

誤解
 それ以外にロック操作として利用できるものとしてはリネーム操作やディレクトリ作成操作などがあるが、これがアトミックになっているかどうかはOSの仕様を確認する必要がある。
 多くの素人が「ファイルの有無を条件式で確認し、無ければファイルを作成してロックとする」などとしているが、これは全くロック処理になっていない。

注意点
 ロック処理に必要なものとしては、「データ読み込み」、「内容の更新」、「データを書き込み」という一連の手順全体を丸ごとロックしなければいけない。
 しかし、素人はこれを個別にロックまたは最後の書き込みのみロックすれば良いのか、と勘違いしやすいようだ。

再検索