hap*_*497 93 linux linux-kernel
是否有可能在Linux中"休眠"一个进程?就像笔记本电脑中的"休眠"一样,我会将进程使用的所有内存写入磁盘,释放内存.然后,我可以"恢复过程",即从内存中读取所有数据并将其放回RAM中,我可以继续我的过程吗?
Tim*_*ost 52
我曾经维护CryoPID,这是一个完全按照你所说的做的程序.它将程序的地址空间,VDSO,文件描述符引用和状态的内容写入以后可以重建的文件中.CryoPID在Linux本身没有可用的钩子时启动,并且完全来自用户空间(实际上,它仍然可以工作,具体取决于你的发行版/内核/安全设置).
问题是(实际上)套接字,待处理的RT信号,许多X11问题,glibc缓存getpid()实现等等.在伯纳德离开之后,随机化(特别是VDSO)对于我们中的少数人来说是无法克服的.然而,它很有趣,成为几个硕士论文的主题.
如果您只是考虑一个可以保存其运行状态并直接重新启动到该状态的程序,那么它远远更容易从程序本身中保存该信息,可能是在处理信号时.
dap*_*piu 28
我想在此处进行状态更新,截至2014年.
接受的答案表明CryoPID是一个执行Checkpoint/Restore的工具,但是我发现该项目没有用,也无法用最新的内核进行编译.现在,我发现了两个提供应用程序检查点功能的主动项目.
第一个,我建议的那个,因为我运行得更好,是CRIU 主要在用户空间执行检查点/恢复,并且需要启用内核选项CONFIG_CHECKPOINT_RESTORE才能工作.
用户空间中的检查点/恢复,或CRIU(发音为kree-oo,IPA:/krɪʊ/,俄语:криу),是Linux操作系统的软件工具.使用此工具,您可以冻结正在运行的应用程序(或其中的一部分),并将其作为文件集合检查到硬盘驱动器.然后,您可以使用这些文件从冻结点恢复并运行应用程序.CRIU项目的显着特点是它主要在用户空间中实现.
后者是DMTCP ; 从他们的主页引用:
DMTCP(Distributed MultiThreaded Checkpointing)是一种透明地检查多个同时应用程序状态的工具,包括多线程和分布式应用程序.它直接在用户二进制可执行文件上运行,无需任何Linux内核模块或其他内核修改.
关于这个论点还有一个很好的维基百科页面:Application_checkpointing
caf*_*caf 20
ctrl-z
在这种情况下,提到的答案实际上是在谈论用信号停止过程SIGTSTP
.您可以发出停止信号kill
:
kill -STOP <pid>
Run Code Online (Sandbox Code Playgroud)
这将暂停执行该过程.它不会立即释放它使用的内存,但由于其他进程需要内存,停止进程使用的内存将逐渐被换出.
如果您想再次唤醒它,请使用
kill -CONT <pid>
Run Code Online (Sandbox Code Playgroud)
更复杂的解决方案,如CryoPID,实际上只有在您希望停止的进程能够在系统关闭/重启时仍然存在时才需要 - 听起来并不像您需要的那样.
Wil*_*ill 13
问题是恢复程序打开的流 - 文件和套接字.
当您的整个操作系统休眠时,显然可以恢复本地文件等.网络连接没有,但是访问互联网的代码通常更多的是错误检查,并且在错误条件下(或应该)存活下来.
如果您执行了每个程序的休眠(没有应用程序支持),您将如何处理打开的文件?如果另一个进程在临时访问这些文件怎么办?等等?
在程序未加载时维持状态将很困难.
简单地挂起线程并让它交换到磁盘会产生同样的效果吗?
或者在虚拟机中运行程序并让VM处理暂停.
Uli*_*gro 12
简短的回答是"是的,但并不总是可靠".查看CryoPID:
打开文件确实是最常见的问题.CryoPID明确声明:
打开文件和偏移量已恢复.已取消链接且无法在文件系统上访问的临时文件始终保存在映像中.恢复时不存在的其他文件尚未恢复.计划支持为这种情况保存文件内容.
相同的问题也会影响TCP连接,但CryoPID支持tcpcp连接恢复.
Lai*_*han 12
Linux Kernel现在部分实现了checkpoint/restart期货:https://ckpt.wiki.kernel.org/,状态在这里.
一些有用的信息在lwn(linux每周网):http ://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
所以答案是"是"
小智 6
我扩展了Cryopid,从SourceForge生成了一个名为Cryopid2的软件包.这可以迁移进程以及休眠它(以及任何打开的文件和套接字 - 套接字/管道中的数据在休眠时被吸入进程,并在重新启动进程时回吐到这些进程中).
我没有积极参与这个项目的原因是我不是一个内核开发人员 - 这个(和/或原始的cryopid)需要让一个人能够使用最新的内核运行(例如Linux 3.x) .
Cryopid方法确实有效 - 并且可能是我遇到的Linux中通用进程休眠/迁移的最佳解决方案.