【问题标题】:Is it possible to interrupt a process and checkpoint it to resume it later on?是否可以中断一个进程并检查它以便稍后恢复它?
【发布时间】:2012-05-08 12:46:22
【问题描述】:

假设您有一个应用程序,它正在消耗所有计算能力。现在你想做一些其他必要的工作。在 Linux 上是否有任何方法可以中断该应用程序并检查其状态,以便稍后它可以从被中断的状态恢复?

特别是我对一种可以在另一台机器上停止并重新启动应用程序的方式感兴趣。这也可能吗?

【问题讨论】:

标签: c linux x86-64 checkpoint


【解决方案1】:

一般来说,对进程进行检查点是不可能的(因为进程不仅是一个地址空间,而且还有其他资源,如文件描述符和 TCP/IP 套接字......)。

实际上,您可以使用一些检查点库,例如BLCR 等。在某些限制条件下,您可以将检查点映像从一个系统迁移到另一个系统(非常类似于源系统:相同的内核,相同的库和编译器的版本等)。

也可以在virtual machine 级别迁移图像。其中一些非常适合。

您还可以使用自己的检查点机制来设计和实施您的软件。然后,您应该考虑使用garbage collection 技术和术语。还要查看 Emacs(或 Xemacsunexec.c 文件(严重依赖机器)。

某些语言实现和运行时具有检查点原语。 SBCL(一个免费的 Common Lisp 实现)能够save a core image 并稍后重新启动它。 SML/NJ 能够export an imageSqueak(Smalltalk 实现)也有这样的能力。

作为检查点的另一个示例,GCC 编译器实际上能够使用 persistence techniques 编译单个 *.h 标头(到预编译的标头文件,它是 GCC 堆的持久映像)。

阅读有关orthogonal persistence 的更多信息。这也是一个研究课题。 serialization 也是相关的(您可能想要使用 JSON、YAML、XML 等文本格式)。您还可以使用hibernation 技术(在整个系统级别上)。

【讨论】:

    【解决方案2】:

    来自手册页man kill

    中断进程需要两个步骤:

    停止

    kill -STOP <pid>  
    

    继续

    kill -CONT <pid>
    

    &lt;pid&gt; 是进程 ID。

    【讨论】:

      【解决方案3】:

      键入:Control + Z 以暂停进程(它发送 SIGTSTP)

      然后bg / fg 在后台或前台恢复它

      【讨论】:

        【解决方案4】:

        在 POSIX 上从根本上检查单个进程是不可能的。那是因为进程不是独立的。他们可以互动。如果没有别的,一个进程有一个唯一的进程 ID,它可能存储在内部某个地方,如果你用不同的进程 ID 恢复它,所有的地狱都可能会崩溃。如果进程使用任何类型的锁/同步原语,则尤其如此。当然,您也不能使用它原来拥有的相同进程 ID 恢复进程,因为这可能会被新进程占用。

        也许您可以通过将进程(和线程)id 设置为 128 位左右来解决问题,这样它们就普遍唯一了...

        【讨论】:

          【解决方案5】:

          在 linux 上,它可以通过发送这个进程 STOP 信号来实现。请通过发送 CONT 信号来恢复它。请参考kill手册。

          【讨论】:

          • 是否可以将该进程转移到另一台机器上?
          • 不是一般的,但看我的回答。
          • 这个答案没有错,所以,加油:不要反对。检查点进程映像只是在内存中(或在分页内存中),只能在创建它的会话和硬件中恢复,但这满足了 OP 的部分要求。
          猜你喜欢
          • 2018-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多