классы slab и распределение памяти в memcached - PullRequest
0 голосов
/ 11 марта 2019

Недавно я начал изучать исходный код memcached и натолкнулся на эту структуру. Насколько я понимаю, существует приблизительно 64 плиты, и каждая плита представляет уникальный размер куска. Если мы возьмем первый класс плиты (скажем, размер 80), то на страницах, принадлежащих этой плите, будет разбита память на 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

Что он имеет в виду, сколько плит было выделено для класса плит? Каждый класс плиты должен быть уникальным, верно? почему в одном классе плит будет несколько плит? Я что-то упустил?

1 Ответ

0 голосов
/ 12 марта 2019

Выделенная плита класса slabclass_t - это, по сути, кусок памяти, в котором размещено perslab количество элементов размером size. Если все элементы в этом слэбе используются, Memcached выделяет другой кусок памяти и добавляет его в slab_list. Эти куски памяти также называются pages или slab_pages.

Таким образом, если вы запустите новый сервер Memcached и сохраните один элемент для класса плиты (скажем, размер = 80), то для этого класса плиты slabs=1. Как только вы сохраните perslab+1 предметов в этом классе, у вас будет slabs=2, а slab_list будет содержать 2 предмета.

По сути, у вас есть slab_list и slabs его длина, тогда как list_size это его емкость.

Я получил большую часть этого от slabs.c , так что поправьте меня, если я что-то не так.

...