Tre*_*key 17 c++ cpu operating-system exception-handling exception
从操作系统的角度来看,异常如何运作?
来自C++,我可以从程序员的角度理解异常.
抛出异常时,堆栈开始展开,每个激活记录都有机会捕获并处理异常.
但是,他们的责任是首先抛出异常?
这是两个崩溃的程序,说明了我的不确定性.
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异常时,这完全由编译器生成的代码和语言运行时库处理,不需要内核调用,并且处理器不会生成硬件错误.
你在谈论两个完全不同的异常过程.
第一个是由OS提供的.在Windows中,您可以使用__try和__except处理它们.
第二个是由C++编译器提供的,不以任何方式涉及操作系统.
由于我只知道用C++编写的一个或两个操作系统,以及我更熟悉的操作系统,根本没有正式使用异常,这几乎排除了操作系统抛出的异常.
三个主要的操作系统(Linux,Windows,MacOS X)以及所有形式的Unix(AIX,Solaris,HP-UX等)都是用C语言编写的,以及几乎所有其他商业上没有用汇编语言编写的操作系统. ,所以不能抛出C++类型的异常[这并不是说没有软件驱动的异常,只是它们不是你在C++中用"try/catch"捕获的异常类型而没有某种翻译].
在第一个例子中,操作系统肯定涉及[在所有操作系统中我知道它们如何工作],因为除以零会导致所有具有除法功能的机器上的硬件异常,因此需要涉及操作系统.此外,无论是C++,C还是在汇编程序中编写相同的东西,它都会以相同的方式编译和失败.对于大多数操作系统,他们会向程序发送一个信号,但由于你没有处理信号的代码,你的代码很可能只是中止,告诉操作系统发生了一些奇怪的事情而且它正在放弃,甚至没有打扰放松堆栈.
在第二种情况下,操作系统根本不涉及.在对main的调用周围有一个"try-catch"块,其中写着"哎呀,有人投掷了一些未捕获的东西,让我们退出".涉及操作系统的唯一部分是"退出此过程",当然这需要由操作系统完成,尽管我相信大多数操作系统,只是从"应用程序的起始地址"返回也将有同样的效果.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |