作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们使用“shm_open”创建共享内存对象,然后使用“mmap”将其映射到内存区域。但是,稍后,当代码实际访问内存时,在某些极端情况下,由于底层物理内存耗尽,它会遇到“总线错误”。
这似乎是 Linux 中的通用事物,因为“mmap”仅映射虚拟内存地址空间,系统仅在您访问页面时分配实际物理内存。
我的问题是:我应该如何优雅地处理这样的“异常”?最佳做法是什么?我不希望程序在底层内存用完时崩溃,我想在这种情况下返回 ENOMEM。有办法实现吗?
谢谢。
最佳答案
在 Linux(使用 glibc)上,shm_open 创建的共享内存对象的实现是/dev/shm 中的实际文件。在正常情况下,在那个位置安装了一个带有默认选项的 tmpfs,即它的最大大小是物理内存的一半。如果这还不够,您可以创建文件以在有更多可用空间的其他地方映射,而不是使用 shm_open。
遇到这样的异常时,您几乎无能为力。特别是,您不能只返回 ENOMEM 或其他东西,因为异常是由对导致分配失败的 mmap 区域的任何写入引起的。这实际上可以是代码中对该区域的任何写入,编程语言中没有简单内存访问失败的概念,更不用说处理这种情况的方法了。
关于linux - 当底层物理内存用完时,如何处理访问 mmap 内存的总线错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391933/
我是一名优秀的程序员,十分优秀!