gpt4 book ai didi

linux-kernel - SLAB内存管理

转载 作者:行者123 更新时间:2023-12-04 03:24:01 24 4
gpt4 key购买 nike

我对SLAB memory management mechanism的结构感到困惑。

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

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

最佳答案

平板分配器是一个抽象层,可简化对相同类型的多个对象的分配。
界面提供功能

struct kmem_cache * kmem_cache_create(const char *name,
size_t size, size_t align, unsigned long flags,
void (*ctor)(void*));

此函数创建一个新的平板分配器,该分配器将能够处理 size -bytes长对象的分配。如果创建成功,您将获得指向相关 struct kmem_cache的指针。该结构包含有关其管理的平板的信息。

就像在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对象保存了其平板的3个列表,以3种方式收集:
  • 空板:这些板不包含使用中的对象。
  • 部分平板:这些平板包含当前使用的对象,但仍有存储区域可以容纳新对象。
  • 完整平板:这些平板包含正在使用的对象,并且不能承载新对象(完整...)。

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

    如果您想收集有关此方面的更多信息,则应该看看罗伯特·洛夫(Robert Love)的 Linux Kernel Development

    关于linux-kernel - SLAB内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14450133/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com