zend_mm_search_large_block
2015-09-15 17:29:48 1 举报
`zend_mm_search_large_block`是Zend引擎中的一个函数,主要用于在大型内存块中进行搜索操作。这个函数的主要作用是在大内存块中查找特定的数据或模式。它使用了一种高效的搜索算法,可以在大型数据集中快速定位到所需的信息。这种搜索方法通常用于处理大量的数据,如数据库查询、文件搜索等。通过使用`zend_mm_search_large_block`函数,可以提高搜索效率,减少内存消耗,从而提高整体性能。
作者其他创作
大纲/内容
return best_fit-next_free_block;
TRUE
break;走到这个分支,意味着根据true_size的每一位bit值,我们在heap-large_free_buckets[index];中没有能够“恰好”满足true_size的block
FALSE
for (p = rst; p; p = p-child[p-child[0] != NULL]) 如果在上面的搜寻中,虽然没有找到“恰好”满足true_size的block但记录了最后一个左孩子存在的分支的右孩子rst如果记录了rst,则在rst里面继续寻找
恰好满足
best_fit = p;
是1
somthing i dont understand
return null;large_free_buckets里面没有可以满足true_size需要的block
为1,则我们需要在右孩子中继续寻找
有
没有
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函数
是0
if (!bitmap)如果没有更大的block链表了
if (p-child[0])左孩子中是否有blk?
return NULL;
不满足
用
break;意味着在heap-large_free_buckets[index];中没有能够“恰好”满足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]
不恰好满足
为0,则我们需要在左孩子中继续寻找
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];将指针指向右孩子,进入下一循环
if (p-child[1])判断右孩子中是否有blk
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
return p-next_free_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
if (p-child[1]) { rst = p-child[1];}为避免左孩子中找不到合适的block,我们也记住当前的右孩子,一旦左孩子中找不到,我们可以使用右孩子中最小的block来满足truesize
p = heap-large_free_buckets[index];取该链表头部指针
while ((p = p-child[p-child[0] != NULL]))继续在孩子中寻找更小的block直到当前节点没有左孩子为止
0 条评论
下一页