linux中的髒頁寫回

爲了減輕內存使用的壓力,除了用戶手動寫回髒頁之外,還有一些機制觸發髒頁寫回。算法

比方說設置定時器,按期寫回髒了好久的頁。函數

具體介紹下面的寫回機制,由於這種機制不像寫回髒了好久的頁的機制那樣被動。spa

wakeu_bdflush 複雜喚醒寫回的核心函數。線程

能觸發此函數條件,可能會是如下幾點中的一點會多:索引

1.用戶態進程調用sync強制寫回進程

2.grow_buffers()分配一個新的緩衝區頁失敗時 。此時的頁中緩衝區塊大小與要求的不一樣,所以要釋放掉。內存

3.頁框回收算法調用free_more_memoy()或try_to_free_page()     alloc_pages 分配器中就會調用後面這個函數回調函數

4.在內存池中分配元素失敗。 內存池是做爲動態分配失敗後的最後分配手段,基本上好像驅動這部分使用內存池較多。定時器

若是內存池分配都失敗,那就必定要觸發髒頁寫回了鏈表

 

因爲以上緣由,wakeu_bdflush 被喚醒。

只要此函數被喚醒,那麼只要存在髒頁就寫回,或是若是髒頁超過了必定的閾值,那麼設置被寫回髒頁數量,而後 喚醒pdflush_operation函數,這個函數負責在pdflush內核線程鏈表中選擇一個空閒的內核線程去執行。並去執行這個線程的回調函數。

回調函數整體的執行狀況就是掃描超級塊鏈表,若是超級塊所屬的索引節點有髒標記就寫回。並檢查髒頁框是否低於閾值,若是不是,繼續掃描下一個超級塊

相關文章
相關標籤/搜索