1

プログラムまたは OS がクラッシュした後に、アプリケーションが部分的に書き込まれたレコードを検出する方法を考えています。レコードはファイルに追加されるだけなので(上書きされることはありません)、書き込み中にクラッシュした場合、ファイル サイズが本来よりも小さくなることが保証されていますか? ファイルが追加モードではなく読み取り/書き込みモードで開かれた場合でも、書き込みが常にファイルの最後にある限り、これは保証されますか? 部分的な書き込みを検出するには、最後のレコードの予想されるサイズと位置を実際のファイル サイズと比較するだけで十分であるため、これによりクラッシュの回復が大幅に簡素化されます。

ランダムアクセス書き込みがファイルシステムによって並べ替えられる可能性があることは理解していますが、追加時にこれが発生する可能性があるかどうかについての情報を見つけるのに苦労しています. 順不同の追加では、ファイルシステムが(スパース)ファイルの末尾に「穴」を作成し、穴を超えてブロックを書き込み、その間のブロックを埋める必要があると思いますが、私はそれを望んでいますそのようなアプローチは非常に非効率的であるため、そのような方法でファイルシステムを実装する人は誰もいません。

別の問題は、新しいブロックをファイルに追加する前にディレクトリエントリのファイルサイズフィールドを更新するファイルシステムと、その間にOSがクラッシュする可能性があると思います。これは実際に起こりますか?(おそらく ext4?) それをすばやく検出する方法はありますか? (そして、ファイルのサイズに応じて存在するはずの書き込まれていないブロックを読み取ろうとするとどうなりますか?)

部分的な追加を検出する方法としてファイル サイズを使用する方法として、ディスク/フラッシュ ドライブによって実行される書き込みの並べ替えなど、他に何かありますか? 私のアプリケーションでこの種のドライブのトリックを補正できるとは思っていませんが、知っておくとよいでしょう。

4

1 に答える 1

2

記録を絶対に失わないことを確実にしたい場合は、ファイルの一貫したジャーナリングまたはトランザクション システムが必要です。

O_DIRECT [おそらくやりたくない]を設定するか、マーカーを使用して、ファイルが閉じています。メインファイルでそれを行うか、たとえば、「最後に書き込まれたレコード」を外部に記録するファイルを持つことができます。そのファイルを開いたり閉じたりしても、アプリがクラッシュしている限りは安全です。OS がクラッシュした場合 [または突然停止した場合 - 電源切断、ディスクのプラグが抜かれたなど]、すべての賭けは無効になります。

書き込みの並べ替えと書き込みキャッシュは、すべてのレベルで実行できます。C ライブラリ、OS、ファイルシステム モジュール、およびハードディスク/コントローラー自体はすべて、書き込みの並べ替えが可能です。

于 2013-01-14T19:16:59.227 に答える