最近使用 VirtualBox 的快速休眠的功能时,突然想知道能不能像 VirtualBox 一样,把我当前的操作系统的所有进程信息等等都序列化到一个硬盘里的文件里,需要的时候再进行恢复。
理论上我感觉是可以的,因为操作系统有时候也要将不常用的进程放到外存来提升内存的更好的使用率。
如果这个功能能够实现,那么我可以开发的时候相当于多了很多个工作环境,比如说:我在开发前端,Chromium+Vscode+各种终端 Vim+各种文档,如果我这时候希望进行另外一个与刚刚前端完全不相关的后端开发任务,而我内存又受限(或者是窗口过多,太凌乱了),那我可以先保存当前前端工作进程到一个硬盘文件,需要的时候再动态切换。
我的操作系统是 Ubuntu 16.04 LTS,想想要是能实现都有点小激动!差
1
zjp 2018-06-03 09:55:22 +08:00 via Android 5
我们一般简称这个功能为休眠,Linux 上很可能不支持也不建议折腾
|
2
ThirdFlame 2018-06-03 10:00:28 +08:00
虚拟机快照
|
3
inframe 2018-06-03 10:00:53 +08:00
看起来想在处理广义的 PCB
单个进程这样做是没有问题的,但是所有进程都保存了,谁来完成序列化和保存这个操作以及反序列化到内存的恢复操作 |
4
SergeGao 2018-06-03 10:07:09 +08:00 via Android 4
这不是 windows 上的休眠吗。。。
|
5
woscaizi 2018-06-03 10:09:02 +08:00 via iPhone
可以利用在虚拟机工作来间接实现吧。
一种工作开一个虚拟机。 |
6
zjp 2018-06-03 10:13:02 +08:00 via Android
@zjp #1 没看清楚题目
问题是给系统创建快照之后又继续运行,要恢复时怎么解决冲突。虚拟机就直接覆盖了,丢失了后面的工作内容 |
7
fcten 2018-06-03 10:24:25 +08:00 2
进程间的依赖关系比较复杂,操作系统是无从得知的。如果不在应用程序层面进行处理,仅仅在操作系统层面挂起进程的话,很可能会导致各种无法预料的错误。这和虚拟机挂起整个系统是有区别的。
另外一个问题是,受限于磁盘读写速度,挂起和恢复大量进程的体验不会太好。 所以,如果真的有这样的需求的话,我选择多加一根内存条…… |
8
AllOfMe OP |
10
ThirdFlame 2018-06-03 10:35:10 +08:00 1
@AllOfMe 理论上来说可以, 每次休眠独立产生休眠文件,启动时选择。
|
11
AllOfMe OP @ThirdFlame 谢谢,我去了解一下
|
12
nifury 2018-06-03 10:39:00 +08:00
这个……不是虚拟内存么?操作系统在内存不足的时候会自动把不常用的页换到硬盘上的吧
|
13
likuku 2018-06-03 10:40:30 +08:00 1
要管理整个 OS/虚拟机的状态存取到硬盘,那得额外需要一个管理系统,
现有的专业虚拟机平台(Xen/VMWare ESXi) 之类就可以,虚拟机在这些系统上运行效率可是超高的。 何必这么折腾?如今机器的性能,花 3k-4k 的单价多买几个台式机同时用就行了呗。 |
14
AllOfMe OP @nifury 我不是希望通过 swap 来扩展内存,我是想实现内存进程休眠保存,多个状态动态切换,即使我关了机之后,都有很多个休眠的状态可以给我选择。
|
15
likuku 2018-06-03 10:45:24 +08:00
|
16
reself 2018-06-03 10:45:34 +08:00 via Android
docker pause/unpause 了解一下
|
18
AllOfMe OP @likuku 多系统我觉得不太方便,因为我多个开发任务用到的软件 nodeJS,jdk,python 以及自己设定的环境变量都不太好在多系统下实现。其实如果这个能够实现,那么我哪怕重启一下切换状态也不会太麻烦的
|
19
AllOfMe OP @inframe 不一定是所有的进程都进行恢复,只恢复一些用户常用的进程即可,比如 vscode,vim,各种终端等等
|
20
RedStrings 2018-06-03 11:01:53 +08:00
脑洞佩服,这就是创新的起点啊;
|
21
laqow 2018-06-03 11:06:05 +08:00 via Android
快照的时候硬盘数据地址是映射在内存里的,休眠期间动了硬盘数据唤醒时会有读写错误,随意快照这种应该只能在虚拟机里干。找个够用的小虚拟机软件,换个轻量的系统跑虚拟机或者把 swap 区调大让系统自己挪后台进程应该也行。
|
22
omph 2018-06-03 12:18:17 +08:00
PC 实现这个不现实,成本高,市场小
云端倒有可能 |
23
roychan 2018-06-03 12:18:35 +08:00
这不是 Hibernate 吗?
|
24
xzpjerry731 2018-06-03 12:26:58 +08:00
我有个想法,弄个自带 console 的 type 1 hypervisor
|
25
Athrob 2018-06-03 12:45:59 +08:00 via iPhone
Windows 下可以用 vmware,每套环境对应一个虚拟机,不用了就暂停,用到就恢复。我觉得这应该是最简单的满足楼主需求的方案了。
内存不足加内存,桌面凌乱换多桌面,我更倾向于这种“无脑版”的解决方案。 |
26
herozhang 2018-06-03 13:10:59 +08:00 via iPhone
Intel 新推出了一种内存技术,断电也不会丢失的,可以了解一下
|
27
autoxbc 2018-06-03 13:52:53 +08:00 via iPhone
21# 说得对,我就在休眠后用另一个系统进入改动过磁盘,唤醒后文件系统挂了
|
28
lockelee 2018-06-03 14:49:00 +08:00 via iPhone
Win 的休眠不如 osx 的休眠,osx 的休眠超过一定时间就会把内存等信息写到硬盘,降低用电量。你 macbook 一关,回家过个年,来公司打开还有 70%电。。。
|
30
geelaw 2018-06-03 15:41:18 +08:00 via iPhone
@lockelee #28 Windows 的休眠是立刻把内存写入磁盘然后断电,不太明白你在说啥。如果你想说睡眠,OEM 可以控制在没有交流电的情况下睡眠多久转换为休眠,Surface 的话大概是 4 小时。
|
31
geelaw 2018-06-03 15:50:10 +08:00 via iPhone 1
另外楼主这是一个 X-Y 问题。
想要实现你想要的结果方法很多,比如: 1. 使用多个虚拟桌面,让不活动的进程自然地被 swap out ; 2. 用多个账户,并使用类似 Windows 的 Fast User Switching 的方法; 3. 使用多个虚拟机。 再说说为什么现有的休眠架构不适合您的需求,通常来说程序会假设本地文件不会突然不见了,休眠可以维持进程对文件的占有,因而一个 exclusively 打开某文件的进程不会期待这个文件突然被改变了,如果你把进程休眠之后另一个进程捣鼓这个文件,无论是拒绝访问还是允许访问都是不好的。对于一切内核对象都是同理。这也是为什么在休眠之后,再次打开电脑的时候不能去开另一个系统的原因。 如果希望这种序列化 /反序列化功能,应用程序需要自己实现——当然这个很困难。 |
32
gogogogogo 2018-06-03 15:53:41 +08:00
楼上的方法靠谱 方法 2 最简单吧。哈哈。
|
33
msg7086 2018-06-03 15:59:46 +08:00
文件系统需要操作系统独占。
文件系统在挂载的情况下休眠后改变会直接毁掉你整个文件系统。 内存受限的话,虚拟内存就是解决这个问题的,暂时保存到磁盘上,稍后使用时重新加载到内存。 窗口太乱的话,虚拟桌面就是解决这个问题的。 要实现你说的功能,那么必须要内核、文件系统,对每个进程分别隔离,这就相当于轻量级沙箱,也就是类似 docker 这样的结构。Windows 下我好像还不知道哪个解决方案实现了这个效果。 (其实就算实现了,也肯定超过了你的预算能力。 (这么大个系统如果不卖你几万块一套的话,那就应该是几十万一套。 |
34
ipwx 2018-06-03 16:14:39 +08:00 2
@msg7086 Docker 应该都够呛。
你想想,如果一个 Docker 外的程序和一个 Docker 里面的程序同时访问同一个 Named Semaphore,结果你要休眠 Docker 里面那个程序,那你里面的程序如果不释放 Semaphore,外面的程序就无限期死锁了。如果释放了,那么休眠的程序逻辑就要错误了。 更别提如果你重启了系统,再唤醒这个里面的程序,该 Semaphore 根本就不存在,怎么玩?如果你让操作系统搞出一套重启还能恢复的 Semaphore,那么原本重启就能修好的死锁程序,现在也修补好了。 类似的问题还有 pipe,socket,etc ... 太多太多问题了。 |
35
kamen 2018-06-03 16:41:23 +08:00 via Android
我来总结一下楼上各位所说,要实现这个玩意非常难,而且吃力不讨好,不如用虚拟机之类的解决方案。
|
36
reself 2018-06-03 16:47:56 +08:00 via Android
@ipwx 像是临界资源的访问间隔,从原本的指令级、纳秒级放大到了人能感受到的分钟级、小时级的时间长度。而且消除了原本由进程和操作系统维护的 semaphore,不得不让人来维护,变得非常不可靠了。
|
37
standin000 2018-06-03 18:42:10 +08:00
@zjp 为啥 linux 不支持,windows 支持?
|
38
mattx 2018-06-03 18:48:16 +08:00
windows 可以 hyper 虚拟机。在 windows 重启的时候自动保存和启动的时候自动恢复,了解下。
|
39
calabash 2018-06-03 19:02:39 +08:00 via Android
@zjp 他需要的只是休眠某个进程,或者少数几个进程。休眠的话,不是整个操作系统都进入休眠状态了么
|
41
disk 2018-06-03 20:54:21 +08:00 via Android
我觉得你想要的是类似虚拟机的快照功能。理论上先挂起到硬盘,由支持快照的文件系统进行快照,然后恢复是可行的。只是在恢复快照后之后的操作都会被抹掉就是了。
|
42
chrisqin 2018-06-03 20:58:30 +08:00
你说的确定不是 swap 就已经提供好的功能?
|
43
whileFalse 2018-06-03 21:39:22 +08:00
你需要 Cloud9 或者 Coding WebIDE
|
44
shihira 2018-06-03 21:47:23 +08:00
如果只是想快照少数的进程,你可能只是需要做 Checkpoint 的东西。
https://en.wikipedia.org/wiki/Application_checkpointing CRIU 或者 Cryopid 应该能满足你的需要 |
45
ilylx2008 2018-06-03 22:58:21 +08:00 via Android
加条内存的事,别瞎折腾,能用钱解决,省了多少折腾的时间啊
|
46
yylucifer 2018-06-03 23:55:26 +08:00
理论上是可行的,但是不知道有没有现行的解决方案。。
理论上无非就是把物理内容和虚拟内存 dump 一份。。 |
47
yingfengi 2018-06-04 07:26:38 +08:00 via Android
加内存,加显示器
|
48
LemoAtom 2018-06-04 12:15:52 +08:00
没有,期待楼主实现
|
49
AllOfMe OP 谢谢各位的建议和帮助!如果我有空闲时间,我尝试开发一下这个功能
|