Linux檔案寫快取

2021-10-03 11:37:03 字數 1589 閱讀 1649

1.應用發起的寫操作何時將內容真正寫入檔案?

2.如何保證在異常掉電的情況下,應用寫入檔案的資料不丟失?

應用對檔案的操作一般基於標準庫函式fopen、fread、fwrite、fclose實現,本文主要是針對fwrite操作的闡述。當應用呼叫fwrite向檔案中寫入資料時,實際上經過使用者空間和核心空間中的兩層緩衝區,如下圖所示:

回寫條件時,頁快取中的資料才會被實際的刷會磁碟。在這種情況下,只有當使用者緩衝區滿和核心快取達到回寫條件同時滿足時,通過fwrite寫入檔案的資料才會被刷入磁碟。否則,在以上任一階段發生掉電,資料將不會被寫入檔案,即資料丟失。

為保證資料寫入檔案,在異常掉電的情況下不丟失資料,可在fwrite之後呼叫fflush強制將使用者緩衝中的資料轉移到核心快取;在fflush之後呼叫fsync將處於核心快取中的資料刷回flash。此外,需注意的是fseek、fclose會隱式的呼叫fflush。

對於使用者空間的應用來說,檔案資料可以理解為儲存於一段連續的記憶體之中,對於資料的索引為資料在該段記憶體中的偏移;對於核心快取來說,檔案資料以頁為單位儲存,所有的頁組成一棵基數樹,此時對檔案資料的索引為對基數樹的葉子節點的索引;核心中的頁通過bufferhead與flash中的block一一對映(不同檔案系統的對映過程不同,這裡暫時這麼抽象的理解),如下圖所示:

實際上磁碟flash對檔案的索引包含兩個部分:一部分是純資料data;另一部分是儲存檔案大小、屬性等資訊的metadata。兩部分相互匹配才能完整的描述乙個檔案。如下為data和metadata的資料流向圖:

metadata始終儲存在核心快取之中,當使用者緩衝的data被轉移至核心快取時,metadata將同步發生改變,當然metadata亦可直接被系統呼叫修改。當呼叫fsync時,處於核心快取中的metadata和data被刷回flash。

此外,應用程式也可以直接呼叫與fwrite對應的系統呼叫write對檔案進行操作。與fwrite不同的是write直接將資料data寫入到核心快取,不過仍然需要借用fsync才能將資料實際寫回flash。

對於fsync之外,linux中還包括sync和fdatasync兩個系統呼叫:fsync的作用是將指定檔案的metadata和data均刷回flash,並等待刷回操作完成後才返回;fdatasync只有在必要情況下才刷回metadata,否則一般只刷回data部分,同樣需要等待刷回操作完成,此時的必要情況一般是指當檔案的size發生變化時,當只有檔案的ctime和mtime發生改變時,沒必要刷回metadata;而sync操作是針對所有處於核心快取中的檔案,但是該操作並不等待刷回操作的完成,而只是發起刷回的動作,即如果此時在sync呼叫返回之後掉電,並不能保證資料一定刷回到了flash。

1、核心快取的回寫條件?

3、當以fopen(w+)的形式建立乙個檔案,呼叫fflush和fsync之後,該檔案是否一定存在?

檔案快取回寫簡述

1檔案快取回寫的時機 1 週期性回寫,週期為dirty writeback interval,預設5s 2 塊裝置首次出現髒資料 3 髒頁達到限額,包括dirty bytes dirty background bytes dirty ratio dirty background ratio 4 剩餘...

檔案快取 寫與讀

1.先判斷是否有sdcard以及許可權environment.getexternalstoragestate equals environment.media mounted 2.得到sdcard路徑 mnt sdcard environment.getexternalstoragedirector...

linux寫快取調優

我們在磁碟寫操作持續繁忙的伺服器上曾經碰到乙個特殊的效能問題。每隔 30 秒,伺服器就會遇到磁碟寫活動高峰,導致請求處理延遲非常大 超過3秒 後來上網查了一下資料,通過調整核心引數,將寫活動的高峰分布成頻繁的多次寫,每次寫入的資料比較少。這樣可以把尖峰的寫操作削平成多次寫操作。以這種方式執行的效率比...