java - 中断和异常——与编程语言的关系
问题描述
我试图了解操作系统和编程语言中的中断/异常之间的关系。请注意,这是基于我的理解,我可能完全不正确。
- 中断通常由硬件启动。软件中断也存在 - 我有一个问题,我在下面提到。
- 异常分为 3 种类型 - 陷阱、故障和中止
我来自 Java 背景,当我想到 Java(或任何编程语言)中的异常时,我正试图围绕这些概念展开思考。
我特别有兴趣了解编程语言提供的处理程序(不必限于 Java)与内核提供的处理中断和异常的处理程序之间的关系。
JDK 中是否有任何有关陷阱、故障、中止类别的示例?我知道这些是操作系统概念,但我很想至少有一部分编程语言异常可能属于这些类别。
软件中断和陷阱(这是一个异常)有什么区别?
是否有来自 Java 的陷阱示例?我认为导致系统调用(如打开文件)的那些可能是软件中断陷阱。
我知道这是一口,谢谢你的时间。
解决方案
您混淆了硬件异常,硬件异常分为 3 种类型(陷阱、故障和中止)和软件异常,通常不是。
trap、fault 和 abort 的区别在于发生异常后机器的状态,并影响是否可以继续,以及是否会重新执行导致异常的指令或之后的指令。
软件异常通常以调用诸如信号、引发或抛出等名称的例程开始。然后异常分派器使用设计者认为合适的任何规则搜索处理程序。
(请注意,硬件异常可能会变成软件异常——例如,硬件陷阱到已知地址,然后该处理程序有效地“引发”软件异常)。
根据机制的设计,软件异常可能是可持续的,也可能不是。Java 异常是不可持续的;在输入异常处理程序('catch' 语句)之前,堆栈被展开。因此,如果您真的想将 Java 异常映射到陷阱/故障/中止分类,最接近的匹配是“中止”。
其他语言有不同的想法 - 处理程序可能在堆栈展开之前进入,处理程序可以展开堆栈,或者从异常点继续,可能在解决问题之后。然而,这些天来,这种方法(“恢复语义”)已经不受欢迎,取而代之的是不可持续的异常(“终止语义”)。
总结:一个软件系统或编程语言定义了它的异常概念。硬件有类似但不相同的关注点,但操作系统或运行时系统有必要将硬件操作映射到软件异常。例如,可能是硬件陷入内核模式,但软件异常需要传递给用户模式下的特定程序。
软件异常并不总是在编程语言中实现。例如,Windows(以及更早的系统,如 VMS)提供结构化异常处理作为系统级功能;语言特性可能建立在此之上,但基本思想适用于所有程序,包括那些用汇编代码编写的程序。
推荐阅读
- security - SSL证书如何防止中间人攻击?
- android - Locale.getDefault() 与 Locale.English 的主要区别 android kotlin
- javascript - React.JS:由useEffect引起的表单问题
- python - 从python中的子类调用父类构造函数
- electron - 带有进度条的 Electron,js 中的自动更新
- html - 通过 URL 自动填充页面中的字段
- flutter - 如何将两个图像保持在一个屏幕上?
- node.js - 用户注册时如何自动创建子域
- azure - 通过 CLI 登录 CI/CD
- asp.net-identity - asp.net core 自定义访问控制器