内存分配器建议

我有多线程部分,线程需要分配几个大的数据段,比如每个大约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是一个常见的阈值).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...