SLAB内存管理

Dar*_*s22 9 linux-kernel

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

我知道有多个'缓存'是特定于常用数据对象的,但为什么每个缓存包含多个'slabs'?

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

Rer*_*ito 14

slab分配器是一个抽象层,可以更容易地分配同一类型的众多对象.界面提供该功能

struct kmem_cache * kmem_cache_create(const char *name,
    size_t size, size_t align, unsigned long flags,
    void (*ctor)(void*));
Run Code Online (Sandbox Code Playgroud)

此函数创建一个新的slab分配器,它将能够处理size-bytes长对象的分配.如果创建成功,则会获得指向相关的指针struct kmem_cache.该结构保存有关其管理的板坯的信息.

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

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) */
};
Run Code Online (Sandbox Code Playgroud)

因此,该kmem_cache对象拥有3个板块列表,以3种口味聚集:

  • 空板:这些板不包含正在使用的对象.
  • 部分板块:这些板块包含当前使用的对象,但仍有可以容纳新对象的存储区域.
  • 全板:这些板包含正在使用的对象,不能托管新对象(完整...).

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

如果您渴望收集有关此内容的更多信息,请查看Robert Love的Linux内核开发