c - mmap、msync 和 linux 进程终止

标签 c linux linux-kernel

我想使用 mmap 在 Linux 下运行的 C 程序中实现程序状态某些部分的持久化,方法是使用带有 MAP_SHARED 标志集的 mmap() 将固定大小的结构与众所周知的文件名相关联。出于性能原因,我宁愿根本不调用 msync(),并且没有其他程序会访问该文件。当我的程序终止并重新启动时,它将再次映射同一个文件并对它进行一些处理以恢复它在终止之前所处的状态。我的问题是:如果我从不在文件描述符上调用 msync() ,即使我的进程被 SIGKILL 终止,内核是否会保证所有对内存的更新都将写入磁盘并随后可恢复?此外,即使我的程序从不调用 msync(),内核是否会定期将页面写入磁盘而产生一般系统开销?

编辑: 我已经解决了数据是否被写入的问题,但我仍然不确定这是否会导致一些意外的系统加载过度尝试使用 open( )/write()/fsync() 并冒着如果进程被 KILL/SEGV/ABRT/etc 击中,一些数据可能丢失的风险。添加了一个“linux-kernel”标签,希望有知识的人可以插话。

最佳答案

我发现 Linus Torvalds 的评论回答了这个问题 http://www.realworldtech.com/forum/?threadid=113923&curpostid=114068

映射页面是文件系统缓存的一部分,这意味着即使对该页面进行更改的用户进程终止,该页面仍由内核管理,因为对该文件的所有并发访问都将通过内核,其他进程将从该缓存获得服务。 在一些旧的 Linux 内核中它是不同的,这就是为什么一些内核文档仍然告诉强制 msync 的原因。

编辑:感谢 RobH 更正了链接。

编辑:

从Linux 4.15开始引入了一个新的标志MAP_SYNC,可以保证一致性。

Shared file mappings with this flag provide the guarantee that while some memory is writably mapped in the address space of the process, it will be visible in the same file at the same offset even after the system crashes or is rebooted.

引用文献:

http://man7.org/linux/man-pages/man2/mmap.2.html在页面中搜索 MAP_SYNC

https://lwn.net/Articles/731706/

关于c - mmap、msync 和 linux 进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5902629/

相关文章:

linux - bash if 语句预期的一元运算符

c - x = -x 对于哪两个 int 值?

c - 为什么 inet_ntoa 总是返回 0.0.0.0 作为 ip 地址?

linux - 将 pandas 加载到 Slackware 14 上时遇到问题

linux - 获取按最近访问 bash 排序的窗口列表

linux - 在 Debian jessie 上安装 Subversion 1.7

c - Perf 缓冲区的确切大小是多少?

linux - 内核如何确定进程优先级

c++ - 垃圾收集的想法

c - 在 C 中使用 union 将 double float 分解为字节