抛出异常是谁的责任?操作系统或流程?

Tre*_*key 17 c++ cpu operating-system exception-handling exception

从操作系统的角度来看,异常如何运作?

来自C++,我可以从程序员的角度理解异常.
抛出异常时,堆栈开始展开,每个激活记录都有机会捕获并处理异常.

但是,他们的责任是首先抛出异常?

  1. 操作系统是否向进程发送触发器,告诉它进入"异常处理状态"?
  2. 进程是否在其自己的程序空间中调用和处理异常,并未向操作系统发布?

这是两个崩溃的程序,说明了我的不确定性.

int main(){

    int i = 1/0; //did the OS tell the process to end?

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <exception>

int main(){

    throw 11;  //did the process tell the OS it needs to end?

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

amd*_*mdn 12

C++异常是语言的一部分,由语言标准定义,并由编译器和运行时库实现.exceptionsCPU还可以检测到其他内容,例如除以零或取消引用NULL指针,这两者都是语言标准中未定义行为的示例.这些是faults处理器术语,并且在x86上例如触发a fault handler然后由OS提供服务.然后操作系统可以选择将故障报告给导致它的进程,在Unix上完成signals.例如,如果您的进程已经安装了signal handlerfor SIGSEGV,那么当进程取消引用NULL指针时,它可以处理CPU生成的错误...该机制与该语言定义的C++异常是分开的.

在您的示例中,当C++程序throws异常时,这完全由编译器生成的代码和语言运行时库处理,不需要内核调用,并且处理器不会生成硬件错误.


Mar*_*som 8

你在谈论两个完全不同的异常过程.

第一个是由OS提供的.在Windows中,您可以使用__try__except处理它们.

第二个是由C++编译器提供的,不以任何方式涉及操作系统.

  • +1我还要补充一点,C++异常具有特定于平台的实现,通常基于OS提供的功能. (4认同)

Mat*_*son 6

由于我只知道用C++编写的一个或两个操作系统,以及我更熟悉的操作系统,根本没有正式使用异常,这几乎排除了操作系统抛出的异常.

三个主要的操作系统(Linux,Windows,MacOS X)以及所有形式的Unix(AIX,Solaris,HP-UX等)都是用C语言编写的,以及几乎所有其他商业上没有用汇编语言编写的操作系统. ,所以不能抛出C++类型的异常[这并不是说没有软件驱动的异常,只是它们不是你在C++中用"try/catch"捕获的异常类型而没有某种翻译].

在第一个例子中,操作系统肯定涉及[在所有操作系统中我知道它们如何工作],因为除以零会导致所有具有除法功能的机器上的硬件异常,因此需要涉及操作系统.此外,无论是C++,C还是在汇编程序中编写相同的东西,它都会以相同的方式编译和失败.对于大多数操作系统,他们会向程序发送一个信号,但由于你没有处理信号的代码,你的代码很可能只是中止,告诉操作系统发生了一些奇怪的事情而且它正在放弃,甚至没有打扰放松堆栈.

在第二种情况下,操作系统根本不涉及.在对main的调用周围有一个"try-catch"块,其中写着"哎呀,有人投掷了一些未捕获的东西,让我们退出".涉及操作系统的唯一部分是"退出此过程",当然这需要由操作系统完成,尽管我相信大多数操作系统,只是从"应用程序的起始地址"返回也将有同样的效果.