ファイルシステムプログラミングでは、 fsync()とfdatasync()は、ファイルデータがディスクに持続するようにするための2つのシステム呼び出しです。機能は類似しており、両方ともファイルのバッファデータをディスクに記述するために使用されますが、実行の特定のコンテンツとパフォーマンスは異なります。この記事では、これら2つのシステム呼び出しの違いと、さまざまなシナリオでそれらを使用する方法を詳細に説明します。
fsync()
FSYNC()関数は、指定されたファイル記述子にディスクに対応するファイルデータとメタデータ(変更時間、許可など)を同期するために使用されます。これにより、ファイルのすべてのデータと関連するメタデータがディスク上の最新のコピーを持つことが保証されます。 fsync()を呼び出すと、すべてのデータがディスクに書き込まれ、メタデータの更新が完了するまでオペレーティングシステムが待機します。
fdatasync()
fdatasync()関数はより簡潔であり、ファイル(メタデータではない)の実際のデータがディスクに書き込まれることのみが保証されます。言い換えれば、 fdatasync()はファイルコンテンツの整合性を保証しますが、ファイルメタデータの更新を強制しません。変更時間やアクセス許可などの情報は同期できない場合があります。
ファイルのコンテンツに加えて、 FSYNC()は、ファイルのメタデータ(変更時間、許可など)がディスクに同期されることも保証します。
fdatasync()は、ファイルコンテンツのデータ同期にのみ焦点を当てており、ファイルメタデータの更新を気にしません。
fdatasync()は同期メタデータを必要としないため、比較的迅速に実行されます。対照的に、 fsync()はメタデータを書くのを待つ必要があります。これは通常、fdatasync()よりも遅いです。メタデータの更新ではなくデータコンテンツのみを気にするアプリケーションの場合、 fdatasync()を使用する方が効率的です。
FSYNC()は、ファイルのすべての情報を更新するために、不必要なシステムコールオーバーヘッドを増加させる可能性があります。
fdatasync()はデータの同期のみを実行するため、特に大量のデータの場合、パフォーマンスを改善できるデータの場合は安価です。
アプリケーションがファイルのコンテンツの永続性のみを気にし、ファイルのメタデータを更新する必要がない場合、 fdatasync()がより良い選択です。たとえば、ログファイルの書き込みなどのシナリオの場合、ファイルのメタデータを変更するのではなく、ログのコンテンツがディスクに書き込まれるかどうかについてより心配しています。
アプリケーションで、ファイルの完全な情報(データとメタデータを含む)をディスクに同期する必要がある場合、 FSYNC()を使用する必要があります。たとえば、データベースシステムまたはファイル管理システムでは、ファイルコンテンツやタイムスタンプなどのメタデータの一貫性を確保する必要がある場合があります。
パフォーマンスが重要な要素であり、ファイルのメタデータの更新が重要ではない場合、 FDATASYNC()がより適切な選択肢です。たとえば、バッチデータ処理または大きなファイルの書き込みの場合、 fdatasync()を使用すると、効率が向上し、不必要なオーバーヘッドを減らすことができます。
fsync()とfdatasync()の両方が、ファイルのデータをディスクに記述してファイルの持続性を確保するために使用されますが、同期の範囲は異なります。
fsync()は同時にデータとメタデータを同期させますが、 fdatasync()はデータのみを同期し、メタデータは更新されない場合があります。
高性能要件を備えたシナリオでは、メタデータの同期が必要ない場合、 FDATASYNC()を使用するとパフォーマンスが向上します。
FSYNC()を使用することがより適切であるため、データとメタデータが一貫している必要があるシナリオでは、より適切です。
使用する機能を選択する場合、特定のアプリケーションシナリオとデータの整合性の要件に基づいて決定を下す必要があります。