1. 程式人生 > >Linux系統記憶體管理之夥伴系統分析

Linux系統記憶體管理之夥伴系統分析

 1.夥伴系統概念

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

 2.夥伴系統的組織結構

Linux中的記憶體管理的“頁”大小為4KB。把所有的空閒頁分組為11個塊連結串列,每個塊連結串列分別包含大小為1,2,4,8,16,32,64,128,256,512和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次分配後記憶體的分佈。

  

  因此,當沒有滿足可用於分配的不可移動空閒塊時,分配器會在可移動列表中遷移一個儘可能大的連續記憶體塊給不可移動列表。這樣避免了啟動期間核心分配的記憶體雜湊到實體記憶體各處,從而使其他型別的記憶體分配免受碎片的干擾。