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