6

fsyncのようなシステムコールを使用することがいつ役立つかについて、基本的な質問をしたいと思います。私は初心者で、ファイルに書き込むには書き込みで十分であり、書き込みを使用するサンプルは実際に最後にファイルに書き込むという印象を常に持っていました。

では、fsyncのようなシステムコールの目的は何ですか?

いくつかの背景を提供するために、私はBerkeley DBライブラリバージョン5.1.19を使用しており、fsync()のコストと単なる書き込みのコストについて多くの話があります。それが私が疑問に思っている理由です。

4

1 に答える 1

14

バッファリングのレイヤーと考えてください。

fopenおよびのような標準のC呼び出しに精通している場合はfprintf、Cランタイムライブラリ自体で発生するバッファリングにすでに注意している必要があります。

これらのバッファをフラッシュする方法fflushは、情報がCランタイムライブラリからOS(または周囲の環境)に確実に渡されるようにすることです。

ただし、OSに搭載されているからといって、ディスク上にあるとは限りません。OS内でもバッファリングされる可能性があります。

これfsyncが処理され、OSバッファ内のものが物理的にディスクに書き込まれるようにします。

通常、この種の操作はロギングライブラリで見られます。

fprintf (myFileHandle, "something\n");  // output it
fflush (myFileHandle);                  // flush to OS
fsync (fileno (myFileHandle));          // flush to disk

filenoは、特定のファイルハンドルの基になるintファイル記述子を提供する関数であり、記述子上で最終レベルのフラッシュを実行します。FILE*fsync

ディスクの書き込みは通常、メモリ内の転送よりもかなり遅いため、これは比較的コストのかかる操作です

ライブラリのロギングだけでなく、もう1つのユースケースがこの動作に役立つ場合があります。それが何だったか思い出せるか見てみましょう。はい、それだけです。データベース!BerzerkelyDBのように。データがディスク上にあることを確認したい場合、ACID要件を満たすためのかなり便利な機能:-)

于 2012-04-29T09:39:09.120 に答える