初識slub分配器

2021-07-31 06:22:01 字數 1793 閱讀 9988

在頁分配器之上就是我們熟悉的slub分配器了。

slub分配器的出現很容易理解

畢竟不是誰都需要以頁為單位申請記憶體

將申請物件按照大小分類,減少內部碎片

增加了除錯功能

先來看看平時要怎麼使用slub。沒見過豬跑,豬肉估計還是吃過的。

最常用的就是這一組了

kmalloc

kfree

核心對普通的記憶體分配預設了指定大小的slub分配器。所以當我們使用這一組api時,核心會根據我們需要分配的大小找到合適的塊來分配。

除此之外還有一組api可以幫助我們定義自己制定的slub分配器

kmem_cache_create

kmem_cache_alloc

kmem_cache_free

當我們使用這一組api的時候,核心就會專門給我們增加乙個slub分配器,後續的記憶體會專門由這個分配器分配。

光說不練假把式,那我們現在就來看看乙個具體的例子~

#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分配器

從這個slub分配器中分配了32個物件

每個物件都有乙個建構函式

這就是乙個非常簡單的核心模組,大家可以在自己的linux系統上編譯執行。親測,可用。

話說很久以前我還修復過乙個slub中建構函式的乙個bug。當時的版本中第乙個物件會被構造兩次。這個問題由這個補丁修復。

系統中一共有兩個地方可以觀測到slub的情況。

/proc/slabinfo

/sys/kernel/slab/***/

比如我們cat /proc/slabinfo能夠得到

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 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配...