1. 程式人生 > >深入淺出記憶體管理--對於lowmem_reserve的理解

深入淺出記憶體管理--對於lowmem_reserve的理解

每個記憶體管理區(zone)都有一個lowmem_reserve欄位,它代表本管理區預留的實體記憶體大小。所謂預留,那就是說肯定還是有用的,只是用的時機不同。

之前的文章中由介紹過water mark水位值,系統中已經為每個管理區(zone)記憶體大小設定了三個水位值了,分別時WMARK_HIGH/WMARK_LOW/WMARK_MIN。怎麼這裡又多出來一個lowmem_reserve?

在記憶體分配時,分配器會根據不同的水位執行不同的動作,首先記憶體分配器會掃描所有zonelist中的管理區,按照zonelist中的分配順序依次檢查管理區中能否分配對應的記憶體。這幾個值都是用來確定最終要從哪個管理區來分配記憶體這個問題的。

1.首先以low water mark位標準來迴圈檢測一遍,當發現zonelist中存在空閒記憶體在low water mark之上的管理區時,我們優先就從它開始分配。
2.如果發現所有管理區的記憶體都已經低於low water mark了,那麼進一步利用min water mark來進行迴圈檢測,尋找空閒記憶體在min water mark之上的管理區。
3.當我們發現所有的管理區的記憶體都已經低於min water mark了,那麼此時系統的空閒記憶體真的時已經很少了,此時如果申請記憶體的上下文是一個不允許中斷或者延遲的場景,那麼才會動用我們最後的那一部分,也就是上面利用lowmem_reserve所保留的部分。此時不在檢測水位值而再次去申請記憶體,假如在lowmem_reserve保留的部分依然申請不到,就返回NULL。
4.如果我們的申請記憶體的上下文發現可以允許延遲或者睡眠,那麼當前申請記憶體的程序將被阻塞,開始進行直接記憶體回收,這是核心回收機制的一種方式,呼叫函式為try_to_free_pages。
5.回收操作返回後,又會進一步判斷水位來進行申請,至於後續的處理,要看申請時傳入的標誌,來決定是否再次進行回收等操作,或者直接返回NULL,申請失敗。
6.當然隨著我們不停的檢測,中間在第1步迴圈檢測時就會觸發系統的頁面回收機制了,觸發機制就是喚醒kswapd核心執行緒來對頁框進行回收。當回收的頁面能滿足我們需求時,在第2步就會返回我們的需求了,我們的函式就不會執行到第3步驟了。