釋放物件和分配物件是一組對稱的操作,同樣分為兩個路徑:
1.如果待釋放的物件所屬的slab位於本地cpu快取中,也就是slab處於凍結狀態,則可直接釋放
2.反之,待釋放的物件所屬的slab位於slab鍊錶中,也就是slab處於解凍狀態,則要通過慢速路徑進行釋放。
函式kmem_cache_free()用來將乙個物件釋放至對應的快取中
void kmem_cache_free(struct kmem_cache *s, void *x)
釋放物件前必須先得到物件所屬slab的第乙個頁,這樣便於後面判斷slab是否處於本地cpu快取中。
static __always_inline void slab_free(struct kmem_cache *s,
struct page *page, void *x, unsigned long addr)
else
__slab_free(s, page, x, addr, c->offset);//慢速釋放路徑
local_irq_restore(flags);
}
判斷slab是否位於本地cpu快取中的方式很簡單,就是看本地cpu快取中的page指標和之前獲取的page指標是否相等,相等的話就表明兩者指向同乙個page,也就是說是同乙個slab. 判斷node>=0是為了辨明該非除錯狀態,因為node==-1是用來除錯的。常規釋放路徑和分配是對稱的操作,如果看懂了分配,那麼這個自然也就明白了,不贅述了。下面來看慢速釋放路徑
static void __slab_free(struct kmem_cache *s, struct page *page,
void *x, unsigned long addr, unsigned int offset)
/*inuse為0表示該slab的所有物件都處於空閒狀態*/
if (unlikely(!page->inuse))
goto slab_empty;
/* * objects left in the slab. if it was not on the partial list before
* then add it.
*//*prior為空表明之前page->freelist為null,也就是說slab沒有處於partial slab鍊錶中,
將該slab新增到partial slab鍊錶的尾部*/
if (unlikely(!prior))
out_unlock:
slab_unlock(page);
return;
slab_empty:
if (prior)
slab_unlock(page);
stat(c, free_slab);
discard_slab(s, page);//銷毀slab
return;
debug:
if (!free_debug_processing(s, page, x, addr))
goto out_unlock;
goto checks_ok;
}
首先獲取本地cpu快取結構,儲存在c中,然後將物件釋放回slab,注意這裡用的是page->freelist而不是c->freelist
如果page->inuse為0,表示slab所有物件都是空閒的,slub沒有free list鍊錶,因此選擇直接銷毀該slab,將記憶體返回給夥伴系統。如果prior為空,那也就表示slab處於full slab鍊錶而不是partial slab鍊錶,由於現在獲得了乙個空閒物件,因此將slab新增到partial slab中,至於從full slab中刪除slab的操作,是在free_debug_processing()中完成的。
Linux SLUB 分配器詳解
多年以來,linux 核心使用一種稱為 slab 的核心物件緩衝區分配器。但是,隨著系統規模的不斷增大,slab 逐漸暴露出自身的諸多不足。slub 是 linux 核心 2.6.22 版本中引入的一種新型分配器,它具有設計簡單 精簡 額外記憶體佔用率小 擴充套件性高,效能優秀 方便除錯等特點。本文...
Linux Slub分配器 一 概述
slab分配器一直處於核心記憶體管理的核心地位,儘管如此,它還是擁有自身的缺點,最明顯的兩點就是複雜性和過多的管理資料造成的記憶體上的開銷。針對這些問題,linux引入了slub分配器,slub分配器保留了slab分配器的所有介面,實際上slub分配器的模型和slab分配的模型是基本一致的,只不過在...
訊號分配器
訊號分配器 技術引數 超爾崎輸入電壓 ac 220v 50hz超爾崎 超爾崎輸入電流 1.5a 輸出電流 12a 8a 2a超爾崎 技術要求 1 全自動 手動充電,操作方便,多重保超爾崎護電路,使用更安全 全自動化的充電過程 恆壓 恆流 浮充 可根據電池狀態及電池好壞情況完全自超爾崎動選擇充電模式及...