您可能知道很多程序,例如一些密码破解程序,我们可以在它们运行时停止它们,当我们再次运行程序时(无论是否输入相同的输入),它们都能够继续从他们离开的地方。我想知道那些程序正在使用什么样的技术?
[编辑]我正在编写一个主要基于递归函数的程序。据我所知,我认为在我的程序中保存这些状态是非常困难的。是否有任何技术,以某种方式,保存我的程序中涉及的堆栈内容,函数调用和数据,然后当它重新启动时,它可以运行,就好像它没有被停止?这只是我心中想到的一些概念,所以请原谅我,如果它没有意义......
答案 0 :(得分:2)
使用持久性。
持久性是一种机制,通过这种机制,对象的生命周期超出了程序的执行生命周期。
使用序列化将流程中涉及的对象的状态存储在本地硬盘上。
答案 1 :(得分:2)
每个节目都会有所不同。对于像蛮力密码破解者那样简单的东西,真正需要保存的是最后一次尝试的密码。对于其他应用程序,您可能需要存储多个数据点,但实际上它也是如此:保存并加载重建所需位置所需的最少量信息。
另一种常见技术是保存整个程序状态的图像。如果你曾经玩过能够保存状态的游戏机模拟器,那就是他们这样做的方式。 Python中存在类似的技术,用于酸洗。如果环境足够稳定(即:没有变化的指针),您只需将整个应用程序内存状态复制到二进制文件中。如果要恢复,请将其复制回内存并重新开始运行。这为您提供了接近完美的状态恢复,但是它是否完全可以依赖于环境/语言。 (例如:如果没有操作系统的帮助,大多数C ++应用程序都无法做到这一点,或者考虑到这一点而非常谨慎地构建它们。)
答案 2 :(得分:1)
要实现这一点,您需要不断保存状态(即您在计算中的位置)。这样,如果你中断了probram,当它重新启动时,它会知道它正处于计算的中间,并且它在那个计算中。
您可能还希望将主计算放在与用户界面不同的线程中 - 这样您就可以响应来自用户界面的“关闭/中断”请求,并通过停止/暂停线程来适当地处理它们。
答案 3 :(得分:0)
对于linux,有一个名为CRIU的项目,它支持进程级保存和恢复。它非常类似于休眠和恢复操作系统,但粒度分解为进程。它还支持容器技术,特别是Docker。有关详细信息,请参阅http://criu.org/。