zend_mm_add_to_free_list
2015-09-13 16:00:55 2 举报
`zend_mm_add_to_free_list`是Zend框架中的一个函数,用于将一个已分配的内存块添加到空闲列表中。这个函数的主要作用是在PHP的内存管理模块中,对已经释放的内存块进行回收和管理。当一个变量不再使用时,PHP会自动调用`zend_mm_add_to_free_list`函数,将该变量所占用的内存块添加到空闲列表中,以便在后续的内存分配过程中重复利用这些内存块,从而提高内存的使用效率。这个函数对于优化PHP程序的性能和减少内存浪费具有重要作用。
作者其他创作
大纲/内容
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
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都将目前最高位挤出
有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?
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 条评论
下一页