我对SLAB 内存管理机制的结构感到困惑。
我知道有多个特定于常用数据对象的“缓存”,但为什么每个缓存都包含多个“平板”?
缓存中的每个slab有什么区别?为什么不简单地用数据对象本身填充缓存呢?为什么需要这个额外的层?
我对SLAB 内存管理机制的结构感到困惑。
我知道有多个特定于常用数据对象的“缓存”,但为什么每个缓存都包含多个“平板”?
缓存中的每个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
. 该结构包含有关其管理的板块的信息。
正如 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中获取所需的内存区域,如果不能,它将从一个空slab中获取。
如果你渴望收集更多关于这方面的信息,你应该看看 Robert Love 的Linux Kernel Development
我可能来不及回答这个问题,但这也可能对其他人有所帮助。正如我从Understanding Linux Virtual Memory Manager中看到的,拥有slab 具有三个主要好处。
请参阅The Slab Allocator: An Object Caching Kernel memory Allocator (1994) 中的第 3.2 节。