3.13 sync、fsync和fdatasync函式
傳統的UNIX實現在核心中設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟I/O都透過緩衝進行。當將資料寫入檔案時,核心通常先將該資料複製到其中一個緩衝區中,如果該緩衝區尚未寫滿,則並不將其排入輸出佇列,而是等待其寫滿或者當核心需要重用該緩衝區以便存放其他磁碟塊資料時,再將該緩衝排入輸出佇列,然後待其到達隊首時,才進行實際的I/O操作。這種輸出方式被稱為延遲寫(delayed write)(Bach [1986]第3章詳細討論了緩衝區快取記憶體)。
延遲寫減少了磁碟讀寫次數,但是卻降低了檔案內容的更新速度,使得欲寫到檔案中的資料在一段時間內並沒有寫到磁碟上。當系統發生故障時,這種延遲可能造成檔案更新內容的丟失。為了保證磁碟上實際檔案系統與緩衝區快取記憶體中內容的一致性,UNIX系統提供了sync、fsync和fdatasync三個函式。
sync函式只是將所有修改過的塊緩衝區排入寫佇列,然後就返回,它並不等待實際寫磁碟操作結束。
通常稱為update的系統守護程式會週期性地(一般每隔30秒)呼叫sync函式。這就保證了定期沖洗核心的塊緩衝區。命令sync(1)也呼叫sync函式。
fsync函式只對由檔案描述符filedes指定的單一檔案起作用,並且等待寫磁碟操作結束,然後返回。fsync可用於資料庫這樣的應用程式,這種應用程式需要確保將修改過的塊立即寫到磁碟上。
fdatasync函式類似於fsync,但它隻影響檔案的資料部分。而除資料外,fsync還會同步更新檔案的屬性。
本書說明的所有四種平臺都支援sync和fsync函式。但是,FreeBSD 5.2.1和Mac OS X 10.3並不支援fdatasync。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82392/viewspace-144739/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- linux 同步IO: sync、fsync與fdatasyncLinux
- Flutter非同步程式設計-sync*和async*生成器函式Flutter非同步程式設計函式
- 深入理解Fsync
- vue sync 函式同步執行 待請求確認Vue函式
- 3.13
- 字元函式、數字函式和日期函式字元函式
- 類函式和物件函式 PHP函式物件PHP
- 函式防抖和函式節流函式
- 函式基礎和函式引數函式
- Rust中的into函式和from函式Rust函式
- Python strip函式和split函式Python函式
- ascii函式和substr函式的用法ASCII函式
- 指標函式 和 函式指標指標函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- 函式宣告和函式表示式的區別函式
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- StretchBlt函式和BitBlt函式的區別和用法函式
- Kotlin之“with”函式和“apply”函式Kotlin函式APP
- JS函式節流和函式防抖JS函式
- gethostbyname函式和getservbyname函式的應用函式
- Socket send函式和recv函式詳解函式
- prop()函式和attr()函式的區別函式
- ES6-Generator 函式 和 async 函式函式
- JS閉包函式和回撥函式JS函式
- Python私有函式和公開函式Python函式
- C++的函式和模板函式 (轉)C++函式
- strcpy函式和memcpy函式的區別函式memcpy
- 函式表示式和函式宣告簡單介紹函式
- Python技法3:匿名函式、回撥函式和高階函式Python函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 電競顯示器G-sync和Free-sync區別對比:G-SYNC和Free Sync有什麼優缺點?
- JavaScript中的compose函式和pipe函式JavaScript函式
- 函式柯里化和偏函式應用函式
- java自定義equals函式和hashCode函式Java函式
- 【Spark篇】---SparkSql之UDF函式和UDAF函式SparkSQL函式
- jquery position()函式和offset()函式的區別jQuery函式
- # 普通函式和箭頭函式的區別函式
- iOS-GCD常用函式和柵欄函式iOSGC函式