当底层物理内存耗尽时,如何处理访问mmap-ed内存的总线错误?

时间:2013-10-15 22:07:04

标签: linux memory mmap

我们使用“shm_open”创建共享内存对象,然后使用“mmap”将其映射到内存区域。但是,在以后的时间,当代码实际访问内存时,在某些极端情况下,当底层物理内存耗尽时,它将遇到“总线错误”。

这似乎是Linux中的通用内容,因为“mmap”仅映射虚拟内存地址空间,系统仅在您访问页面时分配实际物理内存。

我的问题是:我该如何优雅地处理这种“例外”?什么是最佳做法?当底层内存耗尽时,我不希望程序崩溃,我想在这种情况下返回ENOMEM。有没有办法实现这个目标?

感谢。

1 个答案:

答案 0 :(得分:1)

在Linux(使用glibc)上,shm_open创建的共享内存对象的实现是/ dev / shm中的实际文件。在正常情况下,在该位置安装有默认选项的tmpfs,即其最大大小是物理内存的一半。如果这还不够,你可以创建文件,以便在有更多可用空间的地方进行mmap。

当你遇到这样的例外时,你几乎无能为力。特别是你不能只返回ENOMEM或其他东西,因为异常是由于mmap的区域写入导致分配失败引起的。从字面上看,你可以在代码中写入该区域,并且编程语言中没有简单的内存访问失败的概念,更不用说处理这种情况了。

相关问题