是否可以将程序的内存转储到文件并再次恢复?

是否可以将程序的内存转储到文件并再次恢复?

我想将某个程序使用的 RAM 创建到文件的副本。然后稍后再次恢复该状态。

类似于 ctrl+z & fg 的效果,但我也想从该程序中释放 RAM。

答案1

我想将某个程序使用的 RAM 创建到文件的副本。然后稍后再次恢复该状态。

误解:a过程有它的虚拟地址空间和用途虚拟内存。 RAM本身是由操作系统内核管理的资源。读操作系统:三个简单的部分(进程不使用直接地内存)。

(你最好大量编辑和改进你的问题,以解释更多相关内容:你想要什么样的程序,在什么背景下,为什么,你需要“停止”该程序多长时间,你愿意吗?需要稍后重新启动它的改进版本...?没有这些详细信息,我们无法提供更多帮助。)

在 Linux 上,你可以使用过程(5)查询某个给定进程的虚拟地址空间。尝试cat /proc/$$/mapscat /proc/self/maps

我也想释放 RAM

不需要这样做,因为内核正在管理 RAM(有时殴打可能会发生)。也可以看看疯狂的维斯(2),posix_fadvise(2),映射(2),时钟锁(2)。当进程终止时,内核将释放其虚拟地址空间,然后重新使用为其分配的 RAM。当进程停止时(例如通过Ctrl Z发送SIGTSTP,请参阅信号(7)&术语(3)),内核可能会将其 RAM 重新用于其他目的(并使用交换空间来存储脏页 - 即页面输出- 停止的进程)。阅读请求寻呼&http://linuxatemyram.com/

你想要的与应用程序检查点正交坚持。在 Unix 和 Linux(以及大多数其他操作系统,包括 Windows、Android、MacOSX 等)上,它是不可能或非常困难一般来说(你会如何处理打开的文件描述符,子进程,插座,ASLR,信号量,线程,文件锁定,图形用户界面,共享库, ETC...)。但是您可以编写具有此类功能的应用程序(并且您可以找到对此有帮助的库);当然,您将遵循一些额外的约定和限制,以使持久性或检查点可行且实用。

如果您希望在系统范围内实现这一点,请考虑冬眠

持久性是在应用程序设计时就应该尽早考虑的事情(之后可能很难添加)。请注意数据库sqlite,关系型数据库管理系统,诺SQL数据库,...)和索引文件(数据库管理系统...)可以被视为实现的常用方法某种持久性(您可以将堆视为循环图的对象)。保留与代码相关的数据(例如,虚拟表,关闭,函数指针...)一般来说很难。

你可以找到一些检查点库,例如BLCR或者CRIU。当然,它们在为使用它们而开发的应用程序的有限环境中工作。

最后,从算法的角度来看,保留整个状态(或对其进行检查点)非常接近于复制精确的状态垃圾收集器。所以阅读一些关于他们的东西,例如气相色谱手册,很有用。

然而,真正的持久性或检查点很难实现,应该在应用程序设计的早期就考虑到。在许多情况下,这已经足够困难了需要完全重写应用程序不提供它。

与代码的演变保持兼容更加困难(例如,能够使用应用于旧检查点的较新版本的代码重新启动)。您可能会受到以下启发动态软件更新技术。

一些编程语言实现(例如 Ocaml、Python、Java...)提供序列化或者编组可以提供帮助的设施。其他人有某种检查点方式(例如 SBCLsave-lisp-and-die,聚机器学习 export)。同形性反射是有用的编程语言功能。

也可以看看参考系统俾斯蒙作为持久性系统的示例。

答案2

类似于 ctrl+z & fg 的效果,但我也想从该程序中释放 RAM。

Ctrl-zfg将完全按照您的要求执行:当内核需要 RAM 时,它会将挂起的程序用于磁盘的 RAM 写出到交换分区中,以便它可以将 RAM 重新用于其他用途。当程序稍后激活时fg,它将从交换区读取该 RAM。

答案3

可能有些有趣,文档生成程序 TeX 和 LaTeX 的早期版本使用工具构建了它们的变体,这些工具将启动基本程序,加载所需的所有各种模块,然后触发核心转储,并构建新的“预配置”可执行文件来自核心转储。

有一些很好的讨论在 tex.stackexchange 上。

我认为即使在今天,它也被认为是一种奇怪的继续方式,并且它只真正影响了运行时预链接的一种形式,它没有保留运行过程的状态(动态变量值等)全部。

显然早期版本的 emacs 也这样做了,我不知道这一点。

答案4

除了 Ctrl+Z 和 fg 之外,您不太可能能够做您想做的事情。

问题是,虽然可以将进程的内存保存到文件中(例如生成核心转储),但您的目标似乎是能够从内核的进程表中删除该进程。但是,执行此操作时,您将释放该进程占用的所有其他操作系统资源,例如打开的文件等。

通常,在创建这些资源时,不会存储其获取方法 - 这意味着没有存储有关如何重新获取资源的信息。即使该信息保存在某个地方,也不能保证以后可以重新获取它们(成功获取可能取决于进程外部的状态,甚至可能取决于可能已更改的计算机)。

相关内容