【问题标题】:slab classes and memory allocation in memcachedmemcached中的slab类和内存分配
【发布时间】:2019-03-11 17:04:49
【问题描述】:

我最近开始浏览 memcached 源代码,并且遇到了这种结构。根据我的理解,大约有 64 个平板,每个平板代表一个独特的块大小。如果我们采用第一个slab类(大小为80,比如说),那么属于这个slab的页面将把它的内存分成80个字节。

typedef struct {
  unsigned int size;      // sizes of items
  unsigned int perslab;   // how many items per slab

  void *slots;            // list of item ptrs
  unsigned int sl_curr;   // total free items in list

  unsigned int slabs;     // how many slabs were allocated for this class

  void **slab_list;       // array of slab pointers
  unsigned int list_size; // size of prev array

  size_t requested;       // The number of requested bytes

} slabclass_t;

这行我看不懂,

unsigned int slabs;     // how many slabs were allocated for this class

他所说的为一个slab类分配了多少个slab是什么意思?每个slab类都必须是唯一的,对吗?为什么一个slab类中有多个slab?我错过了什么吗?

【问题讨论】:

    标签: caching memory memcached libmemcache slab


    【解决方案1】:

    分配的类slabclass_t 的slab 基本上是一块内存,它承载perslab 大小为size 的项目数。如果使用了该slab 中的所有项目,Memcached 会分配另一块内存并将其添加到slab_list。这些内存块也称为pagesslab_pages

    因此,如果您启动一个新的 Memcached 服务器并为一个slab 类存储一个项目(比如size=80),那么对于这个slab 类slabs=1。在该类中存储 perslab+1 项目后,您将拥有 slabs=2 并且 slab_list 将包含 2 个项目。

    基本上,您有一个 slab_listslabs 它的长度,而 list_size 是它的容量。

    我从slabs.c 获得了大部分内容,如果我有什么错误,请纠正我。

    【讨论】:

    • 您好,谢谢您的解释。我仍然对页面和平板之间的区别感到困惑?您提到分配的slab 基本上是一块内存,其中托管perslab 大小为size 的项目数。由于我将块理解为将项目存储在缓存中的基本构建块,这里的“项目”是否指的是块?而当你提到slab的时候,是和slab_page还是page一样?
    • 很抱歉给您带来了困惑。当我写“内存块”时,我只是指一块/区域/一片内存。你是对的,chunks 是存储项目的块。所以 slabperslab 块,每个块都包含一个项目。
    • 是的,正如我上面提到的,slabs 也称为pagesslab_pages
    猜你喜欢
    • 2012-01-12
    • 2012-05-07
    • 2013-01-05
    • 2015-01-18
    • 2013-02-07
    • 2014-06-27
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多