Linux slab 分配器詳解

2021-04-19 10:08:56 字數 4146 閱讀 9636

投稿收藏

良好的作業系統效能部分依賴於操作 系統有效管理資源的能力。在過去,堆記憶體管理器是實際的規範,但是其效能會受到記憶體碎片和記憶體**需求的影響。現在,linux? 核心使用了源自於 solaris 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配。本文將探索 slab 分配器背後所採用的思想,並介紹這種方法提供的介面和用法。

網管網www.bitscn.com

動態記憶體管理網管u家u.bitscn.com

記憶體管理的目標是提供一種方法,為實現各種目的而在各個使用者之間實現記憶體共享。記憶體管理方法應該實現以下兩個功能: 網管u家u.bitscn@com

最小化管理記憶體所需的時間

網管網www.bitscn.com

最大化用於一般應用的可用記憶體(最小化管理開銷) 網管網www_bitscn_com

記憶體管理實際上是一種關於權衡的零和遊戲。您可以開發一種使用少量記憶體進行管理的演算法,但是要花費更多時間來管理可用記憶體。也可以開發乙個演算法來有效地管理記憶體,但卻要使用更多的記憶體。最終,特定應用程式的需求將促使對這種權衡作出選擇。 網管u家u.bitscn@com

每個記憶體管理器都使用了一種基於堆的分配策略。在這種方法中,大塊記憶體(稱為 堆)用來為使用者定義的目的提供記憶體。當使用者需要一塊記憶體時,就請求給自己分配一定大小的記憶體。堆管理器會檢視可用記憶體的情況(使用特定演算法)並返回一塊內 存。搜尋過程中使用的一些演算法有 first-fit(在堆中搜尋到的第乙個滿足請求的記憶體塊)和 best-fit(使用堆中滿足請求的最合適的記憶體塊)。當使用者使用完記憶體後,就將記憶體返回給堆。 網管聯盟bitscn_com

這種基於堆的分配策略的根本問題是碎片(fragmentation)。當記憶體塊被分配後,它們會以不同的順序在不同的時間返回。這樣會在堆中 留下一些洞,需要花一些時間才能有效地管理空閒記憶體。這種演算法通常具有較高的記憶體使用效率(分配需要的記憶體),但是卻需要花費更多時間來對堆進行管理。

網管u家u.bitscn.com

另外一種方法稱為 buddy memory allocation,是一種更快的記憶體分配技術,它將記憶體劃分為 2 的冪次方個分割槽,並使用 best-fit 方法來分配記憶體請求。當使用者釋放記憶體時,就會檢查 buddy 塊,檢視其相鄰的記憶體塊是否也已經被釋放。如果是的話,將合併記憶體塊以最小化記憶體碎片。這個演算法的時間效率更高,但是由於使用 best-fit 方法的緣故,會產生記憶體浪費。

中國網管論壇bbs.bitscn.com

本文將著重介紹 linux 核心的記憶體管理,尤其是 slab 分配提供的機制。 網管u家u.bitscn@com

slab 快取

中國網管論壇bbs.bitscn.com

linux 所使用的 slab 分配器的基礎是 jeff bonwick 為 sunos 作業系統首次引入的一種演算法。jeff 的分配器是圍繞物件快取進行的。在核心中,會為有限的物件集(例如檔案描述符和其他常見結構)分配大量記憶體。jeff 發現對核心中普通物件進行初始化所需的時間超過了對其進行分配和釋放所需的時間。因此他的結論是不應該將記憶體釋放回乙個全域性的記憶體池,而是將記憶體保持為針 對特定目而初始化的狀態。例如,如果記憶體被分配給了乙個互斥鎖,那麼只需在為互斥鎖首次分配記憶體時執行一次互斥鎖初始化函式(mutex_init)即 可。後續的記憶體分配不需要執行這個初始化函式,因為從上次釋放和呼叫析構之後,它已經處於所需的狀態中了。 網管網www_bitscn_com

linux slab 分配器使用了這種思想和其他一些思想來構建乙個在空間和時間上都具有高效性的記憶體分配器。

網管論壇bbs_bitscn_com

圖 1 給出了 slab 結構的高層組織結構。在最高層是 cache_chain,這是乙個 slab 快取的鏈結列表。這對於 best-fit 演算法非常有用,可以用來查詢最適合所需要的分配大小的快取(遍歷列表)。cache_chain 的每個元素都是乙個 kmem_cache 結構的引用(稱為乙個 cache)。它定義了乙個要管理的給定大小的物件池。 網管網www.bitscn.com

中國網管聯盟bitscn.com

網管u家u.bitscn@com

每個快取都包含了乙個 slabs 列表,這是一段連續的記憶體塊(通常都是頁面)。存在 3 種 slab:

網管bitscn_com

slabs_full 網管網www.bitscn.com

完全分配的 slab

網管論壇bbs_bitscn_com

slabs_partial

中國網管聯盟bitscn.com

部分分配的 slab 網管聯盟bitscn_com

slabs_empty 網管聯盟bitscn_com

注意 slabs_empty 列表中的 slab 是進行**(reaping)的主要備選物件。正是通過此過程,slab 所使用的記憶體被返回給作業系統供其他使用者使用。

中國網管聯盟bitscn.com

slab 列表中的每個 slab 都是乙個連續的記憶體塊(乙個或多個連續頁),它們被劃分成乙個個物件。這些物件是從特定快取中進行分配和釋放的基本元素。注意 slab 是 slab 分配器進行操作的最小分配單位,因此如果需要對 slab 進行擴充套件,這也就是所擴充套件的最小值。通常來說,每個 slab 被分配為多個物件。 網管bitscn_com

由於物件是從 slab 中進行分配和釋放的,因此單個 slab 可以在 slab 列表之間進行移動。例如,當乙個 slab 中的所有物件都被使用完時,就從 slabs_partial 列表中移動到 slabs_full 列表中。當乙個 slab 完全被分配並且有物件被釋放後,就從 slabs_full 列表中移動到 slabs_partial 列表中。當所有物件都被釋放之後,就從 slabs_partial 列表移動到 slabs_empty 列表中。

Linux Slab分配器 一 概述

slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類 如程序描述符就...

Linux Slab分配器(一)概述

slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類 如程序描述符就...

Linux SLUB 分配器詳解

多年以來,linux 核心使用一種稱為 slab 的核心物件緩衝區分配器。但是,隨著系統規模的不斷增大,slab 逐漸暴露出自身的諸多不足。slub 是 linux 核心 2.6.22 版本中引入的一種新型分配器,它具有設計簡單 精簡 額外記憶體佔用率小 擴充套件性高,效能優秀 方便除錯等特點。本文...