/* powers-of-N allocation structures */
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_total; /* size of previous array */
unsigned int sl_curr; /* first free slot */ 空闲块的个数,跨页面
void *end_page_ptr; /* pointer to next free item at end of page, or 0 */ 每页是1M
unsigned int end_page_free; /* number of items remaining at end of last alloced page */ 每个页面内还有有空闲块
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 */
unsigned int killing; /* index+1 of dying slab, or zero if none */
size_t requested; /* The number of requested bytes */
} slabclass_t;
static slabclass_t slabclass[MAX_NUMBER_OF_SLAB_CLASSES];
slabclass_t 这个结构体定义了一个大小相等的要分配的空间的集合,就是说 slabclass_t
slabclass 是一个全局数组,按照从小到大顺序排列,每个元素代表分配的大小,分配时就是从这个数据进行查找,初始化时,按用户规定的最小值,乖以一个factor,依次增大,最大的能分配对象是1M
在回收空间时,就是记录在了slabclass_t->slots里面后就不释放了,并不是真正的释放空间,所以是一直审请,不释放的,内存迟早要耗光
分配1M的页面的时候,一种是每次用malloc,另一种是预先分配一块大内存,每次都从预先分配的分配。
平时使用的时候几乎没有封锁,对于多线程的时候,只是用pthread_mutex封锁了对应的get, put , replace的封锁,而且只有一个全局锁,没锁的级别与分类