2011-09-18 15 views
3

ファイル/ファイルシステムの操作の順序が保証されているかどうかを知りたいと思います。ソフトウェアのクラッシュや例の停電のために -ファイルの操作順序の保証

lseek(fd,pos_a,SEEK_SET); 
write(fd,data_a,size_a); //< - Operation A 
lseek(fd,pos_b,SEEK_SET); 
write(fd,data_b,size_b); //< - Operation B 
lseek(fd,pos_c,SEEK_SET); 
write(fd,data_c,size_c); //< - Operation C 

このような私は、ファイルAの更新を行うことを、B、Cそして、いくつかの障害が発生する可能性があります。

は、私は、ファイル foo.datを持っていると私は、次のようにそれを更新し考えてみましょう。

実行された操作が同じ順序で行われるという保証はありますか?

すなわち、「AとC」のみ「B」のようなものか、「A」または「AとB」または「AとBとC」

でもないような状況のいずれかがないだろうと。

私がAとBの間で呼び出すと、fsync(fd)とAとCの間で同じであることがわかりますが、 も実際にはファイルシステム上にあることが保証されています。

私はデータの緩みに慣れていませんが、むしろその一貫性については気にしません。

POSIX規格では、アウトオブオーダー実行が保証されていますか?

ので:どのような保証があるよう

  • POSIXプラットフォームでは?
  • Windowsプラットフォームでは?
  • もし私が持つことができる保証がありません(fsync以外)?

答えて

3

これはwriteのためのどのようなPOSIXの義務である:通常のファイルへ

書き込み後は()が正常に戻ってきた:

  • を任意の成功読み込み()内の各バイト位置からその書き込みによって変更されたファイルは、そのバイト位置が再び変更されるまで、その位置のwrite()によって指定されたデータを返さなければなりません。

  • ファイル内の同じバイト位置へのその後の正常な書き込み()は、そのファイルデータを上書きします。

これは、あなたのデータは、すべてそのためには、ディスクをヒットする保証を与えるものではありません。実装は、アプリケーションが「参照する」ものが上記の2つのステートメントと一貫している限り、必要なものすべてを物理的な書き込みに並べ替えることができます。

実際には、カーネル、さらにはディスクサブシステム(たとえばSANなど)でも書き込みを再注文できます(パフォーマンス上の理由から)。

したがって、一貫性のための書き込み呼び出しの順序に頼ることはできません。あなたはf[data]sync秒必要です。

PostgreSQLメーリングリストの興味深いメールスレッド:POSIX file updates。データベースがどのようにI/Oを処理するかについては、このタイプの問題について学ぶのに最適です。

(申し訳ありませんが、この点でのWindowsのことは知らない。)

+0

私はあなたの答えは、私はこの文書を読んで作られたことを追加したい:http://developer.postgresql.org/pgdocs/postgres/ wal.htmlと "魔法"の解決策がないことを理解する。私はちょうどfsyncをスマートな方法で使う必要があります。 – Artyom

関連する問題