Linux系統內存管理之伙伴系統分析


 今天去面試,一位面試官提到了內存管理的伙伴系統,當時就懵了,因為根本就沒有聽說過。晚上回來在實驗室查了一些資料,現總結如下:

 1.伙伴系統概念

  伙伴系統是一種經典的內存管理方法。Linux伙伴系統的引入為內核提供了一種用於分配一組連續的頁而建立的一種高效的分配策略,並有效的解決了外碎片問題。

 2.伙伴系統的組織結構

  Linux中的內存管理的“頁”大小為4KB把所有的空閑頁分組為11個塊鏈表,每個塊鏈表分別包含大小為1248163264128256512和1024個連續頁框的頁塊。最大可以申請1024個連續頁,對應4MB大小的連續內存。每個頁塊的第一個頁的物理地址是該塊大小的整數倍。

   結構如圖所示:第i個塊鏈表中,num表示大小為(2^i)頁塊的數目,address表示大小為(2^i)頁塊的首地址。

 

 3.伙伴系統的內存分配及釋放

  當向內核請求分配(2^(i-1)2^i]數目的頁塊時,按照2^i頁塊請求處理。如果對應的塊鏈表中沒有空閑頁塊,則在更大的頁塊鏈表中找。當分配的頁塊中有多余的頁時,伙伴系統根據多余的頁框大小插入到對應的空閑頁塊鏈表中。

  當釋放單頁的內存時,內核將其置於CPU高速緩存中,對很可能出現在cache的頁,則放到“快表”的列表中。在此過程中,內核先判斷CPU高速緩存中的頁數是否超過一定“閾值”,如果是,則將一批內存頁還給伙伴系統,然后將該頁添加到CPU高速緩存中。

  釋放多頁的塊時,內核首先計算出該內存塊的伙伴的地址。內核將滿足以下條件的三個塊稱為伙伴(1)兩個塊具有相同的大小,記作b(2)它們的物理地址是連續的。(3)第一塊的第一個頁的物理地址2*(2^b)的倍數。如果找到了該內存塊的伙伴,確保該伙伴的所有頁都是空閑的,以便進行合並。內存繼續檢查合並后頁塊的“伙伴”並檢查是否可以合並,依次類推。

 4.伙伴系統的反碎片機制

  內核將已分配頁分為以下三種不同的類型:

  (1)不可移動頁:這些頁在內存中有固定的位置,不能夠移動。

  (2)可回收頁:這些頁不能移動,但可以刪除。內核在回收頁占據了太多的內存時或者內存短缺時進行頁面回收。

  (3)可移動頁:這些頁可以任意移動,用戶空間應用程序使用的頁都屬於該類別。它們是通過頁表映射的。當它們移動到新的位置,頁表項也會相應的更新。

  在內存子系統初始化期間,所有的頁都被標記為可移動的。在啟動期間,核心內核分配的內存是不可移動的。此時內核的策略是分配一個盡可能大的連續內存塊,將其從可移動列表轉換到不可移動列表。分配一個盡可能大的連續內存塊而不是選擇更小的滿足要求的內存塊的原因如下:

  例如:現有一塊可移動的具有16頁的連續空閑內存塊。當內核需要分配1頁不可移動內存頁時。分配器選擇后8(而不是一頁)轉移到不可移動列表,然后從不可移動列表中選擇1用於分配。如果內核又需要分配1頁不可移動內存頁則從不可移動列表中選擇一頁用於分配,下圖顯示了進行4次分配后內存的分布。

  但如果內核只選擇1頁用於分配將其加入到不可移動列表,當下次需要分配時又選擇一頁加入到不可移動列表,下圖顯示了按照這種方式進行4次分配后內存的分布。

  

 

  因此,當沒有滿足可用於分配的不可移動空閑塊時,分配器會在可移動列表中遷移一個盡可能大的連續內存塊給不可移動列表。這樣避免了啟動期間內核分配的內存散列到物理內存各處,從而使其他類型的內存分配免受碎片的干擾。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM