C言語関係掲示板

過去ログ

No.549.同じファイルに2つのプロセスで同時に書き込んだ場合

[戻る] [ホームページ]
No.4867

同じファイルに2つのプロセスで同時に書き込んだ場合
投稿者---梵(2003/01/31 18:12:40)


2つのプロセスを立ち上げ、同じファイルをそれぞれのプロセスが同時に
書き込んだ場合、その動作はどのようになるのでしょうか?


No.4897

Re:同じファイルに2つのプロセスで同時に書き込んだ場合
投稿者---stosd(2003/02/01 12:32:51)


対象のOSをWindowsと仮定します。環境を詳しく教えてくれれば的確なレスを付けてもらえると思います。

WindowsのようなプリエンプティブOSの場合は、各プロセスやスレッドは時分割で動作しています。つまり、平行して動作しているように見えるプロセスにも優先順位が存在し、微小な時間で順番に動いています。2つのプロセスが同時に同じファイルへ出力すると、動作の優先順位に従ったデータの並びになります。



No.4945

Re:同じファイルに2つのプロセスで同時に書き込んだ場合
投稿者---梵(2003/02/03 16:01:34)


返信ありがとうございます。
OSはRedhatLinux7.2を使用しております。
この場合でも同じなのでしょうか?

No.4954

Re:同じファイルに2つのプロセスで同時に書き込んだ場合
投稿者---kikk(2003/02/03 19:09:30)


ども。


わりとOS側の話のような気もしますが、個別のプロセスの実装にも
関係しますね。結果としていくつかの状況が考えられます。

1. 競合を検出し、両方とも書き込まない
2. 競合を検出し、どちらかのみ書き込みを行う
  (書き込み中のほう、完全に同時なら優先度の高いほう)
3. 競合を検出し、何らかの規則に従い、順に書き込みを行う
4. その他。競合を無視し、両方とも書き込みを行う等

* マルチプロセッサ環境の場合、本当に同時に書き込みが発生する可能性が
あります。

問題点は主に下記の2つでしょう。

ひとつはOSないしプロセスが競合を検出できるかという点です。
単純なのは書き込みが成功したかどうか、失敗したなら原因を調べる、
というものでしょう。まあ、OSレベルは基本的に立ち入れませんし、
プログラムレベルでも実現手段はたぶん提供されているので、
そう難しい話ではありません。

もうひとつは、それぞれのプロセスが個別にファイル内のデータ(の一部)
を保持していた場合、後に書き込んだ内容のみが反映される可能性がある
ことです。これは上記3.(と4.)の時に起こりうることで、各プロセスからは
それぞれ何の問題もなく書き込めたように見えます。要はプロセスレベルで
他のプロセスによるファイル更新を気にする必要があるということです。
こちらは「同時に」という条件がなくてもおこりえます。

以上は一般論で、実際の振る舞いは、各OSおよび各プロセスの実装に
よります。より詳しい話は「排他制御(排他処理)」とか「クリティカルセクション」
等で検索するか、対象のOSのMLや掲示板をあたってください。


プログラミングの話(どう対処するか)であれば、上記の検索結果のほかに
CGI関連に具体的な実例があると思います。C言語のものは少ないかも
しれませんが。あとはUNIX系なら、flock()とかlockf()あたりを(manで)調べて
ください。


では。

No.4989

Re:同じファイルに2つのプロセスで同時に書き込んだ場合
投稿者---梵(2003/02/04 19:38:40)


ありがとうございました。
参考にさせていただきます。