zend_mm_search_large_block
2015-09-15 15:58:16 9 举报
`zend_mm_search_large_block`是Zend Memory Manager(Zend内存管理器)中的一个函数,用于在大块内存中搜索特定的数据。这个函数的主要作用是在大型内存块中查找是否存在指定的数据,如果找到,则返回该数据的起始地址和长度;如果没有找到,则返回NULL。这个函数通常用于优化内存管理,提高搜索效率。在使用Zend框架进行PHP开发时,可以通过调用这个函数来快速定位到需要处理的数据,从而提高程序的运行速度。
作者其他创作
大纲/内容
return best_fit-next_free_block;
TRUE
rst = NULL;右孩子为空
FALSE
for (p = rst; p; p = p-child[p-child[0] != NULL]) 如果在上面的搜寻中,虽然没有找到“恰好”满足true_size的block但记录了最后一个左孩子存在的分支的右孩子rst如果记录了rst,则在rst里面继续寻找
break;意味着在heap-large_free_buckets[index];中没有能够“恰好”满足true_size的block
恰好满足
best_fit = p;
somthing i dont understand
有
bitmap = bitmap 1;当前heap-large_free_buckets[index];确定找不到可以满足truesize的block了,那么看看bitmap中更高一位是否存有东西,往存着更大size的block链表里面去找吧
if (ZEND_MM_FREE_BLOCK_SIZE(p) ZEND_MM_FREE_BLOCK_SIZE(best_fit))如果找到更小的比truesize大的内存设为best_fit
如果p所在树的这一层正好满足true_size我们就使用这一层同大小block链表的最近一个insert进来的那个block,即p-next_free_block,为什么是next?详见add_to_free_list函数
if (!bitmap)如果没有更大的block链表了
if (p-child[0])左孩子是否有东西
没有
return NULL;
不满足
为0则需要在左孩子中继续寻找if (p-child[1])为避免左孩子中找不到合适的block,我们也记住当前的右孩子,一旦左孩子中找不到,我们可以使用右孩子中最小的block来满足truesize
return p-next_free_block;
rst = p-child[1];记录当前右孩子
用
return null;large_free_buckets里面没有可以满足true_size需要的block
if (UNEXPECTED(ZEND_MM_FREE_BLOCK_SIZE(p) == true_size))如果p指向的block的size恰好满足true_size
if (UNEXPECTED((bitmap & 1) != 0))通过bitmap来判断large_free_buckets[index]这一树表中是否有block因为large_free_buckets里面,index越大,里面的block大小越大所以我们先判断large_free_buckets[index]再判断large_free_buckets[larger]
不恰好满足
return p-next_free_block;
p = p-child[0];
bitmap = heap-large_free_bitmap index;将large_free_bitmap的最右边index位挪掉,剩余的最低位的位数即为原truesize的第index位
满足
index++;index加一,去更大的那个bucket中去找
当前节点不能恰好满足true_size,则需要继续在孩子中寻找p = p-child[p-child[0] != NULL]如果左孩子不为空,则去右孩子如果左孩子为空,则去左孩子
应该目前没用
)
p = p-child[1];
不为0需要在右孩子中继续寻找if (p-child[1])判断右孩子是否有东西
if ((m & (ZEND_MM_LONG_CONST(1) (ZEND_MM_NUM_BUCKETS-1))) == 0)判断当前最高位是0还是1
if (UNEXPECTED(ZEND_MM_FREE_BLOCK_SIZE(p) == true_size))当前节点block的大小是否“正好”满足truesize通过p-info._size来判断
for (m = true_size (ZEND_MM_NUM_BUCKETS - index); ; m = 1) 先将原truesize左移直到将最高位挤出,然后每次loop都将目前最高位挤出
if (best_fit)这一路上是否找到不是恰好满足但是也能满足的block
/* Search for smallest \"large\" free block */ best_fit = p = heap-large_free_buckets[index + zend_mm_low_bit(bitmap)];在更大的bucket里面寻找,先将这个更大的bucket的头部作为目前的最优选择best_fit
if (bitmap == 0)判断large_free_buckets[index or larger]中是否有blocks,来满足truesize的需求
index = ZEND_MM_LARGE_BUCKET_INDEX(true_size);index=truesize的最高位数的1的位数,比如index = LARGE_INDEX(80 = 1010000) = 6
p = heap-large_free_buckets[index];取该链表头部指针
while ((p = p-child[p-child[0] != NULL]))继续在孩子中寻找更小的block直到当前节点没有左孩子为止
0 条评论
下一页