分配內核內存(buddy系統和slab系統)(3)

目錄

  1. 內存管理中的分區分配方法(1)
  2. 夥伴系統(算法)-內存分配技術(2)
  3. 分配內核內存(buddy系統和slab系統)(3)

管理內核進程空閒內存的兩種策略:

1. 夥伴系統 –

夥伴分配系統是一種算法,它把一個大的內存塊切分爲一個小的部分來滿足請求。該算法通常給出最符合的內存塊。塊的兩個更小的子部分是相同大小的,稱爲夥伴。兩個夥伴中的一個以同樣的方式進一步切分爲更小的子部分,直到請求被滿足爲止。該技術的好處是兩個夥伴可以根據內存請求合併形成一個大尺寸的塊。
例如 – 如果發出一個需求25Kb的請求,那麼被分配到的塊的大小爲32Kb。
1

四種類型的夥伴系統 –

  1. 二分夥伴系統
  2. 斐波那契夥伴系統
  3. 權重夥伴系統
  4. 三級夥伴系統

2
上圖取自:https://www.semanticscholar.org/paper/Tertiary-buddy-system-for-efficient-dynamic-memory-Yadav-Sharma/600765f1309dedb9b42290149b2cf098f0044218/figure/5

爲什麼夥伴系統?

如果分區大小與進程(需求)大小是不同的,則會出現不匹配情況,並且可能無法有效的使用空間。
動態分配實現簡單並且高效。

二分夥伴系統 –

夥伴系統爲每個尺寸(稱爲空閒列表)的空閒塊維護一個列表,因此它很容易找到一個期望尺寸的塊,如果有一個是可用的。如果沒有請求的塊是可用的,分配查找具有請求的最低限度的塊的第一個非空列表。在兩種情況下,都會從空閒列表中移除一個塊。

案例 –

假設內存的段大小初始值是256kb,並且內核請求25kb的內存。這個段初始切分爲兩個夥伴。我們稱其爲A1和A2每個大小爲128kb。這兩個夥伴中的一個進一步切分到兩個64kb的夥伴稱爲B1和B2。但是25kb下一個高(2)次冪是32kb,所以,或者B1或者B2進一步切分到兩個32kb的夥伴(C1 and C2)並且最終使用兩個夥伴中的一個來滿足25kb的請求。一個分割塊只能與它的唯一夥伴塊進行合併,然後再形成一個更大的塊,更大的塊即他們從哪切分過來的(父節點)。

斐波那契夥伴系統 –

該系統的塊被按照斐波那契數列數字的大小進行切分。它滿足下面的關係:

Z = Z+Z

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 144, 233, 377, 610。二分和權重夥伴系統的地址計算非常簡單,但是斐波那契夥伴系統開始過程要麼被限制在一個小的,固定數量的塊大小上,要麼就是一個耗時的計算。

優勢 –

  • 相比較其他簡單的動態分配技術,夥伴內存系統的外部碎片很小。
  • 夥伴內存分配系統使用二叉樹實現表示已使用或未使用的切分的內存塊。
  • 夥伴系統分配或釋放內存方面非常的快。
  • 在夥伴系統中,分配與釋放一個快的內存相比“最符合”或“第一符合”算法成本要低。
  • 另一個優勢是合併。
  • 地址計算簡單。

什麼是合併?

它的定義是:如何快速的把相鄰夥伴合併形成更大的段被稱爲合併。
例如,當內核釋放了分配給它的C1單元,系統可以聚合C1與C2爲64kb段。該段B1可以與它的夥伴B2聚合形成128kb的段。最終我們可以結束在開始的256kb段。

缺點Drawback –

在夥伴系統中主要的缺點是內部碎片,因爲需要獲得更大的內存塊。例如如果發出一個36kb的請求,它只能由64kb的段滿足並且剩餘的內存被浪費。

2. Slab分配 –

描述

爲內核內存分配的第二個策略稱爲slab分配。它消除了由分配與釋放引起的碎片。該方法通常保留包含了確定類型的數據對象已分配內存,爲了後續的同類型對象的分配重用。在slab分配中,內存塊適合於確定類型或大小的適合的數據對象的預分配。在使用完之後Cache不會立即釋放空間,儘管它保持跟蹤頻繁需要的數據,因此無論何時發出請求,該數據將會很快到達(觸達)。兩個需要的術語:

  • Slab – A slab由一個或多個物理連續的分頁組成。The slab實際上是數據與關聯的特殊類型的包含緩存的對象的容器。
  • Cache – Cache表示少量非常快的內存。A cache有一個或多個slabs組成。每個唯一的內核數據結構都有一個單獨的cache。

3

案例 –

  • 爲表示進程描述符數據結構的單獨緩存。
  • 文件對象的單獨緩存。
  • 信號量等等的單獨緩存。

每個緩存都填有對象,這些對象是緩存所代表的內核數據結構的實例化。例如代表信號量的緩存存儲信號量對象,代表進程描述符的緩存存儲進程描述符對象的實例。

實現 –

slab分配算法使用緩存存儲內核對象。緩存創建時,許多初始標記爲空閒的對象分配給緩存。緩存中對象的數量依賴於關聯slab的大小。
案例 – A 12 kb的slab(由3個連續的4kb分頁組成)可以存儲6個2 kb對象。初始化時所有緩存中的對象被標記爲空閒。當一個內核數據結構的新對象需要時,分配器可以從緩存中分配一些空閒的對象滿足請求。從緩存中分配的對象被標記爲已使用。
在linux中,一個slab可能處於三種狀態之一:

  1. Full – 所有slab中的對象都被標記爲已使用
  2. Empty – 所有slab中的對象都被標記爲空閒
  3. Partial – slab由部分已使用對象與部分空閒對象組成

slab分配器首先嚐試使用partial slab中的一個空閒對象來滿足請求。如果不存在,則從一個empty slab中分配一個空閒對象。如果沒有empty slabs是可用的,則從連續的物理分頁中分配一個新的slab並將其分配給一個緩存。

slab分配器的益處 –

  • 沒有由於碎片浪費內存,因爲每個唯一的內核數據結構都有一個關聯的緩存。
  • 可以快速滿足內存請求。
  • 當管理頻繁分配或釋放的對象時slab分配方案是尤其高效。分配與釋放內存動作可能是一個耗時的過程。但是,對象是預先創建的,因此可以從緩存中快速分配。當內核終結一個對象並且釋放它時,它被標記爲空閒並返回給它的緩存,從而使它立即可用於內核的後續請求。

原文

第一部分:https://www.geeksforgeeks.org/partition-allocation-methods-in-memory-management/
第二部分:https://www.geeksforgeeks.org/buddy-system-memory-allocation-technique/
第三部分:https://www.geeksforgeeks.org/operating-system-allocating-kernel-memory-buddy-system-slab-system/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章