Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何";冬眠“;Linux中的一个进程,将其内存存储到磁盘并在以后恢复?_Linux_Linux Kernel - Fatal编程技术网

如何";冬眠“;Linux中的一个进程,将其内存存储到磁盘并在以后恢复?

如何";冬眠“;Linux中的一个进程,将其内存存储到磁盘并在以后恢复?,linux,linux-kernel,Linux,Linux Kernel,是否可以在linux中“休眠”进程? 就像笔记本电脑中的“hibernate”一样,我希望将进程使用的所有内存写入磁盘,释放RAM。然后,我可以“恢复进程”,即从内存中读取所有数据并将其放回RAM,然后我可以继续我的进程?linux中有ctrl+z,但我不确定它是否提供了您指定的功能。我怀疑你问了这个问题,因为这个问题没有简短的答案是“是的”。你可以从这个问题开始寻找一些想法:()Ctrl-Z增加了进程页面交换的机会,但它不能完全释放进程的资源。完全释放进程资源的问题是,文件句柄、套接字等都是进

是否可以在linux中“休眠”进程?
就像笔记本电脑中的“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作为执行检查点/恢复的工具,但我发现