php - c语言编程中提及的内存碎片该怎么理解?为什么要尽可能避免他?
滿天的星座
滿天的星座 2017-06-24 09:42:23
0
3
919

内存不是完全随机读写嘛,和机械硬盘是不同的物理介质,那么内存中是否有内存碎片为什么还会影响性能呢?这个内存碎片到底是指什么

滿天的星座
滿天的星座

全部回复(3)
女神的闺蜜爱上我

内存分配器一般是预先向OS申请一大段内存,然后每次 malloc()时标记一小段为已分配,free()这一小段时再标成未分配。

malloc/free的顺序一般是任意的,那么在多次malloc/free后分配和未分配会交替存在,如分配1 -- 未分配1 -- 分配2 -- 未分配2,即未分配内存是一个个"碎片"。

内存碎片的坏处:

  • 额外占用内存: 即使未分配总量足够,仍然可能分不出连续内存,此时需要向OS申请更多

  • 影响cache: cache是以页为单位的,一页中的未分配部分一样要占用cache

phpcn_u1582

最好的办法就是不用系统的默认进程堆。而是自己申请一个新的内存堆。一类的数据放在一个堆里。这适合频繁申请和释放的小段数据。
也可以是自己先malloc一大块数据,再用自己的内存池来管理。
前一种,Windows的文件管理器Explore有这么用。比如遍历的目录树结构,就是放在单独的堆里,一次HeapFree释放整个堆,而不需要一次次把叶子节点释放了。
第二种,比如libjpeg自己就是有一个专门的内存池。

为情所困
  • 可以了解一下buddy algorithm

  • 还有这个PDF

  • 打不开就翻墙哦

  • 想了解下malloc实现就去看看dlmalloc的源码哦,不复杂

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板