爲了減輕內存使用的壓力,除了用戶手動寫回髒頁之外,還有一些機制觸發髒頁寫回。算法
比方說設置定時器,按期寫回髒了好久的頁。函數
具體介紹下面的寫回機制,由於這種機制不像寫回髒了好久的頁的機制那樣被動。spa
wakeu_bdflush 複雜喚醒寫回的核心函數。線程
能觸發此函數條件,可能會是如下幾點中的一點會多:索引
1.用戶態進程調用sync強制寫回進程
2.grow_buffers()分配一個新的緩衝區頁失敗時 。此時的頁中緩衝區塊大小與要求的不一樣,所以要釋放掉。內存
3.頁框回收算法調用free_more_memoy()或try_to_free_page() alloc_pages 分配器中就會調用後面這個函數回調函數
4.在內存池中分配元素失敗。 內存池是做爲動態分配失敗後的最後分配手段,基本上好像驅動這部分使用內存池較多。定時器
若是內存池分配都失敗,那就必定要觸發髒頁寫回了鏈表
因爲以上緣由,wakeu_bdflush 被喚醒。
只要此函數被喚醒,那麼只要存在髒頁就寫回,或是若是髒頁超過了必定的閾值,那麼設置被寫回髒頁數量,而後 喚醒pdflush_operation函數,這個函數負責在pdflush內核線程鏈表中選擇一個空閒的內核線程去執行。並去執行這個線程的回調函數。
回調函數整體的執行狀況就是掃描超級塊鏈表,若是超級塊所屬的索引節點有髒標記就寫回。並檢查髒頁框是否低於閾值,若是不是,繼續掃描下一個超級塊