slob被計劃在時間成熟時將其移除,slub對內存有限的微型設備已經足夠瞭。
盡管slob和slab/slub放在一起管理,但是它的實現理念與後兩者完全不同。slob的是基於傳統的K&R堆內存管理器實現的,算法時間復雜度為O(n)。每次要遍歷內存塊鏈表,查找合適大小的內存塊並從free鏈表中移除。
工欲善其事,必先利其器。在我們閱讀代碼之前,先瞭解其算法思想是極其重要的,否則會一頭霧水,不知所雲。
先瞭解一下K&R的3個組成要素:
所以每個內存塊內部有管理數據,分別是內存塊本身的尺寸和下一個可分配內存塊的地址,這樣組成一個單鏈表。內存塊結構如圖所示:
K&R空閑內存塊結構 參考[1]
所有空閑內存塊組成單鏈表形式,如下圖所示:
8eab75a34c7186faf5c8e020a2907064空閑內存塊單鏈表 參考[1]
瞭解瞭K&R內存分配器的結構,也就理解瞭slob中空閑內存塊的組織形式。因為它們的算法是一樣的。
f2c5001796679fba68c876af2fcf9857slob內存對象佈局 參考 [2]
當payload尺寸大於1個單元(假設每個單元2字節,slob中是按內存單元計數的),則第一個存儲單元用來存儲當前內存塊的實際可提供單元數,第二個存儲單元用來存儲下一個空閑內存塊的頁內偏移。如果payload的尺寸是1個單元,則該單元隻用來存儲下一個空閑內存塊的頁內偏移,即不需要存儲size值,因為我們知道它隻占1個單元的空間,即2個字節。空閑內存塊組成的單向鏈表如圖所示:
slob中的空閑塊所在的slab是由3個雙向循環鏈表所管理的,當申請的內存塊小於256字節時在free_slob_small鏈表中查找,當申請的內存塊小於1024字節大於256字節時在free_slob_medium鏈表中分配內存塊,否則在free_slob_large鏈表中申請內存塊。
與slab/slub一樣,slob也是用struct kmem_cache來表示,它的結構看起來很簡單,僅僅用若幹成員表示一些屬性,並沒有per cpu和per node相關的管理數據。具體參考下面代碼:
struct kmem_cache {
/* 對象大小 */
unsigned int object_size;/* The original size of the object */
/* 對象+對齊/填充的大小 */
unsigned int size; /* The aligned/padded/added on size */
/* 對象對齊的字節數 */
unsigned int align; /* Alignment as calculated */
slab_flags_t flags; /* Active flags on the slab */
unsigned int useroffset;/* Usercopy region offset */
unsigned int usersize; /* Usercopy region size */
/* slab的名稱 */
const char *name; /* Slab name for sysfs */
int refcount; /* Use counter */
void (*ctor)(void *); /* Called on object slot creation */
/* 用於鏈接到slab_caches鏈表上 */
struct list_head list; /* List of all slab caches on the system */
};
1 QQ美女主動要求裸聊,男人上鉤是生理決定,上鉤概率高達99%男人上鉤裸聊詐騙,有以下幾個原因:1.1 男人好色,是本性,美好...
华附国际部(HFI) 华附国际部全称为华南师范大学附属中学国际部,成立于2004年,系由广东省教育厅批准成立的华师附中国际基 ...
小学生必背古诗75首(附译文及注释) 因篇幅过长,部分展示,原文见: 小学生必背古诗75首(附译文及注释) 1、江南 【汉乐府 ...