fsync与fflush的关系和区别
read/write/fsync與fread/fwrite/fflush的關(guān)系和區(qū)別
read/write/fsync:
linux底層操作;
內(nèi)核調(diào)用, 涉及到進(jìn)程上下文的切換,即用戶態(tài)到核心態(tài)的轉(zhuǎn)換,這是個比較消耗性能的操作。
fread/fwrite/fflush:
c語言標(biāo)準(zhǔn)規(guī)定的io流操作,建立在read/write/fsync之上
在用戶層, 又增加了一層緩沖機(jī)制,用于減少內(nèi)核調(diào)用次數(shù),但是增加了一次內(nèi)存拷貝。
兩者之間的關(guān)系,見下圖:
補(bǔ)充:
對于輸入設(shè)備,調(diào)用fsync/fflush將清空相應(yīng)的緩沖區(qū),其內(nèi)數(shù)據(jù)將被丟棄;
對于輸出設(shè)備或磁盤文件,fflush只能保證數(shù)據(jù)到達(dá)內(nèi)核緩沖區(qū),并不能保證數(shù)據(jù)到達(dá)物理設(shè)備, 因此應(yīng)該在調(diào)用fflush后,調(diào)用fsync(fileno(stream)),確保數(shù)據(jù)存入磁盤。
————————————————————————————————
fflush函數(shù)和fsync函數(shù)對比如下:
1.fflush接受一個參數(shù)FILE *.
fflush(FILE *);
fflush是libc.a中提供的方法,是用來將流中未寫的數(shù)據(jù)傳送到內(nèi)核。如果參數(shù)為null,將導(dǎo)致所有流沖洗。
fsync接受的時一個Int型的文件描述符。
fsync(int fd);
fsync是系統(tǒng)提供的系統(tǒng)調(diào)用。將數(shù)據(jù)寫到磁盤上
2.fflush/fsync 功能區(qū)別
fflush:是把C庫中的緩沖調(diào)用write函數(shù)寫到磁盤[其實是寫到內(nèi)核的緩沖區(qū)]。
fsync:是把內(nèi)核緩沖刷到磁盤上。
c庫緩沖-----fflush---------〉內(nèi)核緩沖--------fsync-----〉磁盤
進(jìn)一步引申到sync()、fflush()、fsync()這3個函數(shù)的別
a、三者的用途不一樣:
sync,是同步整個系統(tǒng)的磁盤數(shù)據(jù)的.
fsync是同步打開的一個文件到緩沖區(qū)數(shù)據(jù)到磁盤上.
fflush是刷新打開的流的.
b、同樣是同步,但三者的同步等級不一樣:.
sync, 將緩沖區(qū)數(shù)據(jù)寫回磁盤, 保持同步.(無參數(shù))
fsync, 將緩沖區(qū)的數(shù)據(jù)寫到文件中.(有一個參數(shù) int fd)
fflush, 將文件流里未寫出的數(shù)據(jù)立刻寫出
總結(jié)
以上是生活随笔為你收集整理的fsync与fflush的关系和区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开封治疗卵巢早衰最好的医院推荐
- 下一篇: 第三套人民币值多少钱啊?