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頁還可以緩衝多少個對象。