在内存压力下匿名mmap优于malloc的优点
Advantages of anonymous mmap over malloc under memory pressure
我正在运行一些大型数组处理代码(在运行Linux的奔腾上)。数组的大小足够大,以便进程进行交换。到目前为止,它是工作的,可能是因为我试图保持我的读和写连续。然而,我很快就需要处理更大的数组。在这种情况下,切换到匿名映射块会有帮助吗?
如果有,请解释一下原因。
在我的浅显理解中,mmap实现了一个从tmpfs分区挂载的内存映射文件,该文件在内存压力下会回落到交换机制。我想了解的是mmap如何比标准malloc做得更好(为了论证的缘故,我假设它确实更好,我不知道它是否如此)。
注意:请不要建议获得64位或更多的RAM。遗憾的是,这不是一个选项。
支持malloc()
分配的内存由内核以与支持mmap()
创建的私有匿名映射的内存大致相同的方式处理。事实上,对于大型分配,malloc()
将创建一个与mmap()
的匿名映射来支持它,因此您不太可能通过显式地使用mmap()
来看到太大的区别。
在一天结束时,如果您的工作集超过了物理内存大小,那么您将需要使用swap,并且无论您使用mmap()
还是malloc()
创建的匿名映射都不会改变这一点。您能做的最好的事情是尝试重构您的算法,使其具有良好的引用局部性,这将减少交换对您的伤害程度。
您还可以尝试通过madvise()
系统调用给内核一些关于内存使用情况的提示。
这里的关键区别在于,使用malloc(3)
-ed输入缓冲区时,您要求内核从已经存在于内存中的文件映射页面复制数据,而使用mmap(2)
时,您只需使用这些页面。第一种方法将备份您的和内核内缓冲区所需的物理内存量增加一倍,而第二种方法共享物理内存,并且只增加useland进程的虚拟映射数量。
- 如果没有malloc,链表实现将失败
- malloc() 可能出现内存泄漏
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 在C++中创建队列 - 什么是 malloc 错误?
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 malloc() 时出现意外大小
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 将 malloc 替换为数组
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何将新更改为 malloc?
- 将 malloc 转换为新的正确方法
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 如何通过 malloc 为队列数组分配内存?
- 正在调试 malloc():新内存损坏
- 我怎样才能代替使用新的使用malloc翻译
- C++程序错误:malloc():内存损坏
- 在内存压力下匿名mmap优于malloc的优点