PHP源码分析(内存管理)
void *ptr=_emalloc(size);_efree(*ptr) //释放内存的时候只传入ptr,并没有传入释放内存大小
当我们申请一个size大小的内存的时候,我们多申请一些存起来,下次用户申请的时候,直接给出相应大小的内存即可,这样减少了用户态和内核态的切换,提高效率,内存回收的时候需要知道这个内存属于哪个内存页page,属于哪个chunk,以便回收
chunk内存会进行内存的预分配,使用mmap分配chunk
内存分类: Small(30种规格)(size<=3kB)
Large(3kb<size<=2MB-4KB)//4K的整数倍
Huge(size>2MB-4KB) //如果申请3MB内存,肯定返回比3MB大且2MB倍数内存
比如申请大小为7的内存,返回的大小为8的内存
内存分配流程:
如果有现成已经满足需要的small内存就直接返回,否则执行small_slow函数
调用mmap会申请大的内存
当调用samll_slow会先去large内存里面取一个page,如果page用完了,会从mm_chunk_alloc里面申请一个chunk
在small的30个规格中:
比如申请一个size是7的,我是直接找到包含7的最小的size,比如申请一个size=8的话,直接申请一个page,切割成了512个,其中一份返回回去,剩下的511个挂在
申请Small内存的时候:1、要找到size最小的规格 2、然后在chunk上申请一个page,如果一个page不够用的话,申请3个page,分成四份,把其中一份返回给用户,剩下的保存在mm_heap
回顾下free_slot字段的定义:
zend_mm_free_slot *free_slot[ZEND_MM_BINS];struct zend_mm_free_slot {zend_mm_free_slot *next_free_slot;
}
mm_heap里面有一个free_slot,是一个数组,挂了0-29,比如我们申请512的8字节,把第一个返回,剩下的511个按照链表的方式存起来
思考:为什么最小是8字节内存块
可以看出空闲内存链表的每个节点都是一个zend_mm_free_slot结构体,其只有一个next指针字段;因为8个字节恰好放next指针,因为需要维护链表,这里有一个next指针,需要占用内存的
思考:对于8字节大小的内存块,其next指针就需要占8字节的空间,那用户的数据存储在哪里呢?
答案:free_slot是small内存的空闲链表,空闲指的是未分配内存,此时是不需要存储其他数据的;当分配给用户时,此节点会从空闲链表删除,也就不需要维护next指针了;用户可以在8字节里存储任何数据;
思考:如何快速找到包含所需内存大小的最小规格呢?
答案:
Chunk的内存对齐
1、怎么定位快要释放内存是多大的
对任意地址p,如何计算页号? --2M字节对齐
chunk的大小为2M,首地址高43位为数字,低21位为0,他的地址为2M的整数倍
虚拟地址:chunk的首地址和chunk的偏移量进行构成
如何确保一个chunk的地址时2M字节对齐的呢?
我们申请内存的时候是由内存页来管理的,我们malloc出来的内存地址一定是4k的整数倍,
PHP源码分析(内存管理)相关推荐
- Python3.5源码分析-内存管理
Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的内存管理概述 python提供了对内存的垃圾收 ...
- v15.03 鸿蒙内核源码分析(内存映射) | 映射真是个好东西 | 百篇博客分析HarmonyOS源码
子曰:"德不孤,必有邻." <论语>:里仁篇 百篇博客系列篇.本篇为: v15.xx 鸿蒙内核源码分析(内存映射篇) | 映射真是个好东西 内存管理相关篇为: v11. ...
- v11.03 鸿蒙内核源码分析(内存分配) | 内存有哪些分配方式 | 百篇博客分析HarmonyOS源码
子曰:"君子周而不比,小人比而不周."<论语>:为政篇 百篇博客系列篇.本篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分配方式 内存管理相关篇为 ...
- nginx源码分析—内存池结构ngx_pool_t及内存管理
本博客( http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 0.序 1.内存池结构 1.1 ...
- Tomcat7.0源码分析——Session管理分析(上)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52450268 前言 对于广大java开发者而言, ...
- Memcached源码分析 - 内存存储机制Slabs(5)
Memcached源码分析 - 网络模型(1) Memcached源码分析 - 命令解析(2) Memcached源码分析 - 数据存储(3) Memcached源码分析 - 增删改查操作(4) Me ...
- linux内存源码分析 - 内存压缩(同步关系)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...
- Tomcat7.0源码分析——Session管理分析(下)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...
- Nginx源码分析-内存池
本文转自淘宝平台http://www.tbdata.org/archives/1390,不是为了夺他人之美,只是觉得写得很好,怕淘宝万一删掉就找不到了,放在这里保存一下.大家可以直接链接过去,他们那个 ...
- v35.03 鸿蒙内核源码分析(时间管理) | 内核基本时间单位是谁 | 百篇博客分析HarmonyOS源码
子曰:"譬如为山,未成一篑,止,吾止也:譬如平地,虽覆一篑,进,吾往也." <论语>:子罕篇 百篇博客系列篇.本篇为: v35.xx 鸿蒙内核源码分析(时间管理篇) | ...
最新文章
- 各种小的 dp (精)
- 在 Android 应用程序中使用 SQLite 数据库以及怎么用
- xgboost 正则项_深入理解Boosting算法(4)-XGBoost
- C#中使用SoundPlayer播放音频文件(wav文件)
- 计算机设备抽象,计算机系统原理(三) 金字塔形的存储设备、操作系统的抽象概念...
- fopen,fopen_s,fclose, _fcloseall函数用法
- pycharm 更改创建文件默认路径
- 注册Tomcat服务为系统服务
- 趣谈预留实例券,一文搞懂云上省钱最新玩法
- 信息学奥赛一本通(1209:分数求和)
- 关于 JVM 内存的 N 个问题(转)
- windowns定时关机命令
- WinRAR 密码 模板的秘密:
- windows使用密钥登录linux服务器
- 卫星遥感影像查询网址
- Netflix和它的混世猴子
- pythonyaml参数传递_configutator-将yaml节点和命令行参数映射到python函数参数。-Nolan configutator To use:...
- 自媒体平台数据统计分析爬虫之【趣头条】模拟登陆分析详解及数据统计接口详解
- 游戏思考30:技能碰撞检测分类枚举及逆水寒魔兽老兵服副本攻略(英雄武林风云录,后续更新舞阳城、扬州、清明等副本攻略)
- 使用hive做单词统计
热门文章
- JavaScript图片弹窗
- diffmerge使用
- 一维向量转换为n维向量_如何在N维上固定万向节锁
- 启动http-server html页面和css无法读取
- Petalinux入门教程一、使用.xsa文件新建petaLinux工程
- java jbutton添加图片代码_java-如何将图像添加到JButton
- 基于rf2o_laser_odometry纯激光里程计的gmapping建图
- 打开图片链接直接打开QQ对话框
- 很不错的两款icon图标选择组件
- python代码说明文档怎么写_Python写完代码怎么用