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