1. 对这个SLAB内存池实在没什么好说的,比较直白。
简单介绍一下各个参数吧。
2. setting的与SLAB相关的参数
chunk_size:这是SLAB所存储的最小对象大小,包括sizeof(item) + key + value。
item_size_max:这是SLAB所存储的最大对象大小。默认是1MB。
factor:默认系数1.25. 比如说,第一个SLAB缓存大小为32字节的对象,那么第二个SLAB缓存大小为40字节的对象。以此类推,1MB为上限。
maxbytes:内存池所能占有的内存上限。
3. slabclass_t中的参数
void **slab_list; /* array of slab pointers */
unsigned int list_size; /* size of prev array */
可以想象成是void* slab_list[list_size];
每个SLAB槽(总共不超过200个),可以分配多个相同的SLAB页,在此管理;
每个SLAB页都是一块连续内存,大小为该SLAB槽的 size * perslab。 前者是所缓存的对象尺寸,后者是该SLAB页能存储该对象的最大个数。
unsigned int slabs; /* how many slabs were allocated for this class */
上面这个参数就是所分配的页数目
void **slots; /* list of item ptrs */
unsigned int sl_total; /* size of previous array */
unsigned int sl_curr; /* first free slot */
这里保存被释放的对象,显然不是连续的内存。slots改名字叫做freeslots更合适点。
sl_total表示slots数组的大小,而sl_curr表示当前可用的空闲slots,如果sl_curr等于sl_total,就需要重新分配slots了。
void *end_page_ptr; /* pointer to next free item at end of page, or 0 */
unsigned int end_page_free; /* number of items remaining at end of last alloced page */
第一个参数指向当前slab槽中可用的那个slab页;
第二个参数指示该slab页还可以缓存多少个对象。