计算机如何在崩溃之前保存内容?

Pac*_*ier 52 windows restore crash filesystems

我的印象是,当计算机崩溃时,出现了问题并且无法再执行。

我想知道计算机如何在崩溃之前保存内容?

计算机真的能够知道它什么时候会崩溃(从而通知所有进程:“尽快保存,因为我即将崩溃”)?

如果没有,程序怎么可能喜欢Chrome并且Microsoft Word可以在计算机崩溃后提供“恢复”服务?

Ste*_*ngs 82

Chrome 和 Microsoft Word 会在您工作时定期保存您的当前状态。如果应用程序或计算机崩溃,当应用程序重新启动时,它们会在磁盘上查找保存的状态,并为您恢复它。他们不需要预测崩溃;如果出现问题,他们会不断保存您的状态。

  • 这只是部分正确。操作系统现在提供框架来帮助应用程序从异常中恢复。 (10认同)
  • 这个答案是正确的。大多数具有错误恢复功能的应用程序会定期保存其数据。操作系统不知道它什么时候会崩溃。当它发现时,为时已晚。 (5认同)
  • @surfasb:你能更具体点吗?我们一直能够在类 Unix 系统中捕获信号,但是应用程序员可以做任何事情。 (3认同)

Zip*_*pyV 62

编辑:这仅适用于应用程序崩溃时,而不是 Windows。

由于 Windows Vista 有一个新的 API,它允许 Windows 在应用程序崩溃时调用一个特殊的函数,以便它可以在关闭之前尝试恢复任何数据。它是这样工作的:

  • 应用程序启动
  • 应用调用Windows函数:当我崩溃时请执行 RecoverData()
  • ...
  • 应用程序崩溃
  • WindowsRecoverData()在应用程序中执行
  • RecoverData() 尝试检索有关当前打开的文档的数据,同时它不断 ping Windows 以告知它仍在忙于恢复。
  • RecoverData()完成/超时/停止 ping 时,Windows 将终止应用程序并重新启动它。

更多信息:http : //msdn.microsoft.com/en-us/library/windows/desktop/aa373351(v=VS.85).aspx

  • OP 询问的是计算机 (OS) 崩溃,而不是应用程序崩溃,因此此答案无关紧要。 (12认同)
  • +1:遗憾的是,这是目前使用率最低的工具之一。而且可悲的是,这不是最受好评的答案? (8认同)
  • @ZippyV 但是,如果不是 hte 应用程序崩溃而是 windows 本身崩溃,那么计算机是否没有能力调用“RecoverData()”? (2认同)

inf*_*inf 16

好吧,他们只是崩溃之前保存当前状态。就像每 X 秒自动保存一次。

我认为一个人真的必须区分:

  • 硬件崩溃:只能通过之前的检查点恢复
  • 操作系统崩溃:应用程序无法保存数据,操作系统可以丢弃诸如核心转储之类的东西
  • 应用程序崩溃:应用程序崩溃的操作系统功能可以保存信息


小智 10

这取决于崩溃的严重程度。非常严重的崩溃(在计算机的最低级别)将导致计算机简单地停止。唯一保存的工作是每个应用程序定期自动保存其数据。

对于不太严重的崩溃,计算机会警告每个程序需要关闭。如果程序侦听此消息,则程序将在此处保存当前数据。但是,并非所有程序都注意此消息。

  • 后一部分似乎指的是用户空间崩溃,而不是 BSoD。 (2认同)

kin*_*juf 8

这些程序将它们的状态定期保存在磁盘上的文件中。计算机无法知道它。事实上,崩溃转储甚至不是使用磁盘驱动程序执行的——系统只是将所有内存分页。


Bre*_*ugh 6

我的印象是,当计算机崩溃时,出现了问题并且无法再执行。

是的,这是完全正确的。但是,从逻辑的角度来看,您的程序并不是在计算机上不受限制地运行。程序在操作系统下运行!

我想知道计算机如何在崩溃之前保存内容?计算机是否真的能够知道它何时会崩溃(从而通知所有进程:“尽快保存,因为我即将崩溃”)?

好吧,在BSOD或内核恐慌的情况下,操作系统确定将发生真正不安全的事情(无效的内存指针、覆盖分配给操作系统内核的某些内存、访问不存在的硬件等。 .) 在这种情况下,操作系统会要求所有进程停止执行,将 RAM 的内容保存到磁盘(因为操作系统还负责管理内存分配),然后安全地关闭或重新启动计算机。

当程序抛出未处理的异常并传播到操作系统时,单个应用程序本身就会崩溃。在这种情况下,操作系统将停止执行程序,并关闭所有打开的内存/文件句柄。

在上述两种情况下,程序执行通常不会正常终止。在这些情况下,由各个应用程序来恢复自己的数据,因为它们会突然“停止”执行。

如果没有,Chrome 和 Microsoft Word 之类的程序怎么可能在计算机崩溃后提供“恢复”服务?

IIRC,如果发生上述情况,这两个应用程序都会定期将应用程序状态保存到磁盘,以防止数据丢失。例如,Word 每隔几分钟自动保存当前工作文档的备份副本,以便在突然硬重启的情况下,您仍然可以恢复数据(提供或花费几分钟的工作),而无需您做过什么。

但同样,作为开发人员,您有责任确保您的应用程序能够处理这些情况。


Dan*_*cks 6

当计算机“崩溃”时,例如可能是由于“突然”电源故障(在这种情况下什么也做不了),也可能是由于某种令人讨厌的内部事件(例如,损坏的页表)导致类似地阻止做任何事情,或者可能是由于某些条件以某种方式简单地阻止了“进一步操作”——也许无法启动新进程,也许无法更新显示,也许系统只是简单地用完了存储。

在后一种情况下,操作系统仍然可以在一定范围内运行,并且至少可以完成正在进行的磁盘操作、很好地关闭文件等。此外,如果可能有更多的功能,操作系统可能能够告诉各种应用程序进程以干净地关闭自己。

但即使系统“严重”宕机,整个系统和单个应用程序可能会维护一个“日志”和/或“检查点”系统,以允许恢复整个系统和单个应用程序的状态到一个“原子”点,一切都是“内部一致的”,并且丢失了最少的重要数据。

这一切都不是通过单一机制完成的,而是通过系统和应用程序级别的功能层来完成的。

特别是关于电源故障,可能有也可能没有提前通知,“提前”警告可能是几分之一秒或(使用 UPS 或笔记本电脑电池出现故障)几分钟。可以做什么取决于警告的数量。

在大多数情况下,对于没有 UPS 的台式机系统,最好有时间“停顿”磁盘操作,以便在电源最终消失时没有磁盘处于写入过程中。这可以防止在磁盘上产生坏扇区。过去,当 RAM 小得多时,可能有足够的时间(电源中有大电容,甚至奇怪地使用磁盘驱动器转子中存储的能量来发电)在通电前将 RAM 写入磁盘下降了,但是当 RAM 增长到 100M 左右时,这种可能性几乎消失了。

[请注意,在过去,当记忆是用磁性“核心”制作时,断电时 RAM 会自然地保留下来(尽管在断电时读取/写入的特定字可能会损坏)。这使那些旧系统更容易从电源故障中恢复。]

然而,对于类似 UPS 的东西(它可以提供几分钟到几小时的额外电力),还有更多的选择。一种是简单地关闭系统,就好像您要求“关闭电源”一样。这会导致每个应用程序自行结束,然后整个系统写出永久表并关闭。这可能需要很长时间(我相信你们中的许多人已经注意到了)。但也可以使用“休眠”策略,其中 RAM 作为单个块写入磁盘,然后关闭系统电源。在“休眠”场景中,在恢复供电时,RAM 被读回到它被写入的确切位置,这里和那里的一些位被混淆,然后从它停止的地方恢复执行。

在一些较旧的“大铁”系统上,使用半休眠策略进行紧急关闭:内存将按上述方式写出,但当电源恢复并读入内存时,将发生标准关闭。这样做是因为系统状态的某些位(特别是在 I/O 控制器中)无法可靠地保存/恢复以允许继续操作。