1. 程式人生 > >Linux記憶體管理之三 頁的分配和釋放

Linux記憶體管理之三 頁的分配和釋放

如上圖,Linux分配頁時,只能分配2^n個頁。核心維護MAX_ORDER個連結串列,每個連結串列記錄著連續的空閒頁。第一個連結串列中的每一項為1個空閒頁,第二個連結串列中的每一項為2個空閒頁,第三個連結串列中的每一項為4個空閒頁。。。,依次類推。分配頁時,從對應的連結串列上摘除空閒頁;釋放頁時,將對應的頁歸還到對應的連結串列。分配釋放頁的過程中,可能伴隨著記憶體頁的拆分和合並。比如要分配16個空閒頁,但是對應的連結串列為空,這時如果32個空閒頁對應的連結串列如果不為空,則從連結串列中摘除32個空閒頁,並將其一分為二,其中16個頁用於記憶體分配,剩餘16個頁則插入到16個頁對應的連結串列中。

儘管頁的分配演算法是簡單的,但是實際過程卻非常複雜。這是因為分配頁式必須考慮一下幾點:

1 備用記憶體區。當從一個記憶體區無法得到記憶體時,系統會從同一記憶體節點的其它記憶體區或者從另一個記憶體節點中的記憶體區中獲取記憶體。
2 頁的換入和換出,在沒有足夠多的空閒頁時,可能需要將頁換出以獲取空閒記憶體。
3 頁的回收,對一些緩衝區的不再使用的頁進行回收,以獲取空閒頁。
4 系統中必須保持一定“水位”的空閒頁,以應付對記憶體的緊急分配。如果系統將頁分配完,在急需記憶體時,再進行頁的回收或換出,無疑是非常糟糕的設計。系統中必須保持一定量的記憶體頁。
5 不同的分配策略。不同的分配策略可能採用的方法有區別。
總之,頁的分配和釋放需要考慮許多因素,儘量滿足記憶體分配的同時,要保證系統的穩定性和健壯性。