WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:ロックファイル処理とは?

ひょっとこ [WriteDate : Fri Dec 15 21:56:51 2000]

はじめまして。
Perl、CGIに挑戦して間もない私です。
そこで質問があるのですが、『ロックファイル処理』の意味を教えてください。いまいち、この処理の意義がわかりません。
よろしくお願いします。


わごな [MAIL] [URL] [WriteDate : Fri Dec 15 23:15:33 2000]

複数のブラウザから同時にアクセスされたときに
排他制御をするために使います

例えば・・
掲示板にAさんとBさんがほぼ同時に投稿しました
掲示板のプログラムは

Aさんのためにログを読み込み
Bさんのためにログを読み込み
Aさんの記事を読んだログに追加して書きこみ
Bさんの記事を読んだログに追加して書きこみ

と、動きます

このとき・・
Bさんの為にログをよんだときにはAさんの記事は存在していないので
最期の工程では「元のログ+Bさんの記事」を書きこみます
結果としてAさんの投稿はログに残りません

これを防止する為、
ログの更新を行う前後でファイルロックを行います

↓こうなる

Aさんのロック処理
Aさんのためにログを読み込み
Bさんのロック処理・Aさんがロックしているので失敗
Aさんの記事を読んだログに追加して書きこみ
Aさんのロック解放
Bさんのロック処理(再試行)・Aさんが解放したので成功
Bさんのためにログを読み込み
Bさんの記事を読んだログに追加して書きこみ

ちょっとわかりずらくてすいません

詳しい方へ
いい加減な説明なので
ツッコミ・補足をお待ちしています

ひょっとこ [WriteDate : Sat Dec 16 00:27:36 2000]

わごなさんへ
わかりやすい説明でしたので、理解できました。
ありがとうございます。
次回も、分からないことがあったらよろしくお願いします。

バギンズ [WriteDate : Sat Dec 16 00:50:40 2000]

じゃあ、私は別の方法で説明しますね。(^_^;)

まず、「ロックファイル処理」というより「ファイルロック処理」でしょうか?(^_^;)
※ロック用ファイルを使ってのファイルロック処理ってのもありますけど。

で、ファイルロック処理ですが、意味はそのまんまでして、ファイルに鍵をかけるって事です。
自分がファイルを使っている間は他人に同じファイルを使われないように鍵をかけておく処理のことです。

Webサーバーはマルチタスクで動いていますので、同時に同じファイルを複数のプログラム(CGI等)がアクセスする可能性があります。

複数のプログラムが同時に同じファイルを読むだけなのなら何の問題もありません。
しかし、ファイルへの書き込みが発生した場合には問題が起きます。

ファイルの内容が壊れたり、片方のプログラムで書き込んだデータが他のプログラムに上書きされて無効になったりする事がありえるのです。
また、場合によっては、書き込み途中の中途半端なデータを、他のプログラムに読まれてしまい、中途半端なデータを読んだ他のプログラムが誤動作する可能性もあります。

これを防ぐために、「自分がファイルを使っている間は他人に同じファイルを使われないように鍵をかけておく」って処理を行うわけです。

わごな [MAIL] [URL] [WriteDate : Sat Dec 16 02:54:18 2000]

パキンズさん ありがとうございます

前から気になってたんですが読み書き途中のファイルを
他のプログラムがアクセスして壊れるんでしょうか?

CGI(perl)のread/writeなら
OSレベルでガード(排他制御)してくれても良さそうなもんだなぁ
って、思ってるんですが実際に壊れたって話もマレにきくしなぁ

バギンズ [WriteDate : Sat Dec 16 11:36:16 2000]

>わごなさん
わごなさんの解説も具体的な内容で大変解りやすいと思います。(^_^)

>前から気になってたんですが読み書き途中のファイルを 
>他のプログラムがアクセスして壊れるんでしょうか? 
どうなんでしょう?
私も実際にロックをしないで書き込み途中のファイルを読まれるテストはした事ありません。(^_^;)
カウンタCGIレベルの小さいファイルでのテストはした事あるのですが、その場合はどれかのタスクが書いたものが完全に上書きされているようでした。

>OSレベルでガード(排他制御)してくれても良さそうなもんだなぁ 
>って、思ってるんですが実際に壊れたって話もマレにきくしなぁ 
それは書き込みを許可するモードでオープンした場合には、自動的にロックすればいいという事でしょうか?
でも、ファイルへの書き込みって必ずしもファイル全体を書き直すとは限りませんから。
普通のアプリケーションはファイルロック(テーブルロック)より部分的なレコードロックを行う場合が多いように思えますし。

#そーいえば、私が使用している、ぷららのCGIサーバーはロック不要なんです。
#なんでかというと、1ユーザーにつき1CGIしか動作しないように
#なっているらしいです。
#SERVER_SOFTWARE = Apache/1.3.9 (Unix) PHP/3.0.14
#なんですが、そーいう設定ってできるもんなんですかね?

ひょっとこ [WriteDate : Sat Dec 16 12:29:52 2000]

>1 ## --- ロックファイル(open関数)
>2 sub lock2 {
>3  local($flag) = 0;
>4  foreach (1 .. 5) {
>5  if (-e $lockfile) { sleep(1); }
>6  else {
>7  open(LOCK,">$lockfile") || 
>8 &error("Write Error : $lockfile","lock");
>9  close(LOCK);
>10  $flag = 1;
>11  last;
>12  }
>13  }
>14  if ($flag == 0) { &error("LOCK is BUSY","lock"); }
>15 }

 ロックファイル処理(またはファイルロック処理)についての意見、有り難うございます。プログラムはおくが深いとしみじみ感じます。

 今回はスクリプトについて質問があります。
 5行目の
      if( -e $lockfile ){ ... }
  の『-e』はどういう機能でしょうか? 次の else の処理から推測して、if の処理は $lockfile が存在する場合の処理で、『真』の場合はファイルにロックしているようですが、いまいちピンときません。

 解説の程よろしくお願いします。

ちゃいぱ [MAIL] [URL] [WriteDate : Sat Dec 16 13:36:52 2000]

>『-e』はどういう機能でしょうか? 
以下が参考になるかな...。

http://www.parkcity.ne.jp/~chaichan/src/perl02.htm#ファイル演算子

Tak [MAIL] [WriteDate : Sat Dec 16 14:20:44 2000]

>『真』の場合はファイルにロックしているようですが、
『ロック』という言い方が難しくしているように思えます。
実際オープンしているだけなので...。

要は$lockfileが存在している間は,プログラムは次の処理
(例えばログファイルの読み書き両用オープン)へ進まない
ようにしているだけっと理解しているんですけど,私は...。

どうでしょうか?ずっと聞きたかったことなんです,実は (^^;
最近は読んでるだけのTakでした。

ふじ [URL] [WriteDate : Sat Dec 16 17:06:07 2000]

> 1ユーザーにつき1CGIしか動作しないようになっているらしいです。
> #SERVER_SOFTWARE = Apache/1.3.9 (Unix) PHP/3.0.14
> #なんですが、そーいう設定ってできるもんなんですかね? 

CGIが所有者のユーザ権限で動くなら、
http://japache.infoscience.co.jp/japanese/manual/mod/core.html#rlimitnproc
これで可能でしょうか。(使ったことないけど)


>5 if (-e $lockfile) { sleep(1); }
>6 else {
>7  open(LOCK,">$lockfile") || 

これ、実は確実なロックにはなっていません。
ほぼ同時に2つのプロセス(AとBとします)が起動したとして、

・A が5行目で「ロックファイルなし」と判断、
・A が7行目で open を実行する**前に** B が5行目で「ロックファイルなし」と判断。
・A と B がどちらも7行目の open に成功。ロックされたものとして処理が始まる。

という事態に陥る可能性が(希ですが)ありえます。
これを防ぐには、mkdir (ディレクトリ作成) や symlink (シンボリックリンク作成)
等、作成実行と存在確認が同時にできる(すでに存在しているものを作成しようとすると失敗する)
処理でロック可能かを判断する必要があります。
open だと、すでにファイルがあっても成功しますので。

あとは flock 使うか。


わごな [MAIL] [URL] [WriteDate : Sat Dec 16 18:30:54 2000]

パキンズさん
>普通のアプリケーションはファイルロック(テーブルロック)より
>部分的なレコードロックを行う場合が多いように思えますし。 
しばらくレコードロックとかやってなかったんで
ファイルロックかけることしか考えてませんでした^_^;
おっしゃる通りですネ

ふじさん
今までmkdirを選んでる理由を考えたコトがありませんでした
勉強になります

ひょっとこ [WriteDate : Sat Dec 16 21:19:55 2000]

皆さん有り難うございます。
ロックファイル処理の知識が無だった私にとって、大変勉強になりました。まだまだ、CGIについて質問があるので、よろしくお願いします。

バギンズ [WriteDate : Sat Dec 16 22:09:29 2000]

>Takさん
>要は$lockfileが存在している間は,プログラムは次の処理 
>(例えばログファイルの読み書き両用オープン)へ進まない 
>ようにしているだけっと理解しているんですけど,私は...。 
それが、ロック用ファイルを使ったファイルロックです。
でも、ふじさんがおっしゃるように、それでは完全なロックにはなっていないのです。

>ふじさん
>CGIが所有者のユーザ権限で動くなら、 
http://japache.infoscience.co.jp/japanese/manual/mod/core.html#rlimitnproc 
>これで可能でしょうか。(使ったことないけど) 
教えていただきありがとうございます。m(_ _)m
そーいう設定が、Apacheにあるものなのかどうか、何か特殊な物をかましていたりするのかどうかが気にかかってました。

>あとは flock 使うか。 
私は、flockがいいです。
ファイルロックの為のflockだからってのもありますが、mkdirやsymlinkより速いからというのが本音です。
(まぁ、確実にロックできるのならなんでもいいのですが...)

Nobu3 [MAIL] [URL] [WriteDate : Sat Dec 16 23:51:44 2000]

蛇足ですが・・・。
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
も参考になると思います。
回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]