與傳統的內存管理模式相比, slab 緩存分配器提供了很多優點。首先,內核通常依賴于對小對象的分配,它們會在系統生命周期內進行無數次分配。slab 緩存分配器通過對類似大小的對象進行緩存而提供這種功能,從而避免了常見的碎片問題。slab 分配器還支持通用對象的初始化,從而避免了為同一目而對一個對象重復進行初始化。最后,slab 分配器還可以支持硬件緩存對齊和著色,這允許不同緩存中的對象占用相同的緩存行,從而提高緩存的利用率并獲得更好的性能。
API 函數
現在來看一下能夠創建新 slab 緩存、向緩存中增加內存、銷毀緩存的應用程序接口(API)以及 slab 中對對象進行分配和釋放操作的函數。
第一個步驟是創建 slab 緩存結構,您可以將其靜態創建為:
struct struct kmem_cache *my_cachep;
然后其他 slab 緩存函數將使用該引用進行創建、刪除、分配等操作。kmem_cache 結構包含了每個中央處理器單元(CPU)的數據、一組可調整的(可以通過 proc 文件系統訪問)參數、統計信息和管理 slab 緩存所必須的元素。
kmem_cache_create
內核函數 kmem_cache_create 用來創建一個新緩存。這通常是在內核初始化時執行的,或者在首次加載內核模塊時執行。其原型定義如下:
struct kmem_cache * kmem_cache_create( const char *name, size_t size, size_t align, unsigned long flags; void (*ctor)(void*, struct kmem_cache *, unsigned long), void (*dtor)(void*, struct kmem_cache *, unsigned long)); |
name 參數定義了緩存名稱,proc 文件系統(在 /proc/slabinfo 中)使用它標識這個緩存。 size 參數指定了為這個緩存創建的對象的大小, align 參數定義了每個對象必需的對齊。 flags 參數指定了為緩存啟用的選項。這些標志如表 1 所示。
表 1. kmem_cache_create 的部分選項(在 flags 參數中指定)
選項 | 說明 |
SLAB_RED_ZONE | 在對象頭、尾插入標志,用來支持對緩沖區溢出的檢查。 |
SLAB_POISON | 使用一種己知模式填充 slab,允許對緩存中的對象進行監視(對象屬對象所有,不過可以在外部進行修改)。 |
SLAB_HWCACHE_ALIGN | 指定緩存對象必須與硬件緩存行對齊。 |
ctor 和 dtor 參數定義了一個可選的對象構造器和析構器。構造器和析構器是用戶提供的回調函數。當從緩存中分配新對象時,可以通過構造器進行初始化。