我有一个程序将执行冗长的计算,可能需要几天的时间才能完成。
有没有办法保存程序的运行状态;这样我就可以关闭计算机并从保存的状态运行程序。或者,如果程序因任何原因崩溃,我可以从保存的状态(而不是从一开始)重新启动它?
答案1
制作进程的可重新启动快照非常困难,因为进程可以与文件系统进行各种交互。一般来说,不要期望 UNIX 系统支持这一点。已经有一些带有可重新启动核心转储的 unix 变体,但我认为现代的情况并非如此(它们变得太复杂了)。
Lisp 系统通常有一个转储命令来创建可重新启动的映像。所以你可以用支持的 Lisp 方言编写你的程序倾销。
您可以在虚拟机中运行代码并使用虚拟机管理器(例如 VirtualBox)创建定期快照。根据您的程序的用途,这可能会也可能不会损害性能。
最好的解决方案可能是在您的程序中构建快照功能。对于纯粹的计算程序来说,这通常只是中等难度。在多线程计算程序中,快照点通常是全局同步点,所有线程都在其中进行通信。尝试将程序构建为任务包,并将入口点设为调度程序,每当处理器空闲时就启动任务。收到信号后,调度程序等待所有当前任务完成,保存程序状态,然后再次开始调度任务。
答案2
我建议休眠而不是关闭计算机,但如果您确实无法避免这种情况,则存在一个名为的快照/恢复系统CRIU(在用户空间中检查点/恢复),这可以满足您的需求。使用这个框架,您可以很容易地“冻结”您的进程(实际上将它们的状态保存到磁盘),然后再次解冻它们。
我还没有对此进行广泛的测试,但他们似乎有一些相当好的文档,所以您可能会发现这很有帮助。另请注意,要使用 CRIU,您可能必须启用几个内核功能,而大多数库存发行版(CONFIG_CHECKPOINT_RESTORE
和)上很可能未启用这些功能CONFIG_MEM_SOFT_DIRTY
,因此您很可能需要编译自己的内核才能运行它。
笔记:如果你的程序崩溃了原因提前冻结它可能不是正确的方法,因为您的程序很可能会再次遇到相同的情况(如果不是磁盘或内存已满等外部原因)。