保存进程的内存供以后使用?

时间:2009-04-03 07:30:32

标签: process operating-system

是否可以暂停进程,将内存内容保存到文件中,然后重新加载文件以便继续执行该程序?

修改 我一直在读这个:

http://en.wikipedia.org/wiki/Setcontext

是否可以转储结构的内容,并以某种方式强制malloc分配相同的内存区域?

8 个答案:

答案 0 :(得分:21)

从技术上讲,它是可能的,但它也需要保存所有系统分配的资源状态 - 比如文件解析器,然后恢复它们。所以这是一项具有挑战性的任务。

实现您想要的最简单方法是使用VMWare等虚拟机。当你暂停它时,你实际上将整个机器状态与所有正在运行的程序一起保存。

答案 1 :(得分:6)

这通常称为persistent continuation。像SmallTalk和SBCL这样的语言对持久连续有一流的支持。大多数语言都没有。

答案 2 :(得分:4)

根据您的要求和操作系统,您可以尝试强制core dump

我从来没有尝试过实际加载核心转储程序而不是在gdb中备份。看起来你打开的任何文件或者程序内存中没有的任何其他状态都会像尖锐的指示一样丢失。

另一种方法是简单地在程序中序列化磁盘所需的状态。它很糟糕但它可能是最可靠的方式,除非你满足于暂停执行程序。这可以通过操作系统的线程库来完成。或者用你的贝壳指出一张海报。

答案 3 :(得分:2)

java有序列化,它接近它。虽然你不能把它做到最低级别,如CPU注册内存地址等,因为这将要求操作系统处于与你暂停过程相同的状态。

这可以是一个很好的项目作为Linux内核模块: - )

答案 4 :(得分:1)

正如尖锐的提到的那样,在处理本机代码时难以实现这一点。

但是,有些程序(例如iirc emacs)使用“转储我自己的内存”技巧来保留配置,而不是处理配置文件。但是,这在Windows上不起作用,因为可执行文件以拒绝写入共享模式运行。但它在linux或DOS上是一个可爱的(虽然很危险)技巧:)

答案 5 :(得分:1)

引自“Persist (hibernate!) a process state to disk for quiker loading”(原文如此):

  

Q值。您能否详细解释一下这种交换的工作原理,以便将进程状态保存在磁盘中并在需要时重用?“

     

一个。这很简单。 Page文件是磁盘上的一个特殊位置   非活动进程以高度优化的方式存储。这样的时候   进程恢复运行,系统自动将其读回   记忆,它只是从它的位置继续。这有点怎么样   程序在iPad上运行:)

     

所有这些功能都已内置到Windows中。而你的   进程保持运行,系统确保它在   内存或页面文件(虽然有几个除外,你   可以忽略)。

换句话说,Windows已经能够将进程休眠到页面文件。来自Raymond Chen的@MSalters引用“explaining why its impossible”是完全错误的。

答案 6 :(得分:0)

.NET 3.0及更高版本中的Workflow Foundation允许停止和重新启动工作流。

答案 7 :(得分:0)

Raymond Chen explains为什么这是不可能的。显然,并非所有Microsoft工程师都会阅读此内容,因为Visual Studio编译器会在预编译头文件时执行此操作。它在第一次编译头文件后转储自己的状态,并恢复自己继续。