我发现自己对这两个术语感到困惑。我原本以为当程序“崩溃”时,它会自动退出并终止进程。但是当程序停止响应时,它会给出“程序无响应”的错误,然后提示您下一步要做什么。
有没有术语可以描述“程序停止响应”?或者这个术语只是“崩溃”这个词?崩溃和程序停止响应这两者之间有区别吗?
答案1
有。
可以使用一种称为例外。 以下是它们工作原理的简单描述:
- 这个想法是,当程序的某个部分遇到错误或无法处理的事情时,你可以告诉它抛出一个例外。
- 程序的另一部分将预先设置为捕获异常 - 这是异常处理程序。
- 如果错误是异常处理程序无法处理的错误,它可以执行以下两项操作之一:
- 将其抛出到另一个可能能够处理它的异常处理程序中。
- 只需将其“抛出”到任何地方 - 如果没有异常处理程序愿意/可用来接收它,操作系统本身就会捕获它,然后您就会看到崩溃对话框。
因此,当程序崩溃时,它实际上已经放弃并终止了执行。
当程序停止响应时,情况就不同了。Windows 程序使用消息循环。 如果程序卡住了,无论是等待 I/O 还是无限循环,它都会停止从循环中获取消息,然后 Windows 会告诉您程序没有响应。当 RAM 不足并且操作系统必须使用页面文件来处理内存请求时,可能会导致程序意外等待 I/O。另一个可能是如果您的磁盘突然出现故障,而程序员从未考虑过写入文件可能会被此类事件中断的可能性 - 或者程序员做了类似“如果此操作失败,请永远重试”的事情。
因此在这种情况下,程序仍在运行,只是不再与 Windows 对话。
答案2
无响应的字面意思是 - 程序不接受/响应用户输入。它可能什么都不做,或者 CPU 可能已满负荷,它可能没有执行 I/O,也可能正在从文件读取/写入数据或尽可能快地发送网络数据包。它可能正在做它被设计要做的事情。它唯一没有做的事情就是及时响应用户输入。
当程序崩溃时,发生了一些意外的事情,而程序本身无法处理;当操作系统检测到这样的事件时,它(通常)会终止该程序。
在 Windows 中,应用程序可能因各种原因而无响应,包括编码错误和设计不佳,导致在执行某些长时间运行的操作时无法保持 UI 循环运行。Windows 会告诉您应用程序何时无响应,因为这可能是由于编码错误造成的;Windows 不会自动终止处于这种状态的应用程序,因为这可能只是由于长时间运行的任务执行不当造成的。