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