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


52

我给人的印象是,当计算机崩溃时,出现了问题,无法再运行了。

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

该计算机真的能够知道何时将崩溃(并因此通知所有进程:“请尽快保存,因为我将要崩溃 ”)?

如果不是,怎么可能像程序ChromeMicrosoft Word可以提供“恢复”服务计算机崩溃后?


13
我喜欢问题标题中的答案。
克里斯

电源关闭时应急灯如何点亮?
JoelFan 2012年

@JoelFan,如果您的电池/发电机没电了,他们就不会= P
Mechaflash 2012年

Answers:


6

当计算机“崩溃”时,可能是由于“突然的”电源故障(在这种情况下无法执行任何操作),也可能是由于某种讨厌的内部事件(例如,损坏的页表)导致的同样会阻止执行任何操作,或者可能是由于某种情况而以某种方式简单地阻止了“进一步的操作”-也许无法启动新进程,也许无法更新显示,也许系统只是存储空间不足。

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

但是,即使系统“硬”崩溃,整个系统和单个应用程序也可能维护了一个“日志”和/或“检查点”系统,以允许恢复整个系统和单个应用程序的状态到“原子”点,那里的所有东西都是“内部一致的”,并且丢失了最少的重要数据。

所有这些都不是用单一的机制完成的,而是在系统和应用程序级别的功能层。

具体来说,关于电源故障,可能会提前通知,也可能不会,并且“提前”警告可能是几分之一秒或几分钟(使用UPS或笔记本电脑电池出现故障)。可以采取的措施取决于警告的数量。

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

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

但是,对于类似UPS的产品(可能会提供几分钟到几小时的额外电力),还有更多选择。一种是简单地关闭系统,就像您请求“关闭电源”一样。这将导致每个应用程序自身结束,然后整个系统写出永久表并关闭。这可能会花费很长时间(我相信你们中很多人已经注意到了)。但是也可以使用“休眠”策略,将RAM作为单个块写入磁盘,然后关闭系统电源。在“休眠”方案中,在恢复电源时,将RAM读回到其确切写入位置,然后在此处写入几位,然后重新执行,然后从中断处恢复执行。

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


82

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


10
这只是部分正确。现在,操作系统提供了框架来帮助应用程序从异常中恢复。
surfasb 2012年

3
@surfasb:您能更具体一点吗?我们一直能够在类似Unix的系统中捕获信号,但是应用程序程序员必须对此做任何事情。
Dietrich Epp 2012年

5
这个答案是正确的。具有错误恢复功能的大多数应用程序会定期保存其数据。操作系统无法确定何时崩溃。当发现时,为时已晚。
Bogdacutu 2012年

1
@surfasb,这个问题是关于计算机(大概是内核)崩溃的问题,不是应用程序出现异常,该异常通常可以处理并且一切正常,或者充其量是进程核心转储而不保存您的文档。
psusi'1

62

编辑:这仅在应用程序崩溃时有效,而不是Windows。

从Windows Vista开始,有一个新的API,允许Windows崩溃时在应用程序中调用特殊功能,以便它可以在关闭之前尝试恢复任何数据。它是这样的:

  • 应用启动
  • 应用程式呼叫Windows功能:当我当机时,请执行 RecoverData()
  • ...
  • 应用程序崩溃
  • Windows RecoverData()在App中执行
  • RecoverData() 尝试检索有关当前打开的文档的数据,与此同时,它一直对Windows进行ping操作以告知其仍在忙于恢复。
  • RecoverData()完成/超时/停止执行ping时,Windows终止应用程序并重新启动它。

详细信息:http : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa373351(v=VS.85).aspx


8
+1:可悲的是,这是最未被充分利用的工具之一。同样令人遗憾的是,这不是最受好评的答案??
surfasb 2012年

2
@ZippyV但是,如果不是不是该应用程序崩溃了,而是Windows本身崩溃了,这是不是真的,计算机没有调用的能力 RecoverData()
Pacerier,2012年

12
OP正在询问计算机(OS)崩溃,而不是应用程序崩溃,因此此答案无关紧要。
vitaut 2012年

的确,对于BSOD,这将不起作用。
ZippyV 2012年

对于MS来说,这是多么愚蠢的API。一旦达到这一点,您就不能相信应用程序可以保存任何数据,这就是为什么数十年来,应用程序被设计为可以在发生任何错误之前保存数据。
psusi'1

16

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

我认为确实必须区分:

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

是的,我当时正在谈论更严重的崩溃,例如操作系统/硬件崩溃
Pacerier,2012年

10

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

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


1
我认为后一部分实际上是不可能的。Windows仅在检测到内核模式下的异常或其他致命错误(表示内核地址空间中的某些数据已损坏)时才提供BSoD。由于内核模式程序(驱动程序等)具有无限的内存访问权限,因此无法轻松将错误隔离到组件,因此必须以内核模式关闭整个系统。用信号通知用户空间程序以保存数据实质上意味着恢复内核的许多功能,这非常危险。
billc.cn 2012年

2
后一部分似乎是指用户空间崩溃,而不是BSoD。
3Doubloons,2012年

8

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


分页是通过磁盘驱动程序完成的-如果没有它,内核将不知道如何写入磁盘。
psusi 2012年

@psusi当系统崩溃时,页面文件是内核知道可以安全写入的唯一位置。
kinokijuf 2012年

是的,它实际上是通过磁盘驱动程序进行写入的。
psusi'1

1
否。它通过特殊的“ dump_atapi.sys”(代替SCSI控制器的atapi)驱动程序来完成,而不是通过标准磁盘驱动程序来完成。我认为它甚至使用Int 13h。
kinokijuf 2012年

6

我给人的印象是,当计算机崩溃时,出现了问题,无法再运行了。

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

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

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

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

在上述两种情况下,通常都不会正常终止程序执行。在这些情况下,由于各个应用程序突然只是“停止”执行,因此需要由各个应用程序恢复。

如果不是,在计算机崩溃后,Chrome和Microsoft Word之类的程序如何提供“恢复”服务?

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

同样,作为开发人员,您有责任确保您的应用程序可以应对这些情况。


“在那种情况下,操作系统要求所有进程停止执行,将RAM的内容保存到磁盘,然后安全地关闭或重新启动计算机。” -保存到磁盘的RAM内容何时恢复“恢复”?
Pacerier,2012年

1
他们不在正常的事件过程中。但是,如果您的计算机经常崩溃,那么熟练的编程人员也许可以使用此文件来找出原因。
kindall 2012年

如@Pacerier kindall所述,它们不会还原(因为如果您确实还原了RAM,则您将处于相同的执行状态,从而首先导致计算机崩溃!)。您可以在系统属性->高级->启动和恢复下更改Windows中写入磁盘的内容。再次kindall说明,该信息对于尝试确定导致错误的原因的开发人员最有用。
突破

3

是的,数据还原过程不仅用于计算机崩溃,还用于断电,程序崩溃,不保存就退出等等。

您所说的是正确的,计算机无法“知道”何时将崩溃,对于Word,它会定期自动保存,以便可以还原该数据。对于Chrome,它可能会将每个标签的信息存储在某个位置,并在成功退出时或在新的会话和其他会话开始时将其删除。以成功退出结束,它具有要还原到的数据。

我(显然)不适用于Microsoft或Google,但这可能是它起作用的方式(或接近的方式)。


2

程序可以在磁盘上写一个标志,上面写着“在启动时,如果设置了该标志,则出问题了”。在启动时,将检查该标志以查看其是否已设置。如果是,则程序知道出了点问题。

该标志始终有效,因为可以在程序启动时立即将其设置,并在程序正常退出时将其关闭。如果程序退出时发生意外错误,例如计算机意外关闭,则该标志仍会设置,因为它没有正常退出。然后,该程序便可以知道上次运行未正常退出。


2

就像@bamboom所说,有几种不同类型的计算机“崩溃”必须以不同的方式处理。实际上,停电与零误差的整数除法有很大不同。

由于许多编程语言还支持异常(当出现完全错误时,控制分支到错误处理程序),因此有可能拥有顶级的应用程序级错误处理程序,可以保存应用程序的状态(包括所有打开的文档,所做的更改) ,等等)发生未处理的应用程序错误。然后的想法是在重新启动应用程序时尝试全部读回。根据错误的类型以及确切的实现方式,它并不总是有效的,当然,每个单独的应用程序都必须面对错误并使用结果数据来做有意义的事情-但它可以是令人惊讶的有效策略,可帮助用户以最少的工作损失从崩溃中恢复。


2

我想在这里做一个简单的介绍,因为这里有一个文件系统标签。

您可能已经记得使用FAT / FAT16 / FAT32文件系统的Windows操作系统。当用户遇到断电并且整个系统崩溃时,有时会出现问题。尝试重新引导后,它会说文件丢失并且无法引导。发生这种情况是因为FAT32无法跟踪其以事务方式执行的操作。

相反,较新的NTFS文件系统获得了对其基础结构的日志支持,这意味着在底层操作系统和硬件访问层上,通过记录要提交的任何操作,信息将保持稳定的安全状态。


1

在某些操作系统上的某些应用程序中,可能会挂入信号,例如指示内存访问冲突的分段错误。在这种情况下,一个简单的例程可以保存尽可能多的数据。该数据是否可用是另一个问题-崩溃可能损坏了它。尽管应用程序可能在中断信号后继续运行,但不建议这样做,因为它可能处于不稳定状态,并且内存损坏,可能会导致进一步的问题。

其他应用程序使用自动保存,或两者结合使用-这取决于程序和平台支持捕获这些信号的需求。


提示:Windows没有它们。
kinokijuf 2012年

1

系统崩溃只是操作系统运行的另一个例程。发生“崩溃”的原因是因为程序或库无法加载或没有正确加载,并且具有对系统文件造成永久损害的能力。因此,为安全起见,Windows会强制关机/重新启动并停止所有对系统文件的写操作,然后再由违规程序/库允许编辑这些文件。

在关闭/重新启动之前,它执行与常规关闭/重新启动相同的功能:即保存系统文件等。

至于保存“进度”的单个应用程序(Word / Chrome),这是该应用程序的内部功能,可以按特定的时间间隔保存进度(通常也可以在程序设置中进行更改)。如果您遇到应用程序/系统崩溃,请在重新启动后查看该文件,并询问您是否要还原会话。


1

您可能正在谈论由于断电而导致操作系统关闭。可以说这是一种崩溃。

电源会(如果我想通过信号线)将其输入的任何长时间中断,适当的壁式交流电流通知主板,则要在其停止输出之前就将其通知给主板,这是向主板提供适当的直流电流。之所以可以这样做,是因为它将电能存储在大型电容器中。操作系统以硬件中断的形式接收此信号。

在此较长的时间间隔内,写缓冲文件系统有足够的时间将所有缓冲的写操作传输到永久物理存储介质,以及执行一些其他关闭例程。

写缓冲文件系统的一大优点是,通过对写操作进行排序,可以减少硬盘驱动器上的机械臂移动,使它们的距离越来越小。

这类似于@oleksii在他的回答中所说的,除了在写缓冲文件系统中,通常不会立即传输已完成的事务,而只是对其进行缓冲。电源故障时,应将完成的事务转移到磁盘。


0

应用程序可以捕获C语言中的信号并保存某些数据。您可能会意外收到的一个信号是SIGFPE浮点算术异常(ANSI)。错误包括被零除和溢出。另一个单字是SIGINT,它是通过在控制台或终端上按ctrl + C组合键终止的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.