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源码分析(内存管理)相关推荐

  1. Python3.5源码分析-内存管理

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的内存管理概述 python提供了对内存的垃圾收 ...

  2. v15.03 鸿蒙内核源码分析(内存映射) | 映射真是个好东西 | 百篇博客分析HarmonyOS源码

    子曰:"德不孤,必有邻." <论语>:里仁篇 百篇博客系列篇.本篇为: v15.xx 鸿蒙内核源码分析(内存映射篇) | 映射真是个好东西 内存管理相关篇为: v11. ...

  3. v11.03 鸿蒙内核源码分析(内存分配) | 内存有哪些分配方式 | 百篇博客分析HarmonyOS源码

    子曰:"君子周而不比,小人比而不周."<论语>:为政篇 百篇博客系列篇.本篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分配方式 内存管理相关篇为 ...

  4. nginx源码分析—内存池结构ngx_pool_t及内存管理

    本博客( http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 0.序 1.内存池结构 1.1 ...

  5. Tomcat7.0源码分析——Session管理分析(上)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52450268 前言 对于广大java开发者而言, ...

  6. Memcached源码分析 - 内存存储机制Slabs(5)

    Memcached源码分析 - 网络模型(1) Memcached源码分析 - 命令解析(2) Memcached源码分析 - 数据存储(3) Memcached源码分析 - 增删改查操作(4) Me ...

  7. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  8. Tomcat7.0源码分析——Session管理分析(下)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...

  9. Nginx源码分析-内存池

    本文转自淘宝平台http://www.tbdata.org/archives/1390,不是为了夺他人之美,只是觉得写得很好,怕淘宝万一删掉就找不到了,放在这里保存一下.大家可以直接链接过去,他们那个 ...

  10. v35.03 鸿蒙内核源码分析(时间管理) | 内核基本时间单位是谁 | 百篇博客分析HarmonyOS源码

    子曰:"譬如为山,未成一篑,止,吾止也:譬如平地,虽覆一篑,进,吾往也." <论语>:子罕篇 百篇博客系列篇.本篇为: v35.xx 鸿蒙内核源码分析(时间管理篇) | ...

最新文章

  1. 各种小的 dp (精)
  2. 在 Android 应用程序中使用 SQLite 数据库以及怎么用
  3. xgboost 正则项_深入理解Boosting算法(4)-XGBoost
  4. C#中使用SoundPlayer播放音频文件(wav文件)
  5. 计算机设备抽象,计算机系统原理(三) 金字塔形的存储设备、操作系统的抽象概念...
  6. fopen,fopen_s,fclose, _fcloseall函数用法
  7. pycharm 更改创建文件默认路径
  8. 注册Tomcat服务为系统服务
  9. 趣谈预留实例券,一文搞懂云上省钱最新玩法
  10. 信息学奥赛一本通(1209:分数求和)
  11. 关于 JVM 内存的 N 个问题(转)
  12. windowns定时关机命令
  13. WinRAR 密码 模板的秘密:
  14. windows使用密钥登录linux服务器
  15. 卫星遥感影像查询网址
  16. Netflix和它的混世猴子
  17. pythonyaml参数传递_configutator-将yaml节点和命令行参数映射到python函数参数。-Nolan configutator To use:...
  18. 自媒体平台数据统计分析爬虫之【趣头条】模拟登陆分析详解及数据统计接口详解
  19. 游戏思考30:技能碰撞检测分类枚举及逆水寒魔兽老兵服副本攻略(英雄武林风云录,后续更新舞阳城、扬州、清明等副本攻略)
  20. 使用hive做单词统计

热门文章

  1. JavaScript图片弹窗
  2. diffmerge使用
  3. 一维向量转换为n维向量_如何在N维上固定万向节锁
  4. 启动http-server html页面和css无法读取
  5. Petalinux入门教程一、使用.xsa文件新建petaLinux工程
  6. java jbutton添加图片代码_java-如何将图像添加到JButton
  7. 基于rf2o_laser_odometry纯激光里程计的gmapping建图
  8. 打开图片链接直接打开QQ对话框
  9. 很不错的两款icon图标选择组件
  10. python代码说明文档怎么写_Python写完代码怎么用