bitmap
在磁陣處理寫訪問請求時,呼叫
bitmap_startwrite
設定bitmap
記憶體的資訊,包括記憶體中的
bitmap
結構,以及記憶體中
bitmap
磁碟檔案的對映
filemap
;在磁陣實際將寫請求實際提交給子裝置前,呼叫
bitmap_unplug
將bitmap
資訊寫入磁碟。
除這兩個函式外,
bitmap_start_sync
,bitmap_end_sync
,bitmap_endwrite
等函式也和
bitmap
的一些標誌設定有關。
bitmap_startwrite
該函式在磁陣處理訪問請求時(
make_request
)呼叫。函式主要完成:
1.如果是延遲寫,則增加延遲寫計數
2.由於乙個寫操作涉及的資料段可能對應多個
bitmap
,對於每個這樣的
bitmap:a)
獲取該bitmap
的記憶體結構,即
bp陣列指向的內容
b)如果該
bitmap
的counter
達到最大值,說明磁陣上該資料區正在進行的寫訪問已經太多,磁陣等待太久,此時需要啟動裝置的佇列處理。
c)如果
bitmap
上沒有正在進行的寫操作
(count=0)
,設定filemap
的對應bit
。將記憶體
bitmap
結構count
直接設定為2。
d)bitmap
記憶體結構
count
累加。(也就是寫操作計數為
0時,表示沒有寫入操作;為1,
2都是特殊狀態,
3表示有乙個寫入,依次類推)
bitmap_unplug
遍歷bitmap
的所有filemap
頁,如有標記為臟的頁(
bitmap_page_dirty
,bit
置位時設定),或者為需要寫入的(
bitmap_page_needwrite
,bit
清除時設定),則將該頁寫入磁碟。
如果有髒頁,則等待寫入結束後返回。
注意這裡如果只有
bitmap_page_needwrite
標記的頁,是不需要等待的,因為
bit的清除並不是很關鍵,即使這個資訊丟失,最多不過是多餘的同步操作而已,沒有***。而
bit設定則需要可靠寫入磁碟後方可進行磁陣條帶的寫入,否則在條帶資料寫入磁碟過程中,
bitmap
寫入磁碟前,磁陣出現異常,則可能導致資料不一致而
bitmap
不能發覺。
bitmap_start_sync
在磁陣同步操作開始時,呼叫該函式。
這個函式獲取
bitmap
的記憶體結構,如果
need
標誌或者
resync
標誌被設定,就認為該資料塊需要同步,此時如果磁陣工作完好,則清除
need
標誌,設定
resync
標誌;如果
need
和resync
都沒有設定,則認為該資料塊不需要同步。
bitmap_end_sync
磁陣同步完成後,呼叫該函式。
這個函式獲取
bitmap
的記憶體結構,如果
resync
標誌被設定,則清除該標誌。如果同步是失敗的,則設定
need
位。如果
count小於3
,則設定該頁
file_attr
的bitmap_page_clean
(下文簡寫為
clean
),表示該頁存在需要清除的
bit位。
bitmap_endwrite
寫操作完成後,取出對應資料段的
bitmap
記憶體結構,
count
遞減,如果
count小於3
,則設定對應
filemap
頁的clean
屬性。如果寫失敗,則設定對應
bitmap
的need
標誌。
MD中的bitmap 開篇
從csdn上得到很多資料,貢獻不多,很慚愧。由於工作關係,近期學習一些linux 軟體raid相關的 網上找到一些相關的介紹內容,對於bitmap機制介紹得較少,正好看到這塊,在共享精神感召下,咱不揣淺薄,也把自己的一些學習情況記錄下來,希望大家多多指正。在raid1 raid5 等存在資料冗餘的磁...
MD中的bitmap(3) Bitmap初始化
bitmap create 完成bitmap 的初始化,該函式在磁陣啟動時或者使用者設定 bitmap 檔案時被呼叫,主要完成 bitmap 從磁碟到記憶體的載入 1.前面說過,bitmap 檔案在磁碟上可能有兩個位置,分別以檔案指標或者與超級塊之間的偏移來指定。2.讀入超級塊,注意 bitmap ...
Redis中bitmap的妙用
在redis中我們經常用到set,get等命令,細心的你有沒有發現,還有幾個相似的命令叫setbit,getbit,它們是用來幹嘛的?就是通過乙個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成乙個byte,所以bitmap本身會極大的節省儲存空間。r...