2013-01-22 67 views
7

我對SLAB memory management mechanism的構造感到困惑。SLAB內存管理

我得知有多個特定於常用數據對象的'高速緩存',但爲什麼每個高速緩存都包含多個'平板'?

什麼區分緩存中的每個板塊?爲什麼不簡單地讓緩存充滿數據對象呢?爲什麼需要這個額外的層?

回答

12

板分配器是一個抽象層,可以更容易地分配相同類型的衆多對象。 接口提供功能

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

2

我可能來不及回答這個問題,但是這可能會幫助其他人。 正如我從Understanding Linux Virtual Memory Manager看到的那樣,有厚板有三大好處。

  1. 減少由夥伴系統引起的內部碎片。因爲我們擁有最適合較小對象的緩存。
  2. 更好的硬件高速緩存使用 - 通過將對象對齊以在不同平板中的不同偏移處開始,從而可以減少高速緩存線之間的干擾。這是基於我們已經物理索引緩存的假設。
  3. 板塊是緩存中的主要單元,它一次被獲取/放棄。這也會導致減少外部碎片(請參閱第3節。2從The Slab Allocator : An Object Caching Kernel memory Allocator)。
+0

如何減少內部碎片?通常平板僅部分滿了 – CodyBugstein

+2

@Imray:當數據大小小於分配用於容納數據的塊的大小時,會發生內部碎片。當您分配的緩存塊的大小與緩存對象的大小完全一致時,「內部」碎片會自動減少。部分滿足從未成爲碎片化的標準。 –

+0

如果板坯中物體尺寸的總和小於板坯尺寸,則會有類似的效果。考慮一個ext4 inode緩存對象,這發生在一個特定的內核中,大小爲1070字節。 SLAB分配器爲此選擇一個4k板,因爲它被標記爲可回收。 1070 * 3 =886個廢物字節。幾個字節用於內部自由列表,但超過20%的空間分配不能使用。而且,回收板中的一些inode可能會導致大塊內存不夠用,但在回收slab中剩餘的對象之前不能用於其他目的。 – GreenReaper