ファイルロックとは
ひとつのファイルに対して複数人で同時に書き込みを行うとファイルは破損します。複数のプロセスがひとつのファイルに対して並行して書き込み行う場合は、それぞれのプロセスが順番を守る必要があります。ファイルロック機構を使用すれば、複数のプロセスが順番を守ってファイルに安全にアクセスすることができます。
ファイルロックは、排他制御とも呼ばれ、複数のプロセスが順番を守ってファイルを利用する仕組みです。Perlには、flock関数というファイルロックを行うための仕組みがあります。( Window98などflockが利用できないOSが一部あります。)
順番を守る必要がある場合
ひとつのファイルに対して読み込みを並列で行う場合は、順番を守る必要がありません。読み込むだけなので、ファイルの破損やデータの不整合を心配する必要がないからです。
順番を守る必要があるのは、複数のプロセスがひとつのファイルに書き込みを行う場合です。順番イ書き込みが行われず、平行してファイルに書き込みを行った場合ファイルが破損します。
またひとつのファイルへ読み書きを行う複数のプロセスがいる場合データの不整合が発生します。アクセスカウンターを考えましょう。ファイルには、0と書かれているとします。この数字に1を加えて書き戻すプログラムはがあるとします。この場合に並列にアクセスした場合に起こる問題を考えます。
プロセスA 読み込み--------------------------->書き込み 0 1 プロセスB 読み込み------------------------------->書き込み 0 1 ファイル内容 0 1 1
アクセスカウンタの場合は上記の流れが期待した動きでないことは明らかです。わたしたちは、二つのプロセスが処理を終えたとき、最初の0から2加算されることを期待します。データの整合性を保つには、プロセスBはプロセスAがファイルに1を書き込むまで、待つ必要があります。
アドバイザリーロック
Perlでは、ファイルをロックする場合flock関数を使用しますが、この関数はファイルを強制的にロックするものではありません。実際flock関数でロックを掛けたファイルに対して、他のプロセスは書き込むことができます。
ファイルロックが正常に機能させるためには、ファイルにアクセスしようとするプロセスは必ず、flock関数を使ってファイルロックを行う必要があります。この約束を守らないプロセスがあれば、ファイルを順番に利用することはできません。このようなロックをアドバイザリーロックと呼びます。「順番を守りましょう。ファイルを使用したいときは、ファイルに対してflockを行ってください。だれも利用していないなら、あなたがファイルの使用権を取得できます。だれかが使用しているなら、今は使用できない旨が通知されますので待ってくださいい。」
排他ロックと共有ロック
ロックの種類には、排他ロックと共有ロックがあります。排他ロックは書き込むときに使用され、共有ロックは読み込むときに使用されます。
使用機会 | 他のプロセスがロックを掛けようとした場合 | |
共有ロック | 読み込む場合 | 共有ロックは許可するが排他ロックを許可しない |
排他ロック | 書き込む場合 | 共有ロックも排他ロックも許可しない |
ちょっとややこしいですが簡単にいうと、「読み込む場合は複数人で読み込んでもかまいませんが、書き込む場合は必ずひとりで書き込んでください」ということです。