如何";冬眠“;Linux中的一个进程,将其内存存储到磁盘并在以后恢复?
是否可以在linux中“休眠”进程?如何";冬眠“;Linux中的一个进程,将其内存存储到磁盘并在以后恢复?,linux,linux-kernel,Linux,Linux Kernel,是否可以在linux中“休眠”进程? 就像笔记本电脑中的“hibernate”一样,我希望将进程使用的所有内存写入磁盘,释放RAM。然后,我可以“恢复进程”,即从内存中读取所有数据并将其放回RAM,然后我可以继续我的进程?linux中有ctrl+z,但我不确定它是否提供了您指定的功能。我怀疑你问了这个问题,因为这个问题没有简短的答案是“是的”。你可以从这个问题开始寻找一些想法:()Ctrl-Z增加了进程页面交换的机会,但它不能完全释放进程的资源。完全释放进程资源的问题是,文件句柄、套接字等都是进
就像笔记本电脑中的“hibernate”一样,我希望将进程使用的所有内存写入磁盘,释放RAM。然后,我可以“恢复进程”,即从内存中读取所有数据并将其放回RAM,然后我可以继续我的进程?linux中有
ctrl+z
,但我不确定它是否提供了您指定的功能。我怀疑你问了这个问题,因为这个问题没有简短的答案是“是的”。你可以从这个问题开始寻找一些想法:()Ctrl-Z增加了进程页面交换的机会,但它不能完全释放进程的资源。完全释放进程资源的问题是,文件句柄、套接字等都是进程可以使用的内核资源,但它们不知道如何自己持久化。所以Ctrl-Z已经很好了。问题是恢复程序打开的流(文件和套接字)
当整个操作系统处于休眠状态时,本地文件等显然可以恢复。网络连接不会,但是访问internet的代码通常会进行更多的错误检查,并且能够在错误条件下生存(或者应该)
如果按程序休眠(没有应用程序支持),您将如何处理打开的文件?如果另一个进程在过渡期间访问这些文件呢?等等
在程序未加载时维护状态将很困难
简单地挂起线程并让它交换到磁盘上也会有同样的效果吗
或者在虚拟机中运行程序,让虚拟机处理挂起。早在2.2和2.4天,就有一些关于Linux检查点/恢复的研究,但从未通过原型。对于某些可能的值,这是可能的(在其他答案中描述了注意事项)——我可以编写一个内核模块来实现它,这是可能的。但是对于可能的共同价值(我可以在商业Linux发行版上的shell中实现这一点),它还不可能实现。简短的回答是“是的,但并不总是可靠的”。查看CryoPID: 打开文件确实是最常见的问题。CryoPID明确表示: 打开的文件和偏移将被恢复。 已删除的临时文件 未链接且无法在上访问 文件系统总是保存在 形象。其他不存在的文件 恢复时的数据尚未恢复。 支持将文件内容保存到 这种情况是有计划的
同样的问题也会影响TCP连接,尽管CryoPID支持tcpcp来恢复连接。这是集群操作系统的最终目标。Mathew Dillon在他的项目中投入了大量精力来实现类似的功能。正如其他人所指出的,操作系统很难提供这种功能,因为应用程序需要内置一些错误检查来处理中断的流 但是,另一方面,一些使用虚拟机的编程语言和工具明确支持此功能,例如我用来维护的。程序,它正是您所说的程序。它将程序地址空间、VDSO、文件描述符引用和状态的内容写入一个文件,该文件可在以后重建。CryoPID是在Linux本身没有可用的钩子时启动的,完全从用户空间工作(实际上,它仍然可以工作,这取决于您的发行版/内核/安全设置) 问题包括(实际上)套接字、挂起的RT信号、大量X11问题、glibc缓存getpid()实现等。在伯纳德离开后,随机化(尤其是VDSO)对于我们中的少数人来说是无法克服的。然而,它很有趣,成为了几位硕士论文的主题
如果您只是在考虑一个程序,它可以保存其运行状态并直接重新启动到该状态,那么它远。。远的更容易从程序本身保存信息,可能是在维护信号时 提到
ctrl-z
的答案实际上是指用信号停止进程,在本例中是SIGTSTP
。您可以使用kill
发出停止信号:
kill -STOP <pid>
kill-STOP
这将暂停进程的执行。它不会立即释放它所使用的内存,但由于其他进程需要内存,停止的进程所使用的内存将逐渐被调出
当你想再次唤醒它时,使用
kill -CONT <pid>
kill-CONT
更复杂的解决方案,如CryoPID,只有当您希望停止的进程能够在系统关闭/重新启动后存活下来时才需要,听起来您并不需要这样做。我扩展了CryoPID,从SourceForge获得了一个名为Cryopid2的包。这个可以 迁移进程并使其休眠(以及任何打开的文件和套接字-数据 在休眠时,插座/管道被吸入过程中,并在休眠时吐回 进程重新启动) 我没有积极参与这个项目的原因是我不是内核开发人员——两者都是 这(和/或原始的冰激凌)需要有人在船上运行它们 使用最新的内核(例如Linux3.x) Cryopid方法确实有效,并且可能是通用过程的最佳解决方案
我遇到过Linux中的休眠/迁移。Linux内核现在已经部分实现了检查点/重新启动期货:,状态为 lwn(linux weekly net)中提供了一些有用的信息:
所以答案是“是”我想在这里发布一个状态更新,从2014年开始 公认的答案建议使用CryoPID作为执行检查点/恢复的工具,但我发现