在頁分配器之上就是我們熟悉的slub分配器了。
slub分配器的出現很容易理解
畢竟不是誰都需要以頁為單位申請記憶體先來看看平時要怎麼使用slub。沒見過豬跑,豬肉估計還是吃過的。將申請物件按照大小分類,減少內部碎片
增加了除錯功能
最常用的就是這一組了
kmalloc核心對普通的記憶體分配預設了指定大小的slub分配器。所以當我們使用這一組api時,核心會根據我們需要分配的大小找到合適的塊來分配。kfree
除此之外還有一組api可以幫助我們定義自己制定的slub分配器
kmem_cache_create當我們使用這一組api的時候,核心就會專門給我們增加乙個slub分配器,後續的記憶體會專門由這個分配器分配。kmem_cache_alloc
kmem_cache_free
光說不練假把式,那我們現在就來看看乙個具體的例子~
#include
#include
#include
module_license("dual bsd/gpl");
#define alloc_num 32
static
struct kmem_cache *test_cache;
void* tmp[alloc_num];
static
void init_once(void *foo)
static
int kmem_cache_test_init(void)
static
void kmem_cache_test_exit(void)
module_init(kmem_cache_test_init);
module_exit(kmem_cache_test_exit);
這個例子非常簡單
新建乙個名為test_cache的slub分配器這就是乙個非常簡單的核心模組,大家可以在自己的linux系統上編譯執行。親測,可用。從這個slub分配器中分配了32個物件
每個物件都有乙個建構函式
話說很久以前我還修復過乙個slub中建構函式的乙個bug。當時的版本中第乙個物件會被構造兩次。這個問題由這個補丁修復。
系統中一共有兩個地方可以觀測到slub的情況。
/proc/slabinfo比如我們cat /proc/slabinfo能夠得到/sys/kernel/slab/***/
slabinfo - version: 2.1
# name
: tunables
: slabdata
test_cache 52 52 1248 26 8 : tunables 0 0 0 : slabdata 2 2 0
這個輸出的格式確實有點醜,不知道哪天哪位高手可以整好看一點。
從這個輸出的結果可以看到,現在一共有52個test_cache的物件,實際上我們只分配了32個不是?這也是slub的工作之一,會預先多分配一些物件,而不是每次重新分配。
當然這個檔案還可以檢視究竟那個模組,哪個部分用的記憶體最多。你說是不是?
訊號分配器
訊號分配器 技術引數 超爾崎輸入電壓 ac 220v 50hz超爾崎 超爾崎輸入電流 1.5a 輸出電流 12a 8a 2a超爾崎 技術要求 1 全自動 手動充電,操作方便,多重保超爾崎護電路,使用更安全 全自動化的充電過程 恆壓 恆流 浮充 可根據電池狀態及電池好壞情況完全自超爾崎動選擇充電模式及...
Linux SLUB 分配器詳解
多年以來,linux 核心使用一種稱為 slab 的核心物件緩衝區分配器。但是,隨著系統規模的不斷增大,slab 逐漸暴露出自身的諸多不足。slub 是 linux 核心 2.6.22 版本中引入的一種新型分配器,它具有設計簡單 精簡 額外記憶體佔用率小 擴充套件性高,效能優秀 方便除錯等特點。本文...
Linux slab 分配器詳解
投稿收藏 良好的作業系統效能部分依賴於操作 系統有效管理資源的能力。在過去,堆記憶體管理器是實際的規範,但是其效能會受到記憶體碎片和記憶體 需求的影響。現在,linux?核心使用了源自於 solaris 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配...