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

Oma*_*aei 0 memory core-dump

我想将某个程序使用的 RAM 复制到一个文件中。然后稍后再次恢复该状态。

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

Bas*_*tch 5

我想将某个程序使用的 RAM 复制到一个文件中。然后稍后再次恢复该状态。

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

(你会更好地编辑和改进你的问题来解释更多关于它的内容:你有什么样的程序,在什么情况下,为什么,你需要“停止”程序多长时间,是吗?需要稍后重新启动它的改进版本......?没有这些细节,我们无能为力。)

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

我也想释放内存

不需要,因为内核正在管理 RAM(有时可能会发生颠簸)。另见madvise(2)posix_fadvise(2)mmap(2)mlock(2)。当进程终止时,内核将释放其虚拟地址空间,然后重用为其分配的 RAM。当进程停止时(例如,通过Ctrl Z发送SIGTSTP,请参阅signal(7)termios(3)),内核可能会将其 RAM 重用于其他目的(并使用交换空间来存储该停止进程的脏页——即页外页)。阅读关于需求分页http://linuxatemyram.com/

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

如果您想要整个系统,请考虑hibernation

持久性是在应用程序设计时很早就考虑到的东西(之后可能很难添加)。请注意,数据库sqliteRDBMSnosql数据库等)和索引文件(gdbm ...)可以被视为实现某种持久性的常用方法(您可以将堆视为对象的循环图) . 持久化与代码相关的数据(例如虚表闭包函数指针……)通常很难。

你可以找到一些库检查点,如BLCRCRIU。当然,它们在为使用它们而开发的应用程序的有限上下文中工作。

最后,从算法的角度来看,持久化整个状态(或检查点)非常接近复制精确的垃圾收集器。所以阅读一些关于它们的东西,例如GC 手册,是很有用的。

但是,真正的持久性或检查点很难实现,应该在应用程序设计时尽早考虑。在许多情况下,要求对不提供它的应用程序进行完全重写是很困难的。

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

一些编程语言实现(例如 Ocaml、Python、Java 等)提供了可能有帮助的序列化编组设施。其他人有一些检查点的方式(例如 SBCL save-lisp-and-diePolyML export)。同象性反射是有用的编程语言特性。

另请参阅RefPerSysBismon作为持久系统的示例。

  • 另请参阅维基百科“系统图像”页面的 [处理图像](https://en.wikipedia.org/w/index.php?title=System_image&oldid=1018893446#Process_images) 部分——这曾经是一个标准在某些时候,在某些操作系统上,以及在 Smalltalk 和 Lisp 机器上,但当发现它在其他操作系统上不存在时,像 TeX 和 Emacs 这样的程序必须在应用程序级别实现自己的转储/反转储。 (2认同)