【发布时间】:2013-01-05 04:28:06
【问题描述】:
我对@987654321@ 的结构感到困惑。
我知道有多个特定于常用数据对象的“缓存”,但为什么每个缓存都包含多个“slab”?
缓存中每个slab的区别是什么?为什么不简单地用数据对象本身填充缓存呢?为什么需要这个额外的层?
【问题讨论】:
标签: linux-kernel
我对@987654321@ 的结构感到困惑。
我知道有多个特定于常用数据对象的“缓存”,但为什么每个缓存都包含多个“slab”?
缓存中每个slab的区别是什么?为什么不简单地用数据对象本身填充缓存呢?为什么需要这个额外的层?
【问题讨论】:
标签: linux-kernel
平板分配器是一个抽象层,可以更轻松地分配大量相同类型的对象。 接口提供功能
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 的指针。该结构包含有关其管理的 slabs 的信息。
正如 Wikipedia 描述中所暗示的那样,这种额外层的目的是防止以简单直观的方式进行内存分配时可能发生的内存碎片问题。为此,它通过以下数据结构引入了 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) */
};
因此,kmem_cache 对象包含其 slabs 的 3 个列表,分为 3 种风格:
当通过slab分配器请求一个对象时,它会尝试在部分slab中获取所需的内存区域,如果不能,它会从一个空slab中获取。
如果您渴望收集有关此的更多信息,您应该看看 Robert Love 的Linux Kernel Development
【讨论】:
我可能来不及回答这个问题,但这也可能对其他人有所帮助。 正如我从Understanding Linux Virtual Memory Manager 看到的,拥有平板有三大好处。
参见The Slab Allocator: An Object Caching Kernel memory Allocator (1994) 的第 3.2 节。
【讨论】: