我在这里看到了几个关于exceptions的问题,其中一些提示interrupts as exceptions,但没有一个能清楚地表明连接。
什么是中断?
什么是例外? (请解释您所知道的每种语言的例外情况,因为存在一些差异)
什么是异常中断,反之亦然?
答案 0 :(得分:19)
您的处理器将有许多外部中断引脚。通常,这些引脚连接到硬件,用于指示何时发生某些外部事件。例如,如果您使用串行端口,UART将升高一个引脚,该引脚连接到处理器上的一个中断引脚,以指示已接收到一个字节。
其他外设如定时器,USB控制器等也会在某些外部事件的基础上产生中断。
当处理器在其中一个外部中断引脚上接收到信号时,它将立即跳转到内存中的某个指定位置并开始执行。执行的代码通常称为ISR或中断服务例程。除非您正在实施驱动程序或使用某种类型的嵌入式软件,否则您不可能遇到ISR。
不幸的是,关于例外的问题的答案有点不太清楚 - 本页的其他答案中列出了3种不同的含义。
Ron Savage的回答是指软件构造。这纯粹是一个应用程序级异常,其中一段代码能够指示一些其他代码可以检测到的错误。这里根本没有硬件参与。然后是任务所见的异常。这是一个操作系统级别的构造,用于在任务非法时执行任务 - 例如除以0,非法访问内存等。
第三,存在硬件异常。在行为方面,它与中断相同,因为处理器将立即跳转到某个指定的存储器位置并开始执行。异常与中断不同的是异常是由处理器检测到的某些非法活动引起的。例如,处理器上的MMU将检测非法内存访问并导致异常。这些硬件异常是操作系统执行清理任务的初始触发器(如上段所述)。
答案 1 :(得分:11)
中断由CPU外部的设备(定时器滴答,磁盘操作完成,网络数据包到达等)生成,并且在程序执行时异步。程序执行的异常同步(例如,除以零,访问无效地址)。
除非您的程序在没有操作系统的情况下执行(或者您正在开发操作系统),否则它将永远不会看到原始异常/中断。它们被操作系统捕获并由它处理(中断),或者在被反射回用户程序之前转换为其他形式(例如UNIX上的信号,Windows上的结构化异常处理(SEH)),它有可能处理它
答案 2 :(得分:9)
中断是由硬件或特定CPU指令生成的CPU信号。这些导致中断处理程序被执行。诸如来自I / O硬件的I / O信号之类的事情会产生中断。
可以将异常视为中断的软件版本,仅影响其过程。
我不确定具体细节,但是可以实现中断。
答案 3 :(得分:8)
中断表明处理器核心外部的东西需要引起注意。它会中断程序的正常流程,执行中断服务程序(ISR)并通常返回到中断发生之前的位置。
这个基本主题有很多变化:中断可能由软件生成,另一个任务可能在ISR之后获得CPU等。关键点是中断可以随时发生,原因是代码/ CPU 无法控制。
定义异常有点棘手,因为它有三个意义层次:
硬件例外
某些处理器(例如PowerPC)定义异常以指示出现某种异常情况:系统重置,无效地址,某些虚拟地址转换缓存未命中等等。
这些异常也用于实现断点和系统调用。在这种情况下,它们几乎就像中断一样。
操作系统例外
某些硬件异常将由操作系统处理。例如,您的程序访问无效内存。这将导致硬件异常。操作系统有一个处理该异常的处理程序,并且操作系统会向您的应用程序发送信号(例如SIGSEGV),表示存在问题。
如果你的程序安装了信号处理程序,信号处理程序将运行并希望处理这种情况。如果您没有信号处理程序,则可以终止或暂停程序。
我会认为窗口的结构化异常处理程序(SEH)是这种类型的异常。
软件例外
Java,C ++和C#等语言具有软件异常的概念,其中语言用于处理与程序操作相关的无法预料或异常的条件。在这种情况下,代码中的某个点会引发异常,程序执行堆栈上的某些代码会“捕获”异常并执行。这就是try / catch块的功能。
答案 4 :(得分:5)
我将详细说明中断是什么,因为还有一个关键类型的中断没人处理过:计时器。
但首先,让我备份。当你得到一个中断时,你的中断处理程序(它位于内核空间中)会运行,这通常会禁用中断,查看任何未决的业务(处理刚刚到达网络的数据包,处理击键等)然后(记住我们) “此时仍然在内核中”确定下一个应该运行的进程(可能是同一个进程,可能是不同的进程,取决于调度程序)然后运行它。
在任何给定时间,处理器上只运行一个进程。当你使用多任务操作系统时,它在它们之间切换的方式称为上下文切换 - 基本上处理器的寄存器被转储到内存,流程传递到新进程,当进程完成时你上下文切换到某个东西其他
所以,假设我写了一个简单的C程序,它可以计算所有数字,或Fibonacci序列,或其他不停止的东西。或者甚至更好:只做一次while(1)循环内部的旋转。系统上的其他进程如何运行?如果没有任何事情导致中断怎么办?
答案是你有一个不断打断的计时器设备。正是这使得整个系统不再需要一个旋转过程。虽然我会注意到中断处理程序禁用了中断,所以如果你做了无限制阻塞的事情,你可以取下整个系统。
答案 5 :(得分:5)
异常是当处理器执行不在其正常路径上的代码时。这是正常操作的“例外”,它基本上是通过代码和控制结构的线性移动。不同的语言支持各种类型的异常,通常用于在程序操作期间处理错误。
中断是硬件级别的异常(通常)。中断是处理器中的物理信号,它告诉CPU存储其当前状态并跳转到中断(或异常)处理程序代码。处理程序完成后,将恢复原始状态并继续处理。
中断始终是一个例外,即使它是预期的。中断可能表明:
这些总是强制处理器暂停其当前活动来处理引发的异常,只有在中断处理程序完成后才会恢复。
就中断而言,常见的陷阱是竞争条件。例如,您可能有一个周期性地增加全局实时时钟的中断。 32位机器上的时钟可能是64位。
如果程序正在读取时钟,并获得第一个32位字,那么中断发生,一旦中断处理程序退出进程得到第二个32位字,并且数据将是不连贯的 - 这两个字可能是不同步。如果您尝试使用互斥锁或信号量来锁定进程中的变量,那么中断将等待锁定并暂停系统(死锁),除非处理程序和使用数据的进程都非常仔细地写入。写中断时很容易陷入困境。
可重入函数也是另一个问题。如果您正在程序代码中执行funcA,请执行也执行funcA的中断,由于共享变量(静态或堆变量,类等),可能会导致意外后果。您通常希望在中断处理程序中尽可能少地执行代码,并经常让它设置一个标志,以便进程可以在以后执行实际工作,而不必担心冲突。
在某些方面,这类似于为多处理器开发,这也是内核编程仍然被许多人视为黑魔法的原因之一。
- 亚当
答案 6 :(得分:4)
预计中断会定期发生(虽然有时它们不是常规的)..他们中断 cpu,因为重要的事情刚刚发生,需要立即处理。
规则的例外应该是例外;这些都是由软件抛出的,因为发生了意想不到的事情,这是你尝试对它做点什么的机会,或者至少是优雅的崩溃。
答案 7 :(得分:2)
当您谈论中断和异常时,您通常会谈论硬件级代码,中断和异常通常部分由硬件和部分软件实现。
中断是硬件中的事件(或在程序集中手动触发),它与可用于处理中断事件的处理程序向量相关联,可以是IO完成,IO错误(磁盘内存故障),IO事件(例如鼠标移动)。当发生某些意外中断时,中断通常会引发异常。
异常是一种意外行为,通常是在使用来自中断的硬件时,使用中断处理程序在软件中单独处理。我们看到的编程语言几乎总是把它伪装成某种控制结构。
答案 8 :(得分:2)
通常,中断是某种硬件实现的陷阱。您为特定中断注册了一个处理程序(除以0,外围设备上可用的数据,计时器已过期),当该事件发生时,所有处理系统范围都停止,您可以快速处理中断,并且事情继续进行。这些通常在设备驱动程序或内核中实现。
异常是一种处理代码中错误的软件实现方式。您为特定(或一般)异常设置了处理程序。当发生异常时,语言运行时将开始展开堆栈,直到它到达该特定处理程序的处理程序。此时,您可以处理异常并继续,或退出程序。
答案 9 :(得分:2)
Iterrupts基本上是硬件驱动的,就像您的打印机指示它“缺纸”或网卡指示它已断开连接一样。
异常只是程序中的错误条件,由try / catch块检测到。像:
Try
{
... various code steps that "throw exceptions" on error ...
}
catch (exception e)
{
print 'Crap! Something bad happened.' + e.toString()
}
这是捕捉代码块中发生的“任何错误”的便捷方式,因此您可以以类似的方式处理它们。
答案 10 :(得分:2)
保持简单......
当你完成处理中断时,你(通常)会在你被打断之前回到你正在做的事情。
处理异常涉及丢弃当前正在处理的各个层,直到您冒泡到可以处理(捕获)异常的点。
在处理中断时,您可能决定抛出异常,但这并不意味着您必须将中断本身视为异常。例外不会“中断”(因为这意味着在你被打断之前可能会回到你正在做的事情上);而是他们“中止”(当前活动的某些子集)。
并且,正如已多次提到的,中断通常由外部实体(如硬件或用户)(例如鼠标单击或CTRL-C之类的击键)触发,而异常由软件检测到“问题”同步生成(抛出) “或”特殊条件“。