@@ -267,7 +267,43 @@ page分配完成后会将free_map对应整数的bit位从page_num至(page_num+pa
267267#### 5.1.3.3 Small分配 
268268small内存指的是小于(3/4 page_size)的内存,这些内存首先也是申请了1个或多个page,然后再将这些page按固定大小切割了,所以第一步与上一节Large分配完全相同。 
269269
270- small内存总共有30种固定大小的规格:8,16,24,32,40,48,56,64,80,96,112,128 ... 1792,2048,2560,3072。 
270+ small内存总共有30种固定大小的规格:8,16,24,32,40,48,56,64,80,96,112,128 ... 1792,2048,2560,3072 Byte,我们把这称之为slot,这些slot的大小是有规律的:最小的slot大小为8byte,前8个slot__依次递增8byte__,后面每隔4个递增值乘以2,即`slot 0-7递增8byte、8-11递增16byte、12-15递增32byte、16-19递增32byte、20-23递增128byte、24-27递增256byte、28-29递增512byte`,每种大小的slot占用的page数分别是:slot 0-15各占1个page、slot 16-29依次占5, 3, 1, 1, 5, 3, 2, 2, 5, 3, 7, 4, 5, 3个page,这些值定义在`zend_alloc_sizes.h`中: 
271+ 
272+ ```c 
273+ /* num, size, count, pages */ 
274+ #define ZEND_MM_BINS_INFO(_, x, y) \ 
275+  _( 0, 8, 512, 1, x, y) \ //四个值的含义依次是:slot编号、slot大小、slot数量、占用page数 
276+  _( 1, 16, 256, 1, x, y) \ 
277+  _( 2, 24, 170, 1, x, y) \ 
278+  _( 3, 32, 128, 1, x, y) \ 
279+  _( 4, 40, 102, 1, x, y) \ 
280+  _( 5, 48, 85, 1, x, y) \ 
281+  _( 6, 56, 73, 1, x, y) \ 
282+  _( 7, 64, 64, 1, x, y) \ 
283+  _( 8, 80, 51, 1, x, y) \ 
284+  _( 9, 96, 42, 1, x, y) \ 
285+  _(10, 112, 36, 1, x, y) \ 
286+  _(11, 128, 32, 1, x, y) \ 
287+  _(12, 160, 25, 1, x, y) \ 
288+  _(13, 192, 21, 1, x, y) \ 
289+  _(14, 224, 18, 1, x, y) \ 
290+  _(15, 256, 16, 1, x, y) \ 
291+  _(16, 320, 64, 5, x, y) \ 
292+  _(17, 384, 32, 3, x, y) \ 
293+  _(18, 448, 9, 1, x, y) \ 
294+  _(19, 512, 8, 1, x, y) \ 
295+  _(20, 640, 32, 5, x, y) \ 
296+  _(21, 768, 16, 3, x, y) \ 
297+  _(22, 896, 9, 2, x, y) \ 
298+  _(23, 1024, 8, 2, x, y) \ 
299+  _(24, 1280, 16, 5, x, y) \ 
300+  _(25, 1536, 8, 3, x, y) \ 
301+  _(26, 1792, 16, 7, x, y) \ 
302+  _(27, 2048, 8, 4, x, y) \ 
303+  _(28, 2560, 8, 5, x, y) \ 
304+  _(29, 3072, 4, 3, x, y) 
305+ ``` 
306+ ![ free_slot] ( img/free_slot.png ) 
271307
272308### 5.1.4 内存释放  
273309
0 commit comments