Linux記憶體管理slab分配器

2021-08-04 14:04:15 字數 1862 閱讀 5280

在solaris 2.4以前,linux核心採用基於夥伴演算法實現的分割槽頁框分配器適合大塊記憶體的請求。夥伴將空閒頁面分為m個組,第1組儲存2^0個單位的記憶體塊,,第2組儲存2^1個單位的記憶體塊,第3組儲存2^2個單位的記憶體塊,第4組儲存2^3個單位的記憶體塊,以此類推.直到m組.但是夥伴演算法是以頁為單位分配的,即會產生內部碎片,slab演算法的出現就是為了解決這個小粒度記憶體分配的問題出現的。

slab分配器為每種物件分配乙個快取記憶體,這個快取可以看做是同型別物件的一種儲備。每個快取記憶體所佔的記憶體區又被劃分多個slab,每個slab是由乙個或多個連續的頁框組成。每個頁框中包含若干個物件,既有已經分配的物件,也包含空閒的物件。slab分配器的大致組成圖如下:

每個快取記憶體通過kmem_cache結構來描述,這個結構中包含了對當前快取記憶體各種屬性資訊的描述。所有的快取記憶體通過雙鏈表組織在一起,形成快取記憶體鍊錶cache_chain。每個kmem_cache結構中並不包含對具體slab的描述,而是通過kmem_list3結構組織各個slab。在最高層是 cache_chain,這是乙個 slab 快取的鏈結列表。這對於首次適應演算法非常有用,可以用來查詢最適合所需要的分配大小的快取(遍歷列表)。cache_chain 的每個元素都是乙個 kmem_cache 結構的引用(稱為乙個 cache)。它定義了乙個要管理的給定大小的物件池,上述分配器細化可得到下圖:

slab分配器有以下三個基本目標:

1. 減少夥伴演算法在分配小塊連續記憶體時所產生的內部碎片;

2. 將頻繁使用的物件快取起來,減少分配、初始化和釋放物件的時間開銷;

3. 通過著色技術調整物件以更好的使用硬體快取記憶體。

linux 所使用的 slab 分配器的基礎是 jeff bonwick 為 sunos 作業系統首次引入的一種演算法。jeff 的分配器是圍繞物件快取進行的。在核心中,會為有限的物件集(例如檔案描述符和其他常見結構)分配大量記憶體。jeff 發現對核心中普通物件進行初始化所需的時間超過了對其進行分配和釋放所需的時間。因此他的結論是不應該將記憶體釋放回乙個全域性的記憶體池,而是將記憶體保持為針對特定目而初始化的狀態。例如,如果記憶體被分配給了乙個互斥鎖,那麼只需在為互斥鎖首次分配記憶體時執行一次互斥鎖初始化函式(mutex_init)即可。後續的記憶體分配不需要執行這個初始化函式,因為從上次釋放和呼叫析構之後,它已經處於所需的狀態中了。如果沒有基於物件的slab分配器,核心將花費更多的時間去分配、初始化以及釋放乙個物件。即使用slab演算法能極大減少核心在記憶體管理的開銷。與傳統的記憶體管理模式相比, slab 快取分配器提供了很多優點。首先,核心通常依賴於對小物件的分配,它們會在系統生命週期內進行無數次分配。slab 快取分配器通過對類似大小的物件進行快取而提供這種功能,從而避免了常見的碎片問題。slab 分配器還支援通用物件的初始化,從而避免了為同一目而對乙個物件重複進行初始化。最後,slab 分配器還可以支援硬體快取對齊和著色,這允許不同快取中的物件占用相同的快取行,從而提高快取的利用率並獲得更好的效能。

儘管slab分配器對許多可能的工作負荷良好,但有一些情況他無法提供最佳效能。如果某些計算機處於當前硬體尺度的邊界上,這類計算機上使用slab分配會出現一些問題,例如小型嵌入式系統和大規模的並行系統。

slob分配器進行了特別的優化以減少**量,他圍繞乙個簡單的記憶體塊鍊錶展開。在分配記憶體時,使用了同樣簡單的最先介面卡演算法。slob**量很少,但從速度上考慮並不適合大型的系統。

slub分配器通過將頁幀打包為組,並通過struct page中使用的字段來管理這些組,檢視最小化所需記憶體的開銷,雖然該結構定義較複雜,但在大型計算機上,slub分配器比slab分配器提供了更好的效能。

slab記憶體分配

1.slab記憶體結構圖 二維陣列鍊錶 slab是一次申請記憶體的最小單位 程序記憶體區 slabclass元資訊 1.1中是21byte,1.2中是200byte hashtable 1.1中位41mb,1.2中位65mb 資料記憶體區 slab預設大小為1048576byte 1mb 大於1mb...

linux記憶體管理 之 slab分配器

1 頁面分配器是頁面級的記憶體分配工具,能分配2的order次冪的連續物理記憶體。linux在頁面級記憶體分配的基礎上,開發了小記憶體分配方案 slab slob slub。後兩者分別針對大型系統和嵌入式系統。2 slab分配器的思想 先利用頁面分配器分配出單個或者一組連續的物理頁面,然後在此基礎上...

Linux記憶體管理之slab分配器分析

一 準備知識 前面我們分析過了大記憶體分配的實現機制,事實上,若為小塊記憶體而請求整個頁面,這樣對於記憶體來說是一種極度的浪費。因此linux 採用了slab 來管理小塊記憶體的分配與釋放。slab 最早是由sun 的工程師提出。它的提出是基於以下因素考慮的 1 核心函式經常傾向於反覆請求相同的資料...