我對SLAB memory management mechanism的構造感到困惑。SLAB內存管理
我得知有多個特定於常用數據對象的'高速緩存',但爲什麼每個高速緩存都包含多個'平板'?
什麼區分緩存中的每個板塊?爲什麼不簡單地讓緩存充滿數據對象呢?爲什麼需要這個額外的層?
我對SLAB memory management mechanism的構造感到困惑。SLAB內存管理
我得知有多個特定於常用數據對象的'高速緩存',但爲什麼每個高速緩存都包含多個'平板'?
什麼區分緩存中的每個板塊?爲什麼不簡單地讓緩存充滿數據對象呢?爲什麼需要這個額外的層?
板分配器是一個抽象層,可以更容易地分配相同類型的衆多對象。 接口提供功能
struct kmem_cache * kmem_cache_create(const char *name,
size_t size, size_t align, unsigned long flags,
void (*ctor)(void*));
這個函數創建一個新的slab分配器,將能夠處理的size
分配-bytes長對象。如果創建成功,則會將您的指針指向相關的struct kmem_cache
。該結構保存有關其管理的板坯的信息。
由於它隱含在維基百科描述中,因此這種額外層的目的是爲了防止如果以簡單直觀的方式進行內存分配時可能發生的內存碎片問題。爲了這樣做,它通過下列數據結構引入板坯的概念:
struct slab {
struct list_head list; /* embedded list structure */
unsigned long colouroff;
void *s_mem; /* first object in the slab */
unsigned int inuse; /* allocated objects in the slab */
kmem_bufctl_t free; /* first free object (if any) */
};
因此,kmem_cache
對象保持其板坯的3所列出,聚集在3種口味:
當通過板塊分配器請求一個對象時,它將嘗試獲取部分板塊內所需的內存區域,如果不能,它將從一個空的板塊獲取它。
如果你是熱衷於收集有關它的更多信息,你應該看看羅伯特·愛的Linux Kernel Development
我可能來不及回答這個問題,但是這可能會幫助其他人。 正如我從Understanding Linux Virtual Memory Manager看到的那樣,有厚板有三大好處。
如何減少內部碎片?通常平板僅部分滿了 – CodyBugstein
@Imray:當數據大小小於分配用於容納數據的塊的大小時,會發生內部碎片。當您分配的緩存塊的大小與緩存對象的大小完全一致時,「內部」碎片會自動減少。部分滿足從未成爲碎片化的標準。 –
如果板坯中物體尺寸的總和小於板坯尺寸,則會有類似的效果。考慮一個ext4 inode緩存對象,這發生在一個特定的內核中,大小爲1070字節。 SLAB分配器爲此選擇一個4k板,因爲它被標記爲可回收。 1070 * 3 =886個廢物字節。幾個字節用於內部自由列表,但超過20%的空間分配不能使用。而且,回收板中的一些inode可能會導致大塊內存不夠用,但在回收slab中剩餘的對象之前不能用於其他目的。 – GreenReaper