linux - 当底层物理内存用完时,如何处理访问 mmap 内存的总线错误?

标签 linux memory mmap

我们使用“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/

相关文章:

linux - 有没有办法检索用户定义命令调用的脚本路径?

php - 内存耗尽cakephp数据库查询

linux - Linux 如何对待( protected )内存区域?

python - 在 C 和 Python 中映射同一个文件,它真的会使用共享内存吗? mmap 可以跨不同的编程语言工作吗?

c - 使用 mmap 和 memset 在 C 中分配内存

Linux Apache : what is the difference of DocumentRoot"path"and <Directory "path">?

linux - 如何在 bash 中存储 32 位小尾数法签名整数?

python - os.fork() 会在写入时使用复制还是在 Python 中复制父进程的完整副本?

android - 应用程序可以使用的最大 RAM 量是多少?

python - 如何从文本文件映射二维数组