linuxIO刷新机制fsync和fdatasync详细解释
前言:
Linux,unix在內核中設有 緩沖區(qū)快速緩沖或頁面快速緩沖。大多數(shù)磁盤I/O都通過緩沖進行,採用延遲寫技術。
sync:將全部改動過的快緩存區(qū)排入寫隊列。然后返回。并不等待實際寫磁盤操作結束
fsync:僅僅對有文件描寫敘述符制定的單一文件起作用,而且等待些磁盤操作結束,然后返回。
fdatasync:類似fsync,但它僅僅影響文件的數(shù)據部分。
fsync還會同步更新文件的屬性。
fflush:標準I/O函數(shù)(如:fread,fwrite)會在內存建立緩沖。該函數(shù)刷新內存緩沖。將內容寫入內核緩沖。要想將其寫入磁盤,還須要調用fsync。
(先調用fflush后調用fsync。否則不起作用)。
前面介紹函數(shù)write()時,我們覺得該函數(shù)一旦返回。數(shù)據便已經寫到了文件里。
可是這樣的概念僅僅是宏觀上的。實際上,操作系統(tǒng)實現(xiàn)某些文件I/O時(如磁盤文件)。為了保證I/O的效率。在內核一般會用到一片專門的區(qū)域(內存或獨立的I/O地址空間)作為I/O數(shù)據緩沖區(qū)。
應用程序能夠將這片內核區(qū)域看成是I/O數(shù)據的一個高速中轉站(圖3-5)。當調用write()函數(shù)寫出數(shù)據時。數(shù)據一旦寫到該緩沖區(qū)。函數(shù)便馬上返回。此時寫出的數(shù)據能夠用read()讀回,也能夠被其它進程讀到,可是并不意味著它們已經被寫到了外部永久存儲介質上,即使調用close()關閉文件后也可能如此。內核I/O數(shù)據緩沖區(qū)中的數(shù)據僅僅在適當?shù)臅r候才由操作系統(tǒng)啟動外設進行傳輸,真正的傳輸動作由獨立于CPU的外設控制器或者外設本身(Linux稱之為DMA引擎)來完畢。因此。從數(shù)據被實際寫到磁盤的角度來看,用write()寫出的文件數(shù)據與外部存儲設備并非全然同步的。在現(xiàn)代計算機系統(tǒng)中,這樣的不同步的時間間隔非常短,一般僅僅有幾秒或十幾秒。詳細取決于寫出的數(shù)據量和I/O數(shù)據緩沖區(qū)的狀態(tài)。雖然不同步的時間間隔非常短,可是假設在此期間發(fā)生掉電或者系統(tǒng)崩潰。則會導致所寫數(shù)據來不及寫至磁盤而丟失的情況。
因為現(xiàn)代計算機通常都十分穩(wěn)定可靠。出現(xiàn)掉電或系統(tǒng)崩潰的情況極少。因此多數(shù)應用在寫文件時能夠忽略這種瞬間不同步情況。可是,有些應用存在著這種一些同步點,在這些點上所寫的數(shù)據很關鍵。或者必須及時保證文件的一致性。為了防備萬一。這些應用須要確保全部寫出的數(shù)據都已經傳送到了外部永久存儲介質上。
為此,UNIX提供了兩種手段來實現(xiàn)這一目的。當中一種方法是對文件設置O_SYNC標志(表3-1)。這樣能夠保證每次寫數(shù)據都直接寫到磁盤。假設設置了這個標志,write()調用將直到數(shù)據已安全地寫到磁盤后(而不不過系統(tǒng)的I/O緩沖區(qū))才返回。可是這樣每次寫數(shù)據都保持同步的效率比較低。
還有一種方法是僅僅在須要時調用函數(shù)fsync()或者fdatasync()。
#include <unistd.h>
int fsync(int fildes);
int fdatasync(int fildes)
fsync()強制與描寫敘述字fildes相連文件的全部改動過的數(shù)據(包含核內I/O緩沖區(qū)中的數(shù)據)傳送到外部永久介質。即刷新fildes給出的文件的全部信息。調用 fsync()的進程將堵塞直到設備報告?zhèn)魉鸵呀浲戤叀_@里“全部改動過的數(shù)據”包含用戶寫出的數(shù)據以及文件本身的特征數(shù)據(4.1.1節(jié)和表4-1)。如文件的訪問時間、改動時間、文件的屬主等。
fdatasync()的功能與fsync()類似,僅僅是它僅僅強制傳送用戶已寫出的數(shù)據至物理存儲設備,不包含文件本身的特征數(shù)據。這樣能夠適當降低文件刷新時的數(shù)據傳送量。只是有的系統(tǒng)并不支持fdatasync()。在這樣的系統(tǒng)上,fdatasync()等價于fsync()。
一個程序在寫出數(shù)據之后,假設繼續(xù)進行興許處理之前要求確保所寫數(shù)據已寫到磁盤,則應當調用fsync()。比如,數(shù)據庫應用一般會在調用write()保存關鍵交易數(shù)據的同一時候也調用fsync()。
我們在2.7節(jié)曾討論了標準I/O流緩沖區(qū)的問題以及函數(shù)fflush()。那么,這兩個緩沖區(qū)有何不同?回答是。內核I/O緩沖區(qū)是由操作系統(tǒng)管理的空間。而流緩沖區(qū)是由標準I/O庫管理的用戶空間。fflush()僅僅刷新位于用戶空間中的流緩沖區(qū)。fflush()返回后,僅僅保證數(shù)據已不在流緩沖區(qū)中,并不保證它們一定被寫到了磁盤。此時,從流緩沖區(qū)刷新的數(shù)據可能已被寫至磁盤,也可能還待在內核I/O緩沖區(qū)中。要確保流I/O寫出的數(shù)它已被寫入磁盤,然后調用fflush()還應當之后調用的fsync()。
版權聲明:本文博客原創(chuàng)文章,博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的linuxIO刷新机制fsync和fdatasync详细解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 颖儿产后晒减肥餐(颖儿晒月子减肥餐)
- 下一篇: 白木香的鉴别(白木香鉴别方法举例)