是否可以将正在运行的程序的内存映像序列化到磁盘,而不是关闭它?

是否可以将正在运行的程序的内存映像序列化到磁盘,而不是关闭它?

我知道这是一个延伸,但我对实现它的方法有一些记忆,我希望这里有人能理解我在说什么并帮助推动它。

传统程序(无论是通过终端还是 GUI)都有指令的启动序列和关闭序列,有时可能需要一些时间才能执行。此外,它们可能还有其他限制,例如从数据库中检索数据可能并不总是可用。

程序的“内存映像”,我将其定义为运行时在 RAM 中的占用空间。也就是说,分配给程序的所有内存的一对一映射。

可以对物理磁盘进行映像(甚至挂载其映像),为整个依赖结构创建 AppImage,并保留虚拟操作系统状态的虚拟机状态(实际上是映像);所以我可能是错的;但是是否可以将程序的内存状态(缺陷、低效等等)保存到二进制文件中?

(我担心的一个问题是,图像保留的一些参考可能会在不同的靴子之间发生变化,但这在技术上是一个可以解决的问题,并且可能不会取消这个想法。)

如果是这样,我将如何在 *nix 系统上执行此操作?

显然,这并不总是(甚至通常)是一个优势,但我觉得它值得研究。为了说明我正在尝试做的事情:

  1. 打开Vim
  2. 写入大量文字Vim
  3. 将 Vim 序列化到磁盘而不正式关闭它
  4. 等几天
  5. Vim从磁盘反序列化实例
  6. 继续写同样的文字

因此,保存整个程序的状态,而不仅仅是文件。

我想到的一种解决方法是在虚拟实例中运行程序,但这感觉通常可能太过了。

答案1

是的。 CRIU 是 Linux 下允许此操作的技术的缩写。

然而,存在严格的限制,这是由于程序打开的文件被“冻结”而没有改变、套接字仍然存在、任何外部状态相同、或者状态丢失至少是可恢复的逻辑必要性而产生的。这有效地排除了 X11 程序,并且当然不会使使用 Curses/graphical tty 的程序更容易通过 CRIU。

你经常发现这种情况的地方是集装箱化的服务器工作负载 - 整个文件系统无论如何都是私有的,并且网络连接很容易丢失,因此恢复通常内置于服务器软件中。

相关内容