Linux系統記憶體管理之夥伴系統分析 – 旭東的部落格 – 部落格園Linux系統記憶體管理之夥伴系統分析

來源:互聯網
上載者:User

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次分配後記憶體的分布。

 

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

 

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

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次分配後記憶體的分布。

 

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.