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