程序的类似冬眠的保存状态

hibernate-like saving state of a program

本文关键字:保存 状态 冬眠 程序      更新时间:2023-10-16

在c++或Java或Python中是否有任何方法允许我保存程序的状态,而不会被问任何问题?例如,我花了一个小时学习如何将树状结构保存到文件中。很有教育意义,但我觉得我只能这样做:

saveState(file);

和"文件"将包含我的程序使用的全部内存。就像操作系统的"休眠"或"挂起到磁盘"功能一样。我知道boost序列化,这可能不是我要找的

您最可能需要的是我们所说的序列化或对象编组。有一大堆关于数据/对象序列化的学术问题,你可以很容易地谷歌一下。

也就是说,给定正确的库(可能是非常原生的),您可以对正在运行的程序进行真正的快照,类似于"特定于操作系统的hibernate"。下面是在Linux上做这个的SO答案:https://stackoverflow.com/a/12190830/318174

要执行上述快照,您很可能需要一个来自您想要保存的进程的外部进程。我强烈建议你不要那样做。相反,在中阅读/查找您选择的语言(顺便说一句,欢迎来到SO,不要标记每种语言…这让人很恼火)如何进行序列化或对象编组……提示……现在大多数人选择JSON

我认为你所描述的是一个很少有人会真正想在一个真正的系统中使用的特性。通常,您希望保存一些内容,以便传输,或者停止运行程序,或者防止程序退出(或电源故障)的可能性。

在大多数生产系统中,人们希望对磁盘的写操作较小且是增量的,这样系统就可以保持响应,并且可以避免写入不一致的数据。定期将所有内存写入磁盘可能会导致大量无响应时间。您需要锁定整个系统以避免不一致的状态。

编写您自己的持久化是乏味且容易出错的,但是您可能会发现这个问题很有趣:持久化图形数据(Java)

围绕这一点有几个框架。如果您需要Java、Python和c++的支持,请查看Google Protocol Buffers https://developers.google.com/protocol-buffers/我在一些项目中使用过它,它工作得很好。

还有Thrift(最初来自Facebook) http://thrift.apache.org/我没有任何使用经验。

另一个选择是@QuentinUK建议的。使用继承自可流对象的类和/或创建可流操作符/函数。

我会用框架

你的问题是:

  • http://en.wikipedia.org/wiki/Address_space_layout_randomization

在古代(带有扩展程序的16位DOS程序),编译器曾经支持存储相对地址的"基于"指针。它们可以安全地连载。应用程序这样做,保存代码和数据,序列化的模块被称为"覆盖"。

今天,您需要在工具链中提供基于指针的支持(导致每个指针访问都需要额外的调整),或者遍历所有数据,将指针与其他数据区分(如何区分?)并将它们调整到新的存储位置,以防操作系统已经在旧程序用于其堆的相同地址加载了一些库。在现代"托管"环境中,指针已经必须为垃圾收集器标识,即使不经常这样做,这也是可行的。在本机代码中,这是非常困难的,尽管创建元数据是为了启用共享库的重定位。

因此,人们最终需要手动遍历整个数据结构,并将对象链接(指针)转换为可以在另一端恢复的东西,即使对象有一个新地址(再次,因为旧地址可能已被用于共享库)。

请注意,许多处理器都有支持基于寻址的特性…而且,由于基于寻址不再常见,编译器继续使用这些指针算术特性来加速用户代码。

是的,从streamable类中派生对象并添加流函数。然后您可以将所有内容流式传输到磁盘。为此,您需要一个库,例如MFC。