V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AllOfMe
V2EX  ›  程序员

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

  •  
  •   AllOfMe · 2018-06-03 09:51:38 +08:00 · 6011 次点击
    这是一个创建于 2369 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    49 条回复    2018-06-05 20:17:24 +08:00
    zjp
        1
    zjp  
       2018-06-03 09:55:22 +08:00 via Android   ❤️ 5
    我们一般简称这个功能为休眠,Linux 上很可能不支持也不建议折腾
    ThirdFlame
        2
    ThirdFlame  
       2018-06-03 10:00:28 +08:00
    虚拟机快照
    inframe
        3
    inframe  
       2018-06-03 10:00:53 +08:00
    看起来想在处理广义的 PCB
    单个进程这样做是没有问题的,但是所有进程都保存了,谁来完成序列化和保存这个操作以及反序列化到内存的恢复操作
    SergeGao
        4
    SergeGao  
       2018-06-03 10:07:09 +08:00 via Android   ❤️ 4
    这不是 windows 上的休眠吗。。。
    woscaizi
        5
    woscaizi  
       2018-06-03 10:09:02 +08:00 via iPhone
    可以利用在虚拟机工作来间接实现吧。
    一种工作开一个虚拟机。
    zjp
        6
    zjp  
       2018-06-03 10:13:02 +08:00 via Android
    @zjp #1 没看清楚题目
    问题是给系统创建快照之后又继续运行,要恢复时怎么解决冲突。虚拟机就直接覆盖了,丢失了后面的工作内容
    fcten
        7
    fcten  
       2018-06-03 10:24:25 +08:00   ❤️ 2
    进程间的依赖关系比较复杂,操作系统是无从得知的。如果不在应用程序层面进行处理,仅仅在操作系统层面挂起进程的话,很可能会导致各种无法预料的错误。这和虚拟机挂起整个系统是有区别的。
    另外一个问题是,受限于磁盘读写速度,挂起和恢复大量进程的体验不会太好。
    所以,如果真的有这样的需求的话,我选择多加一根内存条……
    AllOfMe
        8
    AllOfMe  
    OP
       2018-06-03 10:31:17 +08:00
    @zjp
    @SergeGao

    我也知道这个休眠是可以实现的,但是能否休眠多个状态,然后自由的切换每个状态下以进行进程恢复呢?
    AllOfMe
        9
    AllOfMe  
    OP
       2018-06-03 10:32:25 +08:00
    @woscaizi 的确是一个解决办法,可惜我内存不够开虚拟机啊&_&
    ThirdFlame
        10
    ThirdFlame  
       2018-06-03 10:35:10 +08:00   ❤️ 1
    @AllOfMe 理论上来说可以, 每次休眠独立产生休眠文件,启动时选择。
    AllOfMe
        11
    AllOfMe  
    OP
       2018-06-03 10:36:13 +08:00
    @ThirdFlame 谢谢,我去了解一下
    nifury
        12
    nifury  
       2018-06-03 10:39:00 +08:00
    这个……不是虚拟内存么?操作系统在内存不足的时候会自动把不常用的页换到硬盘上的吧
    likuku
        13
    likuku  
       2018-06-03 10:40:30 +08:00   ❤️ 1
    要管理整个 OS/虚拟机的状态存取到硬盘,那得额外需要一个管理系统,

    现有的专业虚拟机平台(Xen/VMWare ESXi) 之类就可以,虚拟机在这些系统上运行效率可是超高的。

    何必这么折腾?如今机器的性能,花 3k-4k 的单价多买几个台式机同时用就行了呗。
    AllOfMe
        14
    AllOfMe  
    OP
       2018-06-03 10:40:38 +08:00
    @nifury 我不是希望通过 swap 来扩展内存,我是想实现内存进程休眠保存,多个状态动态切换,即使我关了机之后,都有很多个休眠的状态可以给我选择。
    likuku
        15
    likuku  
       2018-06-03 10:45:24 +08:00
    @AllOfMe 单一 OS,即便实现需求,每次切换也得重启机器,这浪费时间精力也是够麻烦的...

    不如单机装多系统得了,需要哪个环境,就重启进哪个系统。
    reself
        16
    reself  
       2018-06-03 10:45:34 +08:00 via Android
    docker pause/unpause 了解一下
    AllOfMe
        17
    AllOfMe  
    OP
       2018-06-03 10:46:24 +08:00
    @reself 可是我的操作系统并不是运行在 docker 里的。。不过谢谢,get 到一个 docker 命令
    AllOfMe
        18
    AllOfMe  
    OP
       2018-06-03 10:48:25 +08:00
    @likuku 多系统我觉得不太方便,因为我多个开发任务用到的软件 nodeJS,jdk,python 以及自己设定的环境变量都不太好在多系统下实现。其实如果这个能够实现,那么我哪怕重启一下切换状态也不会太麻烦的
    AllOfMe
        19
    AllOfMe  
    OP
       2018-06-03 10:49:38 +08:00
    @inframe 不一定是所有的进程都进行恢复,只恢复一些用户常用的进程即可,比如 vscode,vim,各种终端等等
    RedStrings
        20
    RedStrings  
       2018-06-03 11:01:53 +08:00
    脑洞佩服,这就是创新的起点啊;
    laqow
        21
    laqow  
       2018-06-03 11:06:05 +08:00 via Android
    快照的时候硬盘数据地址是映射在内存里的,休眠期间动了硬盘数据唤醒时会有读写错误,随意快照这种应该只能在虚拟机里干。找个够用的小虚拟机软件,换个轻量的系统跑虚拟机或者把 swap 区调大让系统自己挪后台进程应该也行。
    omph
        22
    omph  
       2018-06-03 12:18:17 +08:00
    PC 实现这个不现实,成本高,市场小
    云端倒有可能
    roychan
        23
    roychan  
       2018-06-03 12:18:35 +08:00
    这不是 Hibernate 吗?
    xzpjerry731
        24
    xzpjerry731  
       2018-06-03 12:26:58 +08:00
    我有个想法,弄个自带 console 的 type 1 hypervisor
    Athrob
        25
    Athrob  
       2018-06-03 12:45:59 +08:00 via iPhone
    Windows 下可以用 vmware,每套环境对应一个虚拟机,不用了就暂停,用到就恢复。我觉得这应该是最简单的满足楼主需求的方案了。
    内存不足加内存,桌面凌乱换多桌面,我更倾向于这种“无脑版”的解决方案。
    herozhang
        26
    herozhang  
       2018-06-03 13:10:59 +08:00 via iPhone
    Intel 新推出了一种内存技术,断电也不会丢失的,可以了解一下
    autoxbc
        27
    autoxbc  
       2018-06-03 13:52:53 +08:00 via iPhone
    21# 说得对,我就在休眠后用另一个系统进入改动过磁盘,唤醒后文件系统挂了
    lockelee
        28
    lockelee  
       2018-06-03 14:49:00 +08:00 via iPhone
    Win 的休眠不如 osx 的休眠,osx 的休眠超过一定时间就会把内存等信息写到硬盘,降低用电量。你 macbook 一关,回家过个年,来公司打开还有 70%电。。。
    hymzhek
        29
    hymzhek  
       2018-06-03 14:56:45 +08:00   ❤️ 1
    @lockelee Windows 混合睡眠 了解一下
    geelaw
        30
    geelaw  
       2018-06-03 15:41:18 +08:00 via iPhone
    @lockelee #28 Windows 的休眠是立刻把内存写入磁盘然后断电,不太明白你在说啥。如果你想说睡眠,OEM 可以控制在没有交流电的情况下睡眠多久转换为休眠,Surface 的话大概是 4 小时。
    geelaw
        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 打开某文件的进程不会期待这个文件突然被改变了,如果你把进程休眠之后另一个进程捣鼓这个文件,无论是拒绝访问还是允许访问都是不好的。对于一切内核对象都是同理。这也是为什么在休眠之后,再次打开电脑的时候不能去开另一个系统的原因。

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

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

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

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

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

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

    类似的问题还有 pipe,socket,etc ... 太多太多问题了。
    kamen
        35
    kamen  
       2018-06-03 16:41:23 +08:00 via Android
    我来总结一下楼上各位所说,要实现这个玩意非常难,而且吃力不讨好,不如用虚拟机之类的解决方案。
    reself
        36
    reself  
       2018-06-03 16:47:56 +08:00 via Android
    @ipwx 像是临界资源的访问间隔,从原本的指令级、纳秒级放大到了人能感受到的分钟级、小时级的时间长度。而且消除了原本由进程和操作系统维护的 semaphore,不得不让人来维护,变得非常不可靠了。
    standin000
        37
    standin000  
       2018-06-03 18:42:10 +08:00
    @zjp 为啥 linux 不支持,windows 支持?
    mattx
        38
    mattx  
       2018-06-03 18:48:16 +08:00
    windows 可以 hyper 虚拟机。在 windows 重启的时候自动保存和启动的时候自动恢复,了解下。
    calabash
        39
    calabash  
       2018-06-03 19:02:39 +08:00 via Android
    @zjp 他需要的只是休眠某个进程,或者少数几个进程。休眠的话,不是整个操作系统都进入休眠状态了么
    zjp
        40
    zjp  
       2018-06-03 20:22:36 +08:00 via Android
    @calabash 看 #6
    disk
        41
    disk  
       2018-06-03 20:54:21 +08:00 via Android
    我觉得你想要的是类似虚拟机的快照功能。理论上先挂起到硬盘,由支持快照的文件系统进行快照,然后恢复是可行的。只是在恢复快照后之后的操作都会被抹掉就是了。
    chrisqin
        42
    chrisqin  
       2018-06-03 20:58:30 +08:00
    你说的确定不是 swap 就已经提供好的功能?
    whileFalse
        43
    whileFalse  
       2018-06-03 21:39:22 +08:00
    你需要 Cloud9 或者 Coding WebIDE
    shihira
        44
    shihira  
       2018-06-03 21:47:23 +08:00
    如果只是想快照少数的进程,你可能只是需要做 Checkpoint 的东西。

    https://en.wikipedia.org/wiki/Application_checkpointing

    CRIU 或者 Cryopid 应该能满足你的需要
    ilylx2008
        45
    ilylx2008  
       2018-06-03 22:58:21 +08:00 via Android
    加条内存的事,别瞎折腾,能用钱解决,省了多少折腾的时间啊
    yylucifer
        46
    yylucifer  
       2018-06-03 23:55:26 +08:00
    理论上是可行的,但是不知道有没有现行的解决方案。。

    理论上无非就是把物理内容和虚拟内存 dump 一份。。
    yingfengi
        47
    yingfengi  
       2018-06-04 07:26:38 +08:00 via Android
    加内存,加显示器
    LemoAtom
        48
    LemoAtom  
       2018-06-04 12:15:52 +08:00
    没有,期待楼主实现
    AllOfMe
        49
    AllOfMe  
    OP
       2018-06-05 20:17:24 +08:00
    谢谢各位的建议和帮助!如果我有空闲时间,我尝试开发一下这个功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5127 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 03:54 · PVG 11:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.