php - Wie ist die in der C-Sprachprogrammierung erwähnte Speicherfragmentierung zu verstehen? Warum sollte man ihm möglichst aus dem Weg gehen?
滿天的星座
滿天的星座 2017-06-24 09:42:23
0
3
941

Ist das Lesen und Schreiben im Speicher nicht völlig zufällig? Es handelt sich um ein anderes physisches Medium als die mechanische Festplatte. Warum wirkt es sich also auf die Leistung aus, wenn sich im Speicher Speicherfragmente befinden? Worauf genau bezieht sich diese Speicherfragmentierung?

滿天的星座
滿天的星座

Antworte allen(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的源码哦,不复杂

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage