zend_mm_alloc_int_summary
2015-09-14 00:14:58 1 举报
`zend_mm_alloc_int_summary`是Zend引擎中的一个函数,主要用于内存管理。这个函数的主要作用是在PHP的内存管理器中分配一个整数类型的内存块。在PHP中,所有的变量都是存储在内存中的,而`zend_mm_alloc_int_summary`就是用来为这些变量分配内存的。这个函数会根据需要分配适当大小的内存,并将分配的内存地址返回给调用者。这样,调用者就可以在这个内存地址上存储和操作数据了。这个函数的使用可以有效地管理PHP的内存使用,避免因为内存不足而导致的程序崩溃。
作者其他创作
大纲/内容
heap-cache[index] == NULL?heap-cache[]中是否有能够满足true_size的block
在cache、free_buckets[]、larger_free_buckets[]、rest_buckets里面都没找到只好向OS申请新的block了新内存是以segment为单位申请的,放入segment_list当中,然后将segment按需求一次次地切分为一个个block,然后用free_buckets等链表将这些block连起来
放不下了
if heap-real_size = heap-limit - heap-block_size ?如果再新申请一个默认block_size大小的block,会不会使heap大小超限?
要
return ZEND_MM_DATA_OF(best_fit);跳过将best_fit指向的block中,被heap用于维护block数据结构的部分将实际可被用户使用的内存的起始地址(best_fit+sizeof(block))返回
会
没有
找到了
问题:为啥确定free_buckets[index]里面的block的大小就一定可以满足true_size?
if (true_size heap-block_size - (ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE))如果扣除每个segment必要的segment结构体与最后一个守卫block的大小,heap默认的block_size是否还能剩余至少true_size来满足用户的需求?
best_fit = (zend_mm_free_block *) ((char *) segment + ZEND_MM_ALIGNED_SEGMENT_SIZE);在新的segment中,跳过最开始的heap用于维护segment_list的数据结构,就是可用的block
size_t true_size = ZEND_MM_TRUE_SIZE(size)真实需要的size = 调用方需要的size + heap内部维护一个block所需要的额外数据结构的size
不会
true_sizes不是一个smallsize
能放下另一个block
best_fit = heap-cache[index];
block_size = segment_size - ZEND_MM_ALIGNED_SEGMENT_SIZE - ZEND_MM_ALIGNED_HEADER_SIZE;计算我们即将返回给用户的best_fit这个block的大小,在这个分支中(block是新申请segment的第一个block)block_size就是整个segment的大小减去每个segment必要的segment结构体的大小和最后一个守卫block的大小
best_fit = heap-free_buckets[index*2];
有
if ZEND_MM_SMALL_SIZE(true_size)判断true_size是否是一个小small_sizesmall_size = NUM_BUCKETS3 + MIN_HD_SIZE在free_buckets[]中,每一个bucket里面的所有block的size之间的差距都在8个byte之内而整个free_buckets[]有NUM_BUCKETS个bucket所以如果一个size减去MIN_HD_SIZE(heap用来维护block所必须的数据结构)后即其实际能够提供给用户使用的size,仍能够落入前NUM_BUCKETS个bucket(即free_buckets[])中,则它属于一个smallsize注:NUM_BUCKETS=sizeof(size_t)3,即用来表示size的类型的bit位数
if (!best_fit)目前为止,找到了吗?
segment_size = heap-block_size;申请block_size大小的内存即block_size是heap向系统申请内存的最小单元
没找到
不要
if (EXPECTED(!keep_rest))是否要将这个新的free block放入rest_buckets里面?
默认的block_size不够用
if (bitmap = heap-free_bitmap index) != NULL利用free_bitmap的第index位判断free_buckets[index]中是否有空闲block
true_sizes是一个smallsize
goto zend_mm_finished_searching_for_block;无论从哪个分支过来,到了这里,best_fit已经指向了我们即将返回给用户的block而且这个block一定是heap中已经有的空闲的block
block_size = ZEND_MM_FREE_BLOCK_SIZE(best_fit);计算我们即将返回给用户的best_fit这个block的大小,在这个分支中(block是我们在heap的现有可用链表中找到的已有block)block_size就是best_fit-info._size
到了这一步,我们已经确定了即将返回给用户的block的位置即best_fit指向的地方,(无论是在已有的block里面找到的,还是新申请的),但我们还需要确定到底返回给用户这个block的全部还是一部分,即并按情况处理这个block以及剩余的partial blockremaining_size = block_size - true_size;计算我们现在即将返回给用户的best_fit这个block的size,除去用户真正需要的true_size,还剩余多少size
segment-next_segment = heap-segments_list;heap-segments_list = segment;将新alloc的segment放在heap-segment_list的头部
set best_fit
默认的block_size可以满足
index = ZEND_MM_BUCKET_INDEX(true_size)index = (true - MIN_HD_SIZE)3根据true_size,看看除去MIN_HD_SIZE(heap用来维护block所必须的数据结构)后,即其实际能够提供给用户使用的size,它会落在哪个bucket中
return ZEND_MM_DATA_OF(best_fit);
segment = (zend_mm_segment *) ZEND_MM_STORAGE_ALLOC(segment_size);调用storage层函数真正地向OS申请新内存
到了这里,我们终于确定最终我们将要返回给用户的block,即best_fit的位置,并且在它的block数据结构中标记了它的used size即它会被使用的大小
if (!best_fit)找到了吗?
ZEND_MM_MARK_FIRST_BLOCK(best_fit);通过best_fit-info._prev = 0x3L的方法将best_fit标记为整个segment的第一个block
尝试在heap-rest_buckets[]中寻找能够满足true_size需求的block找到了就set best_fit
if (remaining_size ZEND_MM_ALIGNED_MIN_HEADER_SIZE)剩余的rem_size是否还足以成为另一个block(至于能装下一个heap用于维护block的必要的数据结构)?
0 条评论
回复 删除
下一页