【问题标题】:How to save a program's progress, and resume later?如何保存程序的进度,并在以后恢复?
【发布时间】:2010-12-23 18:36:15
【问题描述】:

您可能知道很多程序,例如一些密码破解程序,我们可以在它们运行时停止它们,当我们再次运行程序时(输入或不输入相同的输入),它们将能够继续从他们离开的地方。我想知道这些程序使用了什么样的技术

[编辑] 我正在编写一个主要基于递归函数的程序。据我所知,我认为在我的程序中保存这些状态非常困难。有没有什么技术,以某种方式,保存我的程序中涉及的堆栈内容、函数调用和数据,然后当它重新启动时,它可以像没有停止一样运行?这只是我脑海中的一些概念,如果没有意义,请原谅我......

【问题讨论】:

    标签: process suspend


    【解决方案1】:

    每个程序都会有所不同。对于像暴力破解密码这样简单的事情,真正需要保存的是最后一次尝试的密码。对于其他应用程序,您可能需要存储多个数据点,但仅此而已:保存和加载重建您所在位置所需的最少信息量。

    另一种常用技术是保存整个程序状态的图像。如果您曾经玩过具有保存状态功能的游戏机模拟器,那么他们就是这样做的。 Python 中也存在类似的酸洗技术。如果环境足够稳定(即:没有变化的指针),您只需将整个应用程序内存状态复制到二进制文件中。当您想恢复时,将其复制回内存并再次开始运行。这为您提供了近乎完美的状态恢复,但它是否可能完全取决于环境/语言。 (例如:大多数 C++ 应用程序在没有操作系统帮助的情况下都无法做到这一点,或者如果它们是在考虑到这一点的情况下非常仔细地构建的。)

    【讨论】:

    • 哇,这信息量很大。我会仔细看看它。非常感谢。 :D
    【解决方案2】:

    使用持久性

    持久性是一种机制,通过该机制,对象的生命周期会超出程序的执行生命周期。

    使用序列化将进程中涉及的对象的状态存储在本地硬盘上。

    【讨论】:

    • 我会花很多时间来理解你在这里所说的:D。非常感谢。我现在就去挖。
    • 我被抓到了编程,忘记了我应该附加一个链接。对此感到抱歉。
    【解决方案3】:

    要实现这一点,您需要不断保存状态(即您在计算中所处的位置)。这样,如果你中断 probram,当它重新启动时,它会知道它正在计算中,以及它在计算中的位置。

    您可能还希望将主计算放在与用户界面不同的线程中 - 这样您就可以响应来自用户界面的“关闭/中断”请求,并通过停止/暂停线程来适当地处理它们。

    【讨论】:

      【解决方案4】:

      对于linux,有一个项目叫CRIU,它支持进程级的保存和恢复。这很像操作系统的休眠和恢复,但粒度被分解为进程。它还支持容器技术,特别是 Docker。更多信息请参考http://criu.org/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 2013-05-16
        • 2013-04-25
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多