11

我对SLAB 内存管理机制的结构感到困惑。

我知道有多个特定于常用数据对象的“缓存”,但为什么每个缓存都包含多个“平板”?

缓存中的每个slab有什么区别?为什么不简单地用数据对象本身填充缓存呢?为什么需要这个额外的层?

4

2 回答 2

17

平板分配器是一个抽象层,可以更轻松地分配大量相同类型的对象。接口提供功能

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. 该结构包含有关其管理的板块的信息。

正如 Wikipedia 描述中所暗示的那样,这种额外层的目的是防止以简单直观的方式进行内存分配时可能发生的内存碎片问题。为此,它通过以下数据结构引入了平板的概念:

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 个它的slab列表,以 3 种风格收集:

  • 空板:这些板不包含使用中的对象。
  • 部分slab:这些slab包含当前使用的对象,但仍有可以容纳新对象的内存区域。
  • 完整的slabs:这些slabs包含正在使用的对象并且不能承载新的对象(完整的......)。

当通过slab分配器请求一个对象时,它会尝试在部分slab中获取所需的内存区域,如果不能,它将从一个空slab中获取。

如果你渴望收集更多关于这方面的信息,你应该看看 Robert Love 的Linux Kernel Development

于 2013-01-23T19:18:26.903 回答
3

我可能来不及回答这个问题,但这也可能对其他人有所帮助。正如我从Understanding Linux Virtual Memory Manager中看到的,拥有slab 具有三个主要好处。

  1. 减少好友系统造成的内部碎片化。因为我们有最适合较小对象的缓存。
  2. 更好的硬件缓存使用——通过对齐对象以在不同的平板中以不同的偏移量开始,这样可以减少缓存行之间的干扰。这是基于我们有物理索引缓存的假设。
  3. 一个slab是缓存中的主要单元,它被立即获取/放弃。这也会减少外部碎片

请参阅The Slab Allocator: An Object Caching Kernel memory Allocator (1994) 中的第 3.2 节。

于 2015-01-04T04:36:23.727 回答