Linux Slub分配器 五 釋放物件

2021-08-27 01:15:04 字數 1901 閱讀 6620

釋放物件和分配物件是一組對稱的操作,同樣分為兩個路徑:

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 全自動 手動充電,操作方便,多重保超爾崎護電路,使用更安全 全自動化的充電過程 恆壓 恆流 浮充 可根據電池狀態及電池好壞情況完全自超爾崎動選擇充電模式及...