我给人的印象是,当计算机崩溃时,出现了问题,无法再运行了。
我想知道计算机如何在崩溃之前保存内容?
该计算机真的能够知道何时将崩溃(并因此通知所有进程:“请尽快保存,因为我将要崩溃 ”)?
如果不是,怎么可能像程序Chrome
和Microsoft Word
可以提供“恢复”服务计算机崩溃后?
我给人的印象是,当计算机崩溃时,出现了问题,无法再运行了。
我想知道计算机如何在崩溃之前保存内容?
该计算机真的能够知道何时将崩溃(并因此通知所有进程:“请尽快保存,因为我将要崩溃 ”)?
如果不是,怎么可能像程序Chrome
和Microsoft Word
可以提供“恢复”服务计算机崩溃后?
Answers:
当计算机“崩溃”时,可能是由于“突然的”电源故障(在这种情况下无法执行任何操作),也可能是由于某种讨厌的内部事件(例如,损坏的页表)导致的同样会阻止执行任何操作,或者可能是由于某种情况而以某种方式简单地阻止了“进一步的操作”-也许无法启动新进程,也许无法更新显示,也许系统只是存储空间不足。
在这些后一种情况下,操作系统仍可以在一定范围内运行,并且至少可以完成正在进行的磁盘操作,很好地关闭文件等。此外,如果可以使用更多功能,则操作系统可以告诉各种应用程序干净地关闭自己的过程。
但是,即使系统“硬”崩溃,整个系统和单个应用程序也可能维护了一个“日志”和/或“检查点”系统,以允许恢复整个系统和单个应用程序的状态到“原子”点,那里的所有东西都是“内部一致的”,并且丢失了最少的重要数据。
所有这些都不是用单一的机制完成的,而是在系统和应用程序级别的功能层。
具体来说,关于电源故障,可能会提前通知,也可能不会,并且“提前”警告可能是几分之一秒或几分钟(使用UPS或笔记本电脑电池出现故障)。可以采取的措施取决于警告的数量。
在大多数情况下,对于不带UPS的台式机系统,最好是“静默”磁盘操作的最佳时间,这样,当电源最终消失时,没有磁盘处于写入中间。这样可以防止在磁盘上生成损坏的扇区。过去,当RAM小得多时,可能有足够的时间(电源中装有大容量电容器,或者甚至奇怪地使用存储在磁盘驱动器转子中的能量来发电)将RAM写入磁盘,然后再上电下降了,但是当RAM增长到100M左右时,这种可能性几乎消失了。
[并注意,在过去,当用磁性“核”制作存储器时,断电会固有地保留RAM(尽管断电时读取/写入的特定字可能会损坏)。这使那些旧系统更容易从电源故障中恢复。]
但是,对于类似UPS的产品(可能会提供几分钟到几小时的额外电力),还有更多选择。一种是简单地关闭系统,就像您请求“关闭电源”一样。这将导致每个应用程序自身结束,然后整个系统写出永久表并关闭。这可能会花费很长时间(我相信你们中很多人已经注意到了)。但是也可以使用“休眠”策略,将RAM作为单个块写入磁盘,然后关闭系统电源。在“休眠”方案中,在恢复电源时,将RAM读回到其确切写入位置,然后在此处写入几位,然后重新执行,然后从中断处恢复执行。
在某些较旧的“大铁”系统上,使用了半休眠策略来进行紧急关机:内存将按上述方式写出,但是当电源恢复并读入内存时,就会发生标准关机。这样做是因为无法可靠地保存/恢复系统状态的某些位(尤其是在I / O控制器中),以允许继续操作。
Chrome和Microsoft Word在工作时会定期保存您的当前状态。如果应用程序或计算机崩溃,则在重新启动应用程序时,它们会在磁盘上查找已保存的状态,并为您恢复状态。他们不需要预测崩溃。他们会不断保存您的状态,以防出现问题。
编辑:这仅在应用程序崩溃时有效,而不是Windows。
从Windows Vista开始,有一个新的API,允许Windows崩溃时在应用程序中调用特殊功能,以便它可以在关闭之前尝试恢复任何数据。它是这样的:
RecoverData()
RecoverData()
在App中执行RecoverData()
尝试检索有关当前打开的文档的数据,与此同时,它一直对Windows进行ping操作以告知其仍在忙于恢复。RecoverData()
完成/超时/停止执行ping时,Windows终止应用程序并重新启动它。详细信息:http : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa373351(v=VS.85).aspx
RecoverData()
?
好了,他们只是在崩溃前保存了当前状态。就像每X秒自动保存一次。
我认为确实必须区分:
这取决于崩溃的严重程度。非常严重的崩溃(在计算机的最低级别)将导致计算机简单地停止运行。保存的唯一工作是每个应用程序定期自动保存其数据。
对于不太严重的崩溃,计算机将警告每个程序需要关闭。如果程序侦听此消息,则程序将在此保存当前数据。但是,并非所有程序都注意此消息。
程序将它们的状态定期保存在磁盘上的文件中。计算机无法识别它。实际上,崩溃转储甚至没有使用磁盘驱动程序执行-系统只是将所有内存分页。
我给人的印象是,当计算机崩溃时,出现了问题,无法再运行了。
是的,这是完全正确的。但是,从逻辑角度看,您的程序并非在计算机上不受限制地运行。该程序正在操作系统下运行!
我想知道计算机如何在崩溃之前保存内容?计算机是否真的能够知道何时会崩溃(并因此通知所有进程:“请尽快保存,因为我将要崩溃”)?
好吧,在BSOD或内核崩溃的情况下,操作系统确定将要发生真正不安全的事情(无效的内存指针,覆盖分配给OS内核的某些内存,访问不存在的硬件等)。 )。在这种情况下,操作系统将要求所有进程停止执行,将RAM的内容保存到磁盘上(因为操作系统还负责管理内存分配),并安全地关闭或重新启动计算机。
当程序抛出未处理的异常时,各个应用程序本身就会崩溃,该异常会传播到操作系统中。在这种情况下,操作系统将停止执行程序,并关闭所有打开的内存/文件句柄。
在上述两种情况下,通常都不会正常终止程序执行。在这些情况下,由于各个应用程序突然只是“停止”执行,因此需要由各个应用程序恢复。
如果不是,在计算机崩溃后,Chrome和Microsoft Word之类的程序如何提供“恢复”服务?
IIRC,这两个应用程序都定期将应用程序状态保存到磁盘,以防止发生上述情况时数据丢失。例如,Word每隔几分钟会自动保存当前工作文档的备份副本,以便在突然硬重启的情况下,您仍然可以恢复数据(付出或花费几分钟的时间),而无需执行以下操作:做任何事情。
同样,作为开发人员,您有责任确保您的应用程序可以应对这些情况。
kindall
所述,它们不会还原(因为如果您确实还原了RAM,则您将处于相同的执行状态,从而首先导致计算机崩溃!)。您可以在系统属性->高级->启动和恢复下更改Windows中写入磁盘的内容。再次kindall
说明,该信息对于尝试确定导致错误的原因的开发人员最有用。
在某些操作系统上的某些应用程序中,可能会挂入信号,例如指示内存访问冲突的分段错误。在这种情况下,一个简单的例程可以保存尽可能多的数据。该数据是否可用是另一个问题-崩溃可能损坏了它。尽管应用程序可能在中断信号后继续运行,但不建议这样做,因为它可能处于不稳定状态,并且内存损坏,可能会导致进一步的问题。
其他应用程序使用自动保存,或两者结合使用-这取决于程序和平台支持捕获这些信号的需求。
您可能正在谈论由于断电而导致操作系统关闭。可以说这是一种崩溃。
电源会(如果我想通过信号线)将其输入的任何长时间中断,适当的壁式交流电流通知主板,则要在其停止输出之前就将其通知给主板,这是向主板提供适当的直流电流。之所以可以这样做,是因为它将电能存储在大型电容器中。操作系统以硬件中断的形式接收此信号。
在此较长的时间间隔内,写缓冲文件系统有足够的时间将所有缓冲的写操作传输到永久物理存储介质,以及执行一些其他关闭例程。
写缓冲文件系统的一大优点是,通过对写操作进行排序,可以减少硬盘驱动器上的机械臂移动,使它们的距离越来越小。
这类似于@oleksii在他的回答中所说的,除了在写缓冲文件系统中,通常不会立即传输已完成的事务,而只是对其进行缓冲。电源故障时,应将完成的事务转移到磁盘。
应用程序可以捕获C语言中的信号并保存某些数据。您可能会意外收到的一个信号是SIGFPE浮点算术异常(ANSI)。错误包括被零除和溢出。另一个单字是SIGINT,它是通过在控制台或终端上按ctrl + C组合键终止的