簡體   English   中英

內存分配器建議

[英]Memory allocator suggestion

我有多線程部分,線程需要分配幾個大的數據段,比如每個大約100MB,用作緩沖區。 此外,緩沖區可能需要在運行時調整幾次。

自然的解決方案是使用realloc但它可能會移動不需要的內存。 free/malloc對調整大小緩沖區恐怕可能導致碎片並在手工創建其他問題之前保留內存。

我可以使用什么來分配/重新分配內存?

使用freemalloc 這不會導致碎片問題。

現代分配器對內存碎片具有相當的抵抗力。 這些天,它需要一個相當病態的程序來導致碎片問題。 當我們的程序直接處理物理RAM時,碎片是一個更嚴重的問題,但是對於虛擬內存,程序堆中的大“漏洞”不需要消耗任何資源。

此外,由於緩沖區的大小,大多數分配器將從內核為每個緩沖區請求一個專用區域。 在Linux / OS X / BSD上,這意味着每個緩沖區幕后的匿名mmap 這可能會導致地址空間碎片化,但64位系統上的虛擬地址空間基本上是免費的,而且32位上的幾百兆也不是問題。

所以使用freemalloc

替代方案:您可能會發現使每個緩沖區大於您需要的速度更快。 malloc在現代Unix上工作的方式,你不寫的任何頁面都不消耗內存。

所以,如果你malloc一個500 MB緩沖區,但只用前100 MB,你的程序實際上並未使用比你更多的內存malloc 100 MB緩沖區,並使用了整個事情。 通過這種方式可以獲得更多的地址空間碎片,但這在64位系統上不是問題,您可以隨時調整分配大小,以便它也可以在32位系統上運行。

至於使用mmap建議,只需將malloc / free視為mmap / munmap的簡單接口,這就是大型分配(1 MiB是一個常見的閾值)。

只需使用realloc 在現代系統中,即使緩沖區移動到新地址,移動也會通過操作頁表(在Linux上, mremap ;我確定其他系統具有類似的機制)而不是通過復制數據來實現。 (請注意,我假設大緩沖區;對於小緩沖區,通常小於幾百kb,實際復制將會發生。)

如果您的目標是64位計算機,則完全不需要擔心內存碎片。 你永遠不會破壞內存,以至於耗盡虛擬地址空間。 如果你也需要處理32位機器,只要你沒有太多的線程,你就可以安全了。 只要總內存消耗小於1GB, 假設您的使用模式 ,由於碎片而耗盡虛擬地址空間將非常困難。 如果您擔心它,只需預先分配您可能需要的最大尺寸。

使用malloc / realloc / free實現您的解決方案並對其進行分析。 如果內存分配有問題,您可以使用更好的malloc實現,例如facebook的jemalloc或google的tcmalloc

有關兩者的比較,請參閱C ++內存分配機制性能比較(tcmalloc與jemalloc)

他們都非常擅長處理內部/外部碎片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM