【问题标题】:SLAB memory managementSLAB 内存管理
【发布时间】:2013-01-05 04:28:06
【问题描述】:

我对@9​​87654321@ 的结构感到困惑。

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

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

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

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

    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:这些slab包含正在使用的对象并且不能承载新对象(完整...)。

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

    如果您渴望收集有关此的更多信息,您应该看看 Robert Love 的Linux Kernel Development

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如何减少内部碎片?通常平板只是部分满
      • @Imray :当数据大小小于分配用于保存数据的块大小时,会发生内部碎片。当您分配大小与缓存对象大小完全相同的缓存块时,“内部”碎片会自动减少。部分满从来都不是碎片化的标准。
      • 如果一个slab中对象大小的总和小于slab大小,也会有类似的效果。考虑一个 ext4 inode 缓存对象,它(在特定内核中)大小为 1070 字节。 SLAB 分配器为此选择了一个 4k 的平板,因为它被标记为可回收的。 1070 * 3 = 3210 + 886 个浪费字节。一些字节用于内部空闲列表,但不能使用超过 20% 的分配空间。此外,回收slab中的一些inode可能会导致内存块未满,但在回收slab中剩余的对象之前不能用于其他目的。
      • 同意,但是如果我们在其他分配器中谈论相同的内容,比如伙伴分配器,每个对象都会有碎片。在平板分配器中,您所说的碎片被用于更好的原因,例如缓存效率,在其他情况下则不同。请参考slab-colouring
      猜你喜欢
      • 2013-02-07
      • 2012-01-12
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2012-03-21
      相关资源
      最近更新 更多