php - c語言程式設計中提及的記憶體碎片該怎麼理解?為什麼要盡可能避免他?
滿天的星座
滿天的星座 2017-06-24 09:42:23
0
3
935

記憶體不是完全隨機讀寫嘛,和機械硬碟是不同的實體介質,那麼記憶體中是否有記憶體碎片為什麼還會影響效能呢?這個記憶體碎片到底是指什麼

滿天的星座
滿天的星座

全部回覆(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的源碼哦,不複雜

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板