sync、fsync、fdatasyncの3つの関数とO_SYNCフラグビットの違い

1861 ワード

ほとんどのunix/linuxのディスクioへの書き込みはキャッシュによって行われます.基本的な原理は、データをファイルに書き込む場合、カーネルは通常、データをバッファの1つにコピーし、バッファがまだいっぱいでない場合はキューから排出しません.実際のI/O操作は、書き込みが完了するのを待つか、カーネルが他のディスクブロックデータを格納するためにバッファを再利用する必要がある場合に出力キューにバッファを配置し、キューの先頭に到達するまで待機します.遅延書き込みと呼ばれ、ディスクの書き込み回数を大幅に削減します.しかし、特別なアプリケーションを書かない場合は、アプリケーション層のデータをリアルタイムでディスクに書き込む必要があります.特に、信頼性の高いシステムでは、ディスクにタイムリーに書き込む必要があります.瞬時にシステム障害データがあっても安全にリカバリできます.sync、fsync、fdatasync関数があります.しかし、機能的にはこの3つの関数にはいくつかの違いがあります.
sync関数は、変更されたすべてのブロックバッファを書き込みキューに並べただけで、実際の書き込みディスク操作の終了を待つことはありません.通常updateと呼ばれるシステム・デーモン・プロセスは、sync関数を周期的に(一般的に30秒おきに)呼び出す.これにより、カーネルのブロックバッファを定期的に洗浄することが保証される.
fsync関数は、ファイル記述子filedesによって指定された単一のファイルにのみ機能し、ディスクの書き込み操作が終了してから戻ります.fsyncは、変更されたブロックを直ちにディスクに書き込む必要があるデータベースのようなアプリケーションに使用できます.
fdatasync関数はfsyncに似ていますが、ファイルのデータ部分にのみ影響します.データに加えて、fsyncはファイルのプロパティを同期的に更新します.
ここで特に説明する必要があるのは、現在のglibcにおけるfdatasync関数の実現がfsyncと同じであることです.
   
/* Synchronize at least the data part of a file with the underlying
   media.  */
int
fdatasync (int fildes)
{
  return fsync (fildes);
}
           O_sync   ,  write              。
   fsync   ,       
write(fd,string,len); //  write
fsync(fd);            //       
  fsync             ,   write             ,            ,            ,      ??
        ,    ,http://blog.csdn.net/cindy9902/article/details/5827183