zend_mm_add_to_free_list
2015-09-15 15:28:59 9 举报
`zend_mm_add_to_free_list`是Zend引擎中的一个函数,用于将一个已分配的内存块添加到空闲内存链表中。这个函数的主要作用是在不再需要使用某个内存块时,将其归还给Zend引擎的内存管理器,以便在其他需要分配内存的地方重复使用。通过这种方式,`zend_mm_add_to_free_list`有助于减少内存碎片,提高内存利用率,从而提高程序的性能。 在实际应用中,开发者通常不需要直接调用这个函数。Zend引擎会自动处理内存分配和释放,但了解这个函数有助于理解Zend引擎的内部工作原理。
作者其他创作
大纲/内容
if (ZEND_MM_FREE_BLOCK_SIZE(prev) != size)当前节点block的大小是否“正好”等于size?通过prev-info._size来判断
为NULL
完成任务
是large block
空的
p = &heap-large_free_buckets[index];获取large_free_buckets数组中第index个指针本身的地址
如果这个孩子不为NULL,将它作为新的prev进入下一循环直到我们找到新blk在large_free_buckets[index]中所属的位置为止
不等于size
if (prev-prev_free_block == prev) {heap-free_bitmap |= (ZEND_MM_LONG_CONST(1) free_bitmap来标记free_buckets[index]中已有可用free block
p = &prev-child[(m (ZEND_MM_NUM_BUCKETS-1)) & 1];因为新blk的size不等于当前prev指向的block的size那么我们要在prev的两个孩子里面选择下面该往哪走这取决于目前size的剩余的最高位是1还是0是0就往左孩子child[2]走,是1就往右孩子child[1]走
zend_mm_free_block *next = prev-next_free_block;prev-next_free_block = next-prev_free_block = mm_block;mm_block-next_free_block = next;mm_block-prev_free_block = prev; mm_block-parent = NULL;将当前prev指向的block的next指向新的block并做好相关设置
那我们就直接将新blk作为这个孩子*p = mm_block;mm_block-parent = p;mm_block-prev_free_block = mm_block-next_free_block = mm_block;
正好等于size
for (m = size (ZEND_MM_NUM_BUCKETS - index); ; m = 1) 先将size左移直到将最高位挤出,然后每次loop都将目前最高位挤出
mm_block-prev_free_block = prev;mm_block-next_free_block = next;prev-next_free_block = next-prev_free_block = mm_block;将mm_block链入表头和原首block之间,作为新的首block
index = ZEND_MM_BUCKET_INDEX(size);如果是个large block,获取它在free_buckets[]里面的index
有blk
k
if (!*p)p的内容是否为NULL?也就是large_free_buckets[index]指向的链表是否还没有block?
size = ZEND_MM_FREE_BLOCK_SIZE(mm_block);获取传入的block-info._size,这个值在block被传进来之前应该被set好,否则在这个函数里面我们无从得知它的大小,也不应该在这个函数中得知
if (!*p)看看我们选择的孩子是否为NULL?
是small block
zend_mm_free_block *prev = *p;prev指向目前large_free_buckets[index]的表头
index = ZEND_MM_LARGE_BUCKET_INDEX(size);如果是个large block它在large_free_buckets[]里面的index应该是它size的最高位1的位数比如size=20(10100)的index为4,即其最高位1的位置从右数第5个,位数为4
if (EXPECTED(!ZEND_MM_SMALL_SIZE(size)))它的size是否是一个large block?
mm_block-child[0] = mm_block-child[1] = NULL;
0 条评论
回复 删除
下一页