我在运行 2.6.3x 内核的基于 x86 的 Linux 系统中有这个要求..
我的进程有一些动态数据(不多,在几兆字节范围内),如果进程崩溃则必须恢复这些数据。显而易见的解决方案是将数据存储在共享内存中,并在进程重新启动时再次读取。必须谨慎地写入共享内存,以免更新过程中的进程崩溃导致共享内存中的数据损坏。
在自己编写代码之前,我只想检查是否有任何开源程序/库提供此功能。谢谢。
-Santhosh.
最佳答案
我认为您提出的设计不合理。操作系统崩溃(例如电源故障等),可能会导致 mmap 区域部分同步到光盘(可能页面的写入顺序与您写入它们的顺序不同等),这意味着您的数据结构将得到以任意方式损坏。
如果您需要您的数据库更改是持久的和原子的(也许一致性和完整性也不会受到伤害,对吗?)那么我强烈建议使用支持 ACID 或适当子集的现有数据库系统。也许 sqlite 或 Berkeley DB 可以解决问题。
原则上,你可以自己做,但不是按照你描述的方式——你需要创建某种日志文件,该文件以一种可以自动读回的方式更新,并且能够从一些已知快照等“重放”事件,这在技术上具有挑战性。
请记住:
- 操作系统故障可能导致由 msync() 或类似方法启动的写入部分完成到持久磁盘
- mmap 不保证永远不会在其他时间写回数据,即当您有一段时间没有调用 msync() 时
- 页面不一定按照您在内存中修改页面的顺序写回 - 例如您可以先写入 a[0],然后再写入 a[4096],并使 a[4096] 经久耐用,但 a[0] 不会在崩溃后发生。
- 即使刷新单个页面也不能绝对保证是原子的。
我意识到对数据结构的每次读取或写入操作都使用库(例如 bdb 或 sqlite)是一种侵入式更改,但如果您想要这种稳健性,我认为这是必要的。
关于linux - 进程重启后恢复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8109573/