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

2018-08-30 05:55:04 +08:00
 hematite

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我并不知道 SIGSTOP 是什么效果。

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

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

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

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

© 2021 V2EX