为什么不能休眠单个进程

有这么个问题
Windows操作系统可以整个机器休眠 , 但是为什么它不能休眠单个进程呢?也就是说 , 记录当前进程的状态 , 然后休眠 , 随后将进程状态恢复 。
为什么不能休眠单个进程】原因在于:系统中有一些状态不是进程本身携带的 。
举个例子 , 假设一个进程打开了某个互斥量 , 然后进程休眠了 。 麻烦的事情来了 , 这个互斥量会被丢弃 。 如果互斥量对象之前是用来保护某些内部状态变量的 , 那么当进程从休眠状态中恢复过来的时候 , 它会认为它依然持有这个互斥量 , 所以这些内部变量的值还是有效的 。 但实际上 , 恢复后的进程不再拥有这个互斥量 , 所以它所保护的内部状态也变为了无效的 。
我们看看下面的例子代码:

为什么不能休眠单个进程
文章图片
没有人会想到 , 互斥量可以在“…”期间被悄悄地释放(如果进程被休眠了 , 就会发生这种情况) 。 这与互斥量所代表的一切背道而驰!
让我们再举一个例子:考虑你打开了一个文件以进行独占访问的情况 。 该程序认为当前只有它自己可以访问文件 , 其他任何人都无法访问 。 但是 , 如果这个进程休眠了 , 则其他进程就可以打开文件(独占所有者进程不再存在) , 并对其进行修改 , 然后进程随后恢复执行 。 恢复后的原进程将看到被修改的文件 , 并且可能崩溃或(更糟)触发安全漏洞 。
一种替代方法是:使属于待休眠进程的所有对象保持打开状态 。 这样一来 , 你将面临无法删除文件的问题 , 因为该文件一直没有运行 , 甚至无法打开!(确实 , 要想在重新启动后成功恢复 , 必须在重新启动后重新打开该文件 。 因此 , 现在你有了一个文件 , 即使在重新启动后也无法删除 , 因为该文件一直由程序保持打开状态 。 这有可能触发针对某人发起的惊人的拒绝服务:创建并打开一个20GB的文件 , 然后休眠该进程 , 然后删除该休眠文件 。 哈哈 , 您刚刚创建了一个永久无法删除的文件20GB的文件 。 )
如果休眠程序还创建了窗口?
程序处于休眠状态时 , 窗口句柄是否仍然有效吗?如果你向窗口发送消息会怎样?如果窗口句柄不应保持有效 , 那么广播消息会发生什么?程序恢复后 , 它们是否”保存在某处”用来进行重放?(而且 , 如果广播消息是”我将要卸载此USB硬盘驱动器 , 这是你刷新数据的最后机会了?”怎么办?处于休眠状态的程序将没有机会刷新其数据 。 结果:USB数据丢失或者损坏 。 )
并设想一下如果将休眠的进程复制到另一台计算机 , 然后尝试将其恢复到原来的状态 , 这就更进一步地引发数据丢失或者损坏的问题 。
如果你想要在程序中使用某种”还原点”的功能 , 那么你必须自己编写 。 然后 , 必须明确处理上述问题 。 (“我想打开此文件 , 但同时有人将其删除 。 我该怎么办?”或”好吧 , 我要创建一个还原点 , 我最好清除所有缓冲区并标记所有缓存的数据为无效状态 , 因为 , 当我处于休眠状态时 , 我缓存的内容可能会被更改 。 ”)
总结
基于上面说到的各种困难和限制 , Windows操作系统目前不支持休眠单个进程 。 也即:臣妾做不到啊 。 全剧终 。
最后
RaymondChen的《TheOldNewThing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Whycan’tthesystemhibernatejustoneprocess?》

为什么不能休眠单个进程
文章图片