搜尋

首頁  >  問答  >  主體

php - c語言程式設計中提及的記憶體碎片該怎麼理解?為什麼要盡可能避免他?

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

滿天的星座滿天的星座2756 天前951

全部回覆(3)我來回復

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-24 09:44:23

    內存分配器一般是預先向OS申請一大段內存,然後每次 malloc()時標記一小段為已分配,free()這一小段時再標成未分配。

    malloc/free的順序一般是任意的,那麼在多次malloc/free後分配和未分配會交替存在,如分配1 -- 未分配1 -- 分配2 -- 未分配2,即未分配記憶體是一個個"碎片"。

    記憶體碎片的壞處:

    • 額外佔用內存: 即使未分配總量足夠,仍然可能分不出連續內存,此時需要向OS申請更多

    • 影響cache: cache是​​以頁為單位的,一頁中的未分配部分一樣要佔用cache

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-06-24 09:44:23

    最好的方法就是不用系統的預設進程堆。而是自己申請一個新的記憶體堆。一類的資料放在一個堆裡。這適合頻繁申請和釋放的小段數據。
    也可以是自己先malloc一大塊數據,再用自己的記憶體池來管理。
    前一種,Windows的檔案管理器Explore有這麼用。例如遍歷的目錄樹結構,就是放在單獨的堆裡,一次HeapFree釋放整個堆,而不需要一次次把葉子節點釋放了。
    第二種,例如libjpeg本身就是有一個專門的記憶體池。

    回覆
    0
  • 为情所困

    为情所困2017-06-24 09:44:23

    • 可以了解一下buddy algorithm

    • 還有這個PDF

    • 打不開就翻牆哦

    • 想了解下malloc實作就去看看dlmalloc的源碼哦,不複雜

    回覆
    0
  • 取消回覆