处理器是否有实际电路来帮助处理异常?

时间:2011-12-25 07:59:37

标签: exception exception-handling cpu

我的问题很简单:我想知道处理器是否试图以某种方式帮助处理异常。如果在设计处理器“准备就绪”时付出足够的努力,是否有可能完全消除异常处理和抛出的开销?

因为据我所知,所有异常处理都是通过软件完成的,这总会增加一些开销。我错了吗?

- 编辑

所以,谢谢以下所有答案。我很感激。你已经回答了我的问题。

但是,只是为了澄清我为什么这样说:一般来说,人们不会过于深入地优化异常,因为他们都认为“例外是针对特殊情况”,因此它们不是瓶颈。

我认为不应该只在极端情况下抛出异常。我认为,基本上,只要函数不符合它承诺的范围,就应该抛出异常。

如果我说:

doSomethingImportant();

如果无论什么原因“重要的事情”无法完成,这应该抛出异常。

当然,doSomethingImportant()可能无法遵守,因为系统内存不足(一个戏剧性的问题),但我认为我们应该能够更简单地建模“我现在不能这样做/这次,抱歉“进入我们的软件,嵌入到我们的设计中。我想说,我认为异常可以是例外,是的,但是它们可以像正常的软件流一样被预期,而不是系统必须“恢复”的“致命错误” ,nomsain?

虽然由优秀的数据中心支持的大型应用程序几乎不会因为异常处理而出现瓶颈,但请不要忘记有资源被计算的嵌入式设备的市场,并且的异常处理会产生影响(这就是我的目标)。

我个人觉得异常非常富有表现力,而且我想在嵌入式设备中使用它们,并且通过返回“-1”并使用“if”检查它来获得尽可能多的“开销”。

3 个答案:

答案 0 :(得分:3)

指令集架构文档中,例外是处理器的异常情况(如零分割,非法指令等)。它们通常被转换为中断(但大多数中断是外部信号到处理器)。

编程语言规范中, exceptions 是非本地控制流构造,通常涉及某种调用堆栈展开。

我相信最近的微架构特别处理堆栈指针(例如w.r.t.缓存和指令调度)。它们可能有一些专用于编写语言异常所需的堆栈指针更改的电路。

某些语言和实现具有比其他语言和机制更好的异常语义和机制。例如,Ocaml异常处理比C ++异常处理(至少使用GCC编译器)。

答案 1 :(得分:2)

通常有两种类型的异常处理:

  1. 语言异常。 (你用C ++ / Java或任何其他语言抛出的那种)
  2. 硬件例外。 (信号,seg-fault,misalignment等......)
  3. 我假设你在谈论第一个。截至目前,我不认为任何处理器都有此类支持。虽然我不是硬件设计师,但我的论点是为什么会出现这种情况,以及为什么异常处理可能永远不会在硬件中实现。

    1. 不同的语言有不同的异常处理协议。 C ++可能与Java,C#等不同......堆栈展开和析构函数调用会使这个过程复杂化。
    2. 异常处理是否是一个瓶颈?大多数高度优化的HPC性能关键型应用程序无论如何都不使用异常处理。大多数依赖于异常处理的面向OOP的代码通常会受到其他因素的影响。 (例如分支,缓存,内存等......)
    3. 因此,为异常处理添加硬件支持实际上并没有帮助正确的用户群。

答案 2 :(得分:1)

我不相信他们这样做,至少现在不行。异常处理不是机器代码的一部分,它是高级语言的一个特性,可以通过寄存器和调用堆栈,中断和其他东西相当容易地实现......并且编译器可以选择实现异常处理它想要。

所以是的,它总是会增加一些开销。但是,我没有看到将异常处理添加到任何CPU指令集的重点,因为。例外情况适用于特殊情况;如果它们导致性能问题被抛得太多,那么代码就会出错。