一种保存程序运行状态的方法

Min*_*mus 8 process suspend hibernate dump

我有一个程序将执行一个冗长的计算,可能需要几天才能完成。

有没有办法保存程序的运行状态;这样我就可以关闭计算机并从保存的状态运行程序。或者如果程序因任何原因崩溃,我可以从保存的状态(而不是从一开始)重新启动它?

Gil*_*il' 6

为一个进程制作可重启的快照非常困难,因为一个进程可以与文件系统进行各种交互。通常,不要指望 Unix 系统支持这一点。已经有带有可重启核心转储的 unix 变体,但我认为现代的情况并非如此(它们变得太复杂了)。

Lisp 系统通常有一个 dump 命令来创建一个可重启的镜像。所以你可以用支持dumping的 Lisp 方言编写你的程序。

您可以在虚拟机中运行您的代码并使用虚拟机管理器(例如 VirtualBox)来创建定期快照。根据您的程序的功能,这可能会或可能不会影响性能。

最好的解决方案可能是您在程序中构建快照功能。对于纯计算程序,这通常只是中等难度。在多线程计算程序中,快照点通常是所有线程进行通信的全局同步点。尝试将您的程序构建为一个任务包,并使入口点成为一个调度程序,只要处理器空闲,它就会启动一个任务。收到信号后,调度器等待所有当前任务完成,保存程序状态,并重新开始调度任务。


And*_*ese 3

我建议您休眠而不是关闭计算机,但如果您确实无法避免这种情况,那么存在一个名为CRIU(用户空间中的检查点/恢复)的快照/恢复系统,它可以满足您的需求。使用这个框架,您可以很容易地 \xc2\xbbfreeze\xc2\xab 您的进程(实际上将它们的状态保存到磁盘),然后再次解冻它们。

\n\n

我还没有对此进行广泛的测试,但他们似乎有一些相当好的文档,所以您可能会发现这很有帮助。另请注意,要使用 CRIU,您可能必须启用几个内核功能,而这些功能在大多数库存发行版(CONFIG_CHECKPOINT_RESTORECONFIG_MEM_SOFT_DIRTY)上很可能未启用,因此您很有可能需要编译自己的内核才能运行它。

\n\n

注意:如果您的程序因某种原因崩溃,那么提前冻结它可能不是最佳选择,因为您的程序很可能会再次遇到相同的情况(如果不是磁盘或内存已满等外部原因)。

\n