我们使用“shm_open”创建共享内存对象,然后使用“mmap”将其映射到内存区域。但是,在以后的时间,当代码实际访问内存时,在某些极端情况下,由于底层物理内存即将耗尽,它会遇到“总线错误”。
这似乎是 Linux 中的通用事物,因为“mmap”仅映射虚拟内存地址空间,系统仅在您访问页面时分配实际物理内存。
我的问题是:我应该如何优雅地处理这种“异常”?最佳实践是什么?我不希望当底层内存耗尽时程序崩溃,我想在这种情况下返回 ENOMEM。有没有办法做到这一点?
谢谢。
在 Linux(使用 glibc)上,共享内存对象 shm_open 创建的实现是 /dev/shm 中的实际文件。在正常情况下,有一个 tmpfs 安装在该位置,默认选项,即它的最大大小是物理内存的一半。如果这还不够,您可以创建文件以在其他有更多可用空间的地方进行映射,而不是使用 shm_open。
当你遇到这样的异常时,你几乎无能为力。特别是您不能只返回 ENOMEM 或其他东西,因为异常是由对导致分配失败的 mmap 区域的任何写入引起的。这实际上可以是在您的代码中写入该区域的任何内容,并且在编程语言中没有简单内存访问失败的概念,更不用说处理这种情况的方法了。