同時停電が実際に問題にならない場合、実際にどのくらいの頻度でsyncまたはfsyncジョブを実行する必要があるかを把握しようとしています。私は特定のファイルシステムが提供する機能ではなく、LinuxカーネルやPosixまたはglibc APIが実行時に提供できることを保証しています。
関数a()がファイルを開いてデータを書き込んだ後、すべてデフォルトのブロックIOを使用してファイルを閉じると、ディスクに明示的に同期せずにファイルを開くための後で呼び出しのためにそのデータが保証されますか?ディスクキャッシュまたはVFS層は、後で読み取るためにそのファイル名を開くためにb()関数を呼び出すと、fsync()が開かれる前にsync()が呼び出されたときと同じデータが表示されることを保証しますか?それとも、別のコードブロックから読み取るデータに対して常に同期を呼び出す必要がありますか?
答え1
POSIX はread
a 以降に発生するすべてのイベントがwrite
新しいデータを表示できるようにします。 ~から基準:
read()
ファイルデータのaがwrite()
データのaの後に発生することが(何らかの方法で)実証できる場合は、write()
他のプロセスで呼び出しが行われてもそれを反映する必要があります。同じファイルの場所に対する複数の書き込み操作にも同様の要件が適用されます。
fsync
電話する必要はありません。 LinuxやUnixの多くのプログラムでは、正確性と一貫性を確保するためにこれが必要であるため、正しく実装できないのは深刻な欠陥です。