是否有一种 保存当前所有系统进程信息到硬盘上,需要的时候再进行恢复的技术呢?

2018-06-03 09:51:38 +08:00
 AllOfMe

最近使用 VirtualBox 的快速休眠的功能时,突然想知道能不能像 VirtualBox 一样,把我当前的操作系统的所有进程信息等等都序列化到一个硬盘里的文件里,需要的时候再进行恢复。
理论上我感觉是可以的,因为操作系统有时候也要将不常用的进程放到外存来提升内存的更好的使用率。
如果这个功能能够实现,那么我可以开发的时候相当于多了很多个工作环境,比如说:我在开发前端,Chromium+Vscode+各种终端 Vim+各种文档,如果我这时候希望进行另外一个与刚刚前端完全不相关的后端开发任务,而我内存又受限(或者是窗口过多,太凌乱了),那我可以先保存当前前端工作进程到一个硬盘文件,需要的时候再动态切换。

我的操作系统是 Ubuntu 16.04 LTS,想想要是能实现都有点小激动!差

6053 次点击
所在节点    程序员
49 条回复
laqow
2018-06-03 11:06:05 +08:00
快照的时候硬盘数据地址是映射在内存里的,休眠期间动了硬盘数据唤醒时会有读写错误,随意快照这种应该只能在虚拟机里干。找个够用的小虚拟机软件,换个轻量的系统跑虚拟机或者把 swap 区调大让系统自己挪后台进程应该也行。
omph
2018-06-03 12:18:17 +08:00
PC 实现这个不现实,成本高,市场小
云端倒有可能
roychan
2018-06-03 12:18:35 +08:00
这不是 Hibernate 吗?
xzpjerry731
2018-06-03 12:26:58 +08:00
我有个想法,弄个自带 console 的 type 1 hypervisor
Athrob
2018-06-03 12:45:59 +08:00
Windows 下可以用 vmware,每套环境对应一个虚拟机,不用了就暂停,用到就恢复。我觉得这应该是最简单的满足楼主需求的方案了。
内存不足加内存,桌面凌乱换多桌面,我更倾向于这种“无脑版”的解决方案。
herozhang
2018-06-03 13:10:59 +08:00
Intel 新推出了一种内存技术,断电也不会丢失的,可以了解一下
autoxbc
2018-06-03 13:52:53 +08:00
21# 说得对,我就在休眠后用另一个系统进入改动过磁盘,唤醒后文件系统挂了
lockelee
2018-06-03 14:49:00 +08:00
Win 的休眠不如 osx 的休眠,osx 的休眠超过一定时间就会把内存等信息写到硬盘,降低用电量。你 macbook 一关,回家过个年,来公司打开还有 70%电。。。
hymzhek
2018-06-03 14:56:45 +08:00
@lockelee Windows 混合睡眠 了解一下
geelaw
2018-06-03 15:41:18 +08:00
@lockelee #28 Windows 的休眠是立刻把内存写入磁盘然后断电,不太明白你在说啥。如果你想说睡眠,OEM 可以控制在没有交流电的情况下睡眠多久转换为休眠,Surface 的话大概是 4 小时。
geelaw
2018-06-03 15:50:10 +08:00
另外楼主这是一个 X-Y 问题。

想要实现你想要的结果方法很多,比如:

1. 使用多个虚拟桌面,让不活动的进程自然地被 swap out ;
2. 用多个账户,并使用类似 Windows 的 Fast User Switching 的方法;
3. 使用多个虚拟机。

再说说为什么现有的休眠架构不适合您的需求,通常来说程序会假设本地文件不会突然不见了,休眠可以维持进程对文件的占有,因而一个 exclusively 打开某文件的进程不会期待这个文件突然被改变了,如果你把进程休眠之后另一个进程捣鼓这个文件,无论是拒绝访问还是允许访问都是不好的。对于一切内核对象都是同理。这也是为什么在休眠之后,再次打开电脑的时候不能去开另一个系统的原因。

如果希望这种序列化 /反序列化功能,应用程序需要自己实现——当然这个很困难。
gogogogogo
2018-06-03 15:53:41 +08:00
楼上的方法靠谱 方法 2 最简单吧。哈哈。
msg7086
2018-06-03 15:59:46 +08:00
文件系统需要操作系统独占。
文件系统在挂载的情况下休眠后改变会直接毁掉你整个文件系统。

内存受限的话,虚拟内存就是解决这个问题的,暂时保存到磁盘上,稍后使用时重新加载到内存。
窗口太乱的话,虚拟桌面就是解决这个问题的。

要实现你说的功能,那么必须要内核、文件系统,对每个进程分别隔离,这就相当于轻量级沙箱,也就是类似 docker 这样的结构。Windows 下我好像还不知道哪个解决方案实现了这个效果。

(其实就算实现了,也肯定超过了你的预算能力。
(这么大个系统如果不卖你几万块一套的话,那就应该是几十万一套。
ipwx
2018-06-03 16:14:39 +08:00
@msg7086 Docker 应该都够呛。

你想想,如果一个 Docker 外的程序和一个 Docker 里面的程序同时访问同一个 Named Semaphore,结果你要休眠 Docker 里面那个程序,那你里面的程序如果不释放 Semaphore,外面的程序就无限期死锁了。如果释放了,那么休眠的程序逻辑就要错误了。

更别提如果你重启了系统,再唤醒这个里面的程序,该 Semaphore 根本就不存在,怎么玩?如果你让操作系统搞出一套重启还能恢复的 Semaphore,那么原本重启就能修好的死锁程序,现在也修补好了。

类似的问题还有 pipe,socket,etc ... 太多太多问题了。
kamen
2018-06-03 16:41:23 +08:00
我来总结一下楼上各位所说,要实现这个玩意非常难,而且吃力不讨好,不如用虚拟机之类的解决方案。
reself
2018-06-03 16:47:56 +08:00
@ipwx 像是临界资源的访问间隔,从原本的指令级、纳秒级放大到了人能感受到的分钟级、小时级的时间长度。而且消除了原本由进程和操作系统维护的 semaphore,不得不让人来维护,变得非常不可靠了。
standin000
2018-06-03 18:42:10 +08:00
@zjp 为啥 linux 不支持,windows 支持?
mattx
2018-06-03 18:48:16 +08:00
windows 可以 hyper 虚拟机。在 windows 重启的时候自动保存和启动的时候自动恢复,了解下。
calabash
2018-06-03 19:02:39 +08:00
@zjp 他需要的只是休眠某个进程,或者少数几个进程。休眠的话,不是整个操作系统都进入休眠状态了么
zjp
2018-06-03 20:22:36 +08:00
@calabash 看 #6

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/459951

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX