1、sync函數
sync函數只是將所有修改過的塊緩衝區排入寫隊列,然後就返回,它並不等待實際寫磁盤操作結束。
通常稱爲update的系統守護進程會週期性地(一般每隔30秒)調用sync函數。這就保證了定期沖洗內核的塊緩衝區。命令sync(1)也調用sync函數。
2、fsync函數
fsync函數只對由文件描述符filedes指定的單一文件起作用,並且等待寫磁盤操作結束,然後返回。
fsync可用於數據庫這樣的應用程序,這種應用程序需要確保將修改過的塊立即寫到磁盤上。
3、fdatasync函數
fdatasync函數類似於fsync,但它隻影響文件的數據部分。而除數據外,fsync還會同步更新文件的屬性。
對於提供事務支持的數據庫,在事務提交時,都要確保事務日誌(包含該事務所有的修改操作以及一個提交記錄)完全寫到硬盤上,才認定事務提交成功並返回給應用層。
4、fflush:標準IO函數(如fread,fwrite等)會在內存中建立緩衝,該函數刷新內存緩衝,將內容寫入內核緩衝,要想將其真正寫入磁盤,還需要調用fsync。(即先調用fflush然後再調用fsync,否則不會起作用)。fflush以指定的文件流描述符爲參數(對應以fopen等函數打開的文件流),僅僅是把上層緩衝區中的數據刷新到內核緩衝區就返回,
因此相對於fsync而言不是很安全,還需要再調用一下fsync來把數據真正寫入硬盤。
fsync的性能問題,與fdatasync
"Unfortunately fsync() will always initialize two write operations : one for the newly written data and another one in order to update the modification time stored in the inode. If the modification time is not a part of the transaction concept fdatasync() can be used to avoid unnecessary inode disk write operations."