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

2021-05-23 13:33:45 字數 1158 閱讀 2478

一:準備知識:

前面我們分析過了大記憶體分配的實現機制,事實上, 若為小塊記憶體而請求整個頁面,這樣對於記憶體來說是一種極度的浪費。因此linux 採用了slab 來管理小塊記憶體的分配與釋放。slab 最早是由sun 的工程師提出。它的提出是基於以下因素考慮的: 1

:核心函式經常傾向於反覆請求相同的資料型別。比如:建立程序時,會請求一塊記憶體來存放mm 結構。 2

:不同的結構使用不同的分配方法可以提高效率。同樣,如果程序在撤消的時候,核心不把mm 結構釋放掉,而是存放到乙個緩衝區裡,以後若有請求mm 儲存空間的行為就可以直接從緩衝區中取得,而不需重新分配記憶體. 3:

前面我們曾分析過,如果夥伴系統頻繁分配,釋放記憶體會影響系統的效率,以此,可以把要釋放到的記憶體放到緩衝區中,直至超過乙個閥值才把它釋放至夥伴系統,這樣可以在一定程度上緩減減夥伴系統的壓力 4:

為了緩減「內碎片」的產生,通常可以把小記憶體塊按照2 的倍數組織在一起,這一點和夥伴系統類似

二:slab 分配器概貌:

slab

將快取分為兩種:一種是專用快取記憶體,另外一種是普通快取記憶體。請注意,這裡所說的快取記憶體和硬體沒有必然的關係,它只是slab 分配器中的乙個軟體概念。

專用快取記憶體中用來存放核心使用的資料結構,例如:mm,skb,vm 等等

普通快取記憶體是指存放一般的資料,比如核心為指標分配一段記憶體

所有的快取記憶體區都通過鍊錶的方式組織在一起,它的首結點是cache_chain

另外,普通快取記憶體將分配區分為32*(2^0),32*(2^1),32*(2^2) ….32*(2^12) 大小,共13 個區域大小,另外,每個大小均有兩個快取記憶體,乙個為dma 快取記憶體,乙個是常規快取記憶體。它們都存放在乙個名這cache_size 的表中.

slab

分配器把每乙個請求的記憶體稱之為物件(和oop 設計方法中的物件類似,都有初始化與析構). 物件又存放在slab 中.slab 又按照空,末滿,全滿全部鏈結至快取記憶體中. 如下圖所示:

三:slab 分配器相關的資料結構:

快取記憶體:

typedef struct kmem_cache_s kmem_cache_t;

struct kmem_cache_s

這裡值得注意的地方是,與2.4 相比,slab 部份的結構與成員位置發生了很大改變。一般來說經常用的成員放在結構體的前面。後面會解述為什麼。

Linux記憶體管理之slab演算法簡述

slab 分配機制。slab 快取 linux 所使用的 slab 分配器的基礎是 jeff bonwick 為 sunos 作業系統首次引入的一種演算法。jeff 的分配器是圍繞 物件快取進行的。在核心中,會為有限的 物件集 例如 檔案描述符 和其他常見結構 分配大量記憶體。jeff 發現對核心中...

linux記憶體管理 之 slab分配器

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

Linux記憶體管理slab分配器

在solaris 2.4以前,linux核心採用基於夥伴演算法實現的分割槽頁框分配器適合大塊記憶體的請求。夥伴將空閒頁面分為m個組,第1組儲存2 0個單位的記憶體塊,第2組儲存2 1個單位的記憶體塊,第3組儲存2 2個單位的記憶體塊,第4組儲存2 3個單位的記憶體塊,以此類推.直到m組.但是夥伴演算...