标签为“C”的页面如下
PHP内存管理ZMM(五)-大内存区large_free_bucket的存入
之前的章节中介绍过large_free_bucket的存入条件。这一篇将介绍large_free_bucket的主要结构包括其中的链表结构和树结构和存入取出流程。本章讲通过图示大内存区域内存分部情况。
什么时候会向large_free_bucket存入内存块
这里在复习下存入large_free_bucket流程。在调用emalloc申请能存,且在当前heap中没有找到合适内存块,emalloc函数会调用malloc向内核申请内存。向内核申请每次只能申请 heap->block_size倍数大小内存。所以内核申请到的 heap->block_size倍数 大小的内存并不会全部返回到emalloc调用者,而是有剩余。
PHP内存管理ZMM(四)-GDB调试php源码并手动调用ZMM相关函数
本章讲介绍gdb调试php,并手动调用ZMM中申请内存和查找大内存块的函数
- _zend_mm_alloc_int
- zend_mm_search_large_block
为什么要手动调用函数
在阅读PHP ZMM源码的时候,有许多复杂的逻辑仅仅通过阅读源码很难理解,比如大内存large_free_buckets结构的构造。同构手动调用函数,可以方便的执行要申请的内存大小,从而测试构造large_free_buckets结构
PHP内存管理ZMM(三)-内存分配函数emalloc
主流程
emalloc是ZMM中heap层实现的函数,其内部调用_zend_mm_alloc_int函数。在_zend_mm_alloc_int中会依次在heap层的缓存区、小内存区、大内存区、剩余内存区寻找合适的内存。如果在这四个区域中都为查找到合适的内存,则调用malloc向内核申请,在向内核申请内存时,申请的大小必须是segment_size(256k)的整数倍,最小为256k。以下用流程图展示
PHP内存管理ZMM(二)-常见宏的值
相关宏的定义
64位系统非debug模式编译后的
|
|
下面依次解释各个宏的含义和作用
- ZEND_MM_ALIGNMENT
内存对齐的时候用到,值为8,无特别的逻辑含义
ZEND_MM_ALIGNMENT_LOG2
辅助内存对齐的时候用到,值为3,无特别的逻辑含义
PHP内存管理ZMM(一)-基本概念、数据结构和相关初始化函数
基本概念
如上图所示,中间部分的zend memory manage由接口层、heap层、存储层(storage)组成。内存管理的主要逻辑在heap层中,后续主要讲解相关的数据结构和函数流程。
基本数据结构
基于PHP-5.6
zend_mm_block_info
_zend_mm_block_info是ZMM内存管理中最小的数据单元。各字段含义见代码注释