首页 > 解决方案 > 中断和异常——与编程语言的关系

问题描述

我试图了解操作系统和编程语言中的中断/异常之间的关系。请注意,这是基于我的理解,我可能完全不正确。

  1. 中断通常由硬件启动。软件中断也存在 - 我有一个问题,我在下面提到。
  2. 异常分为 3 种类型 - 陷阱、故障和中止

我来自 Java 背景,当我想到 Java(或任何编程语言)中的异常时,我正试图围绕这些概念展开思考。

我特别有兴趣了解编程语言提供的处理程序(不必限于 Java)与内核提供的处理中断和异常的处理程序之间的关系。

  1. JDK 中是否有任何有关陷阱、故障、中止类别的示例?我知道这些是操作系统概念,但我很想至少有一部分编程语言异常可能属于这些类别。

  2. 软件中断和陷阱(这是一个异常)有什么区别?

  3. 是否有来自 Java 的陷阱示例?我认为导致系统调用(如打开文件)的那些可能是软件中断陷阱。

我知道这是一口,谢谢你的时间。

标签: javacunixexceptionoperating-system

解决方案


您混淆了硬件异常,硬件异常分为 3 种类型(陷阱、故障和中止)和软件异常,通常不是。

trap、fault 和 abort 的区别在于发生异常后机器的状态,并影响是否可以继续,以及是否会重新执行导致异常的指令或之后的指令。

软件异常通常以调用诸如信号、引发或抛出等名称的例程开始。然后异常分派器使用设计者认为合适的任何规则搜索处理程序。

(请注意,硬件异常可能会变成软件异常——例如,硬件陷阱到已知地址,然后该处理程序有效地“引发”软件异常)。

根据机制的设计,软件异常可能是可持续的,也可能不是。Java 异常是不可持续的;在输入异常处理程序('catch' 语句)之前,堆栈被展开。因此,如果您真的想将 Java 异常映射到陷阱/故障/中止分类,最接近的匹配是“中止”。

其他语言有不同的想法 - 处理程序可能在堆栈展开之前进入,处理程序可以展开堆栈,或者从异常点继续,可能在解决问题之后。然而,这些天来,这种方法(“恢复语义”)已经不受欢迎,取而代之的是不可持续的异常(“终止语义”)。


总结:一个软件系统或编程语言定义了它的异常概念。硬件有类似但不相同的关注点,但操作系统或运行时系统有必要将硬件操作映射到软件异常。例如,可能是硬件陷入内核模式,但软件异常需要传递给用户模式下的特定程序。

软件异常并不总是在编程语言中实现。例如,Windows(以及更早的系统,如 VMS)提供结构化异常处理作为系统级功能;语言特性可能建立在此之上,但基本思想适用于所有程序,包括那些用汇编代码编写的程序。


推荐阅读