классы slab и выделение памяти в memcached

Недавно я начал просматривать исходный код 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

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


person arkham knight    schedule 11.03.2019    source источник


Ответы (1)


Выделенная плита класса 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, так что поправьте меня, если я что-то не так.

person Sascha Trifunovic    schedule 12.03.2019
comment
Привет, спасибо за объяснение. Я все еще не понимаю, в чем разница между страницами и плитами? Вы упомянули, что выделенная плита — это, по сути, кусок памяти, в котором размещается perslab элементов размера size. Относится ли элемент здесь к блоку, поскольку я понимаю блок как основные строительные блоки, которые хранят элементы в кеше? И когда вы ссылаетесь на slab, это то же самое, что slab_page или page? - person Happytreat; 06.01.2021
comment
Извините за путаницу. Когда я писал кусок памяти, я просто имел в виду кусок/область/кусок памяти. Вы правы, chunks — это блоки, в которых хранятся предметы. Таким образом, slab имеет perslab фрагмента, каждый из которых содержит один элемент. - person Sascha Trifunovic; 11.01.2021
comment
Да, как я упоминал выше, slabs также называют pages или slab_pages. - person Sascha Trifunovic; 11.01.2021