繁体   English   中英

保存进程的内存以备后用?

[英]Save a process' memory for later use?

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

编辑我一直在阅读有关此内容的信息:

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

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

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

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

这通常称为持久延续 一些语言,如 SmallTalk 和 SBCL,对持久性延续提供一流的支持。 大多数语言都没有。

根据您的要求和操作系统,您可以尝试强制进行核心转储

除了在 gdb 中,我从未尝试过实际加载核心转储程序备份。 正如sharptooth指出的那样,您打开的任何文件或不在程序内存中的任何其他状态似乎都将丢失。

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

好吧,java 有序列化,它接近它。 尽管您不能像 CPU 寄存器内存地址等那样将其执行到最低级别,因为这将要求 os 处于“暂停”进程时的相同状态。

作为 linux 内核模块,这可能是一个很好的项目:-)

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

问:您能否详细解释一下这种交换是如何工作的,以便将进程状态保存在磁盘中并在需要时重用?”

答:非常简单。 页面文件是磁盘上的一个特殊位置,非活动进程以高度优化的方式存储在其中。 当此类进程恢复运行时,系统会自动将其读回内存,并从原来的位置继续运行。 这是程序在 iPad 上运行的方式 :)

所有这些功能都已内置于 Windows 中。 当您的进程继续运行时,系统会确保它位于内存或页面文件中(尽管有一些例外,您可以忽略)。

换句话说,Windows 已经具有将进程休眠到页面文件的能力。 @MSalters 引用 Raymond Chen 的“ 解释为什么不可能”是完全错误的。

正如sharptooth 提到的那样,在处理本机代码时,它变得混乱到无法实现的地步。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM