我有多线程部分,线程需要分配几个大的数据段,比如每个大约100MB,用作缓冲区.此外,缓冲区可能需要在运行时调整几次.
自然的解决方案是使用realloc,但它可能会移动不需要的内存. free / malloc对调整大小缓冲区恐怕可能导致碎片并在手工创建其他问题之前保留内存.
我可以使用什么来分配/重新分配内存?
解决方法
使用free和malloc.这不会导致碎片问题.
现代分配器对内存碎片具有相当的抵抗力.这些天,它需要一个相当病态的程序来导致碎片问题.当我们的程序直接处理物理RAM时,碎片是一个更严重的问题,但是对于虚拟内存,程序堆中的大“漏洞”不需要消耗任何资源.
此外,由于缓冲区的大小,大多数分配器将从内核为每个缓冲区请求一个专用区域.在Linux / OS X / BSD上,这意味着每个缓冲区幕后的匿名mmap.这可能会导致地址空间碎片化,但64位系统上的虚拟地址空间基本上是免费的,而且32位上的几百兆也不是问题.
所以使用free和malloc.
替代方案:您可能会发现使每个缓冲区大于您需要的速度更快. malloc在现代Unix上工作的方式,你不写的任何页面都不消耗内存.
因此,如果您使用500 MB缓冲区,但只使用前100 MB,那么您的程序实际上不会使用比使用100 MB缓冲区并使用整个缓冲区更多的内存.您可以通过这种方式获得更多地址空间碎片,但这在64位系统上并不是问题,您可以随时调整分配大小,以便它也适用于32位系统.
至于使用mmap的建议,只需将malloc / free视为mmap / munmap的简单接口,这就是大型分配(1 MiB是一个常见的阈值).