V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hematite
V2EX  ›  问与答

请问有基于软件的休眠工具吗?

  •  
  •   hematite · 2018-08-30 05:55:04 +08:00 · 1662 次点击
    这是一个创建于 2286 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Windows 的休眠,相当于把操作系统+软件的运行状态,从内存搬到硬盘,然后断电。下次启动,从硬盘搬回到内存,就恢复之前的运行状态了,可继续工作

    请问下各位朋友,有没有“针对软件”的这种休眠工具?即,把某一软件当前的运行状态,从内存搬到硬盘后,即可关闭该软件。下次直接把该软件,从硬盘搬回到内存,就恢复该软件之前的运行状态了,可继续上次没做完的工作。

    例如,一款搜索软件,不提供“搜索结果列表”的保存功能,每次启动,又要重复做一次漫长的搜索,只为那一样的结果列表。如果有这种针对软件的休眠工具,就可避免每次重复搜索了,启动后直接载入上次的结果列表

    请教下,有这种现成的工具吗?

    PS: 上面是基于普通用户的视角,描述需求。程序员视角可能不满意。例如软件是指单个进程 or 进程组?下次搬回内存,网络套接字断了怎么办?……这些细节,我文科生没能力描述清晰。总之,大概想要的就如上描述,有大概、类似符合吗?欢迎朋友推荐下,谢谢😘

    9 条回复    2018-08-30 16:02:36 +08:00
    daigouspy
        1
    daigouspy  
       2018-08-30 06:04:59 +08:00 via Android
    新版的 win10,打开任务管理器,看到有绿色图标的进程吗?
    orochix
        2
    orochix  
       2018-08-30 08:31:36 +08:00 via Android
    进度保存?
    pimin
        3
    pimin  
       2018-08-30 09:06:24 +08:00
    如果从软件自身考虑,还是比较容易实现的,状态保存
    但是如果从外部入手,难度会比较大
    软件运行时探明的系统环境变量,在下一次启动的时候可能都发生了变化
    很容易出现异常
    jasonyang9
        4
    jasonyang9  
       2018-08-30 09:51:10 +08:00
    粗暴一点的方案:给它弄个虚拟机,直接休眠虚拟机即可
    flynaj
        5
    flynaj  
       2018-08-30 11:11:07 +08:00 via Android
    这个不大可能,用过系统休眠的就知道,刚唤醒时候都是网络重连,如果程序没有处理就网络异常,还有播放视频休眠,唤醒后很大可能出错
    geelaw
        6
    geelaw  
       2018-08-30 11:15:09 +08:00
    @daigouspy #1 那些进程都是设计成本来就可以随时被挂起的。

    答案是,很难,参见 https://blogs.msdn.microsoft.com/oldnewthing/20040420-00/?p=39723/
    geelaw
        7
    geelaw  
       2018-08-30 11:31:32 +08:00   ❤️ 1
    @geelaw #6 发现楼主说自己是文科生,那我简单解释一下吧。

    我们先来解决楼主的问题,如果你不希望软件重新搜索,最简单的方式是不要关掉这个软件。

    楼主自己提的问题:网络套接字断了怎么办?答案是:这是一个非常简单的情况,就把它断了就行了,一个正常的程序已经料到网络随时会断开(比如网线被拔了、离开了 Wi-Fi 范围、突然丢失信号或者网络状况突然很差跟断了没两样),所以会自己处理这种情况。

    先上 Raymond Chen 的总结:如果你希望有这种功能,就需要自己写这种代码。例如 Windows 应用商店应用理应任何时候都可以被挂起,且挂起任何时候都可以被关掉而没有进一步通知。

    Raymond Chen 给出了两种情况的讨论。

    第一种:所有的对象立刻无效。那么假设一个进程在临界区里,你一旦休眠这个进程,它就突然离开了临界区,但再次恢复时它可没料到这种情况。如果一个进程独占一个文件,休眠之后其他进程可以使用这个文件,恢复之后程序会乱套。

    第二种:所有的对象仍然有效。那么你可以用一个进程独占打开 20GB 的文件,然后休眠(甚至删掉休眠文件),这会导致那个文件不能删除——重启都没用。另外,休眠一个暂时持有某个资源(例如网络)的进程会导致其他进程无法使用该资源。

    进一步:如果这个进程有窗口怎么办?窗口消息会怎么样?会不会保存起来之后重放?如果有人等待窗口消息的回复又怎么办,挂起直到恢复吗?如果是“用户将要拔掉 U 盘,请你速速写完并关闭文件”的消息,要么用户没法安全删除硬件,要么得到损坏的数据。

    那篇 blog 的评论区有人提问:为什么不能定义进程的“可休眠性”且只允许可休眠进程休眠?如果一个进程有一把锁或者打开了文件,显然不能休眠该进程。

    Raymond Chen 的回复:有些对象没有“所有者”的概念,例如 semaphore (信号量)和 event (事件)。
    hematite
        8
    hematite  
    OP
       2018-08-30 15:13:23 +08:00
    @geelaw #7 谢谢老兄这么详细的解释!👍

    看来我的问题,只能不关闭软件,或用虚拟机解决了

    纯出于好奇,再请教一下,这些难题“暂停进程”是怎么处理的呢? Windows 的 PsSuspend 或 Linux 的 SIGSTOP,不会遇到这些难题吗?
    geelaw
        9
    geelaw  
       2018-08-30 16:02:36 +08:00   ❤️ 1
    @hematite #8 PsSuspend 就是暂停所有的线程,等你玩够了再继续之前没有暂停的线程。进程的对象仍然有效,你不能动进程独占的文件,窗口消息不会处理,程序的窗口会成为 not responding。如果进程打开了 U 盘上的文件,则 U 盘不能安全删除。

    就跟你调试器击中断点一样的效果。

    我并不知道 SIGSTOP 是什么效果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.