1. 程式人生 > 其它 >linux平臺下的寫檔案重新整理

linux平臺下的寫檔案重新整理

c語言libc庫自帶的fflush和linux的sync、fsync、fdatasync,字面上都是重新整理緩衝區資料到磁碟(當然,fflush還可以重新整理緩衝區資料到標準輸入、輸出以及錯誤輸出)。下面就分析一下上面提到的四個函式的區別。

一、c語言fflush和linux的sync、fsync、fdatasync的區別

1.介面基本不同

  • fflush是libc庫中提供的函式,平臺無關,只有在你使用到c語言的標準檔案(FILE)操作時,才涉及fflush。
  • sync、fsync、fdatasync是系統提供的系統調,平臺相關。

2.原形

  • fflush接受一個引數FILE *. fflush(FILE *);
  • sync、fsync、fdatasync的函式原型如下(fd表示檔案描述符)。 sync(); fsync(int fd); fdatasync(int fd);

3.功能

  • fflush: 是把C語言FILE的緩衝區中要寫入檔案的內容刷到作業系統的寫入緩衝區中(其實是寫到核心的緩衝區,即 頁快取記憶體)。注意:FILE的緩衝區實際就是libc庫在使用者空間的棧上申請的一塊記憶體。
  • sync、fsync、fdatasync:是把核心的緩衝區(即 頁快取記憶體)中要寫到磁碟中的資料刷到磁碟上。 下面引用一個比較形象的流程示例: FILE緩衝-----fflush---------〉核心緩衝--------fsync-----〉磁碟

二、sync、fsync、fdatasync之間的區別

傳統的UNIX系統在核心中設有頁快取記憶體,磁碟I/O的資料一般都通過這個快取區。(所有增加快取的目的顯然都是協調兩個速度不匹配的操作或者裝置,這樣就會很大程度緩解慢裝置對快裝置的拖累。)當我們向檔案寫入資料時,核心通常會先將資料複製到頁告訴快取中,然後將這些快取頁的地址排入佇列,晚些時候再寫入磁碟。這種方式被稱為延遲寫

1、sync和fsync、fdatasync的區別

  • sync只是將頁快取記憶體中所有修改過的塊的地址排入寫入佇列,然後返回,他並不等待實際寫磁碟操作結束。
  • fsync、fdatasync只對引數fd指定的一個檔案起作用,並且等到寫磁碟結束才返回。 這兩個系統呼叫一般用於資料庫這樣的應用程式,這種應用需要確保修改過的塊立即寫到磁碟上。

2、fsync和fdatasync的區別

  • fsync不僅會講資料寫入磁碟上檔案的資料(data)部分,還會將要更改的檔案屬性也刷到磁碟上的檔案元資料(inode)部分。
  • fdatasync隻影響檔案的資料部分。