【问题标题】:How to handle bus error for accessing mmap-ed memory when underlying physical memory runs out?当底层物理内存用完时,如何处理访问 mmap 内存的总线错误?
【发布时间】:2013-10-15 22:07:03
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

标签: linux memory mmap


【解决方案1】:

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

当您遇到此类异常时,您几乎无能为力。特别是您不能只返回 ENOMEM 或其他东西,因为异常是由对导致分配失败的 mmap 区域的任何写入引起的。这实际上可以是在您的代码中写入该区域的任何内容,并且在编程语言中没有简单内存访问失败的概念,更不用说处理这种情况的方法了。

【讨论】:

  • 明白了。但是,在 Linux 中是否有任何 API 可以测试这种“异常”,例如:“try_read(ptr)”,这样如果物理页面不可用并且只返回错误代码,API 就不会导致 SIGBUS?我问的原因是,在我的程序中,有一段代码可以访问这个内存。如果存在这样的 API,将会非常有用。
猜你喜欢
  • 2012-01-08
  • 2014-05-24
  • 1970-01-01
  • 2021-10-28
  • 2011-12-15
  • 1970-01-01
  • 2017-07-10
  • 2014-05-05
  • 2019-11-11
相关资源
最近更新 更多