精华内容
下载资源
问答
  • 当我们分析某种中断事件时,我们需要搞清楚这四个对象:中断中断源是谁中断源在什么条件下触发中断中断源如何触发中断信号信号具体指的是什么信号是否需要存储如何存储中断控制器中断信号的管理比如说中断源发送的...

    什么是中断


    中断其实是一种“中断”事件,中断具体代表什么意思需要考虑它所处的上下文环境和参照对象是谁。考虑事件,我们可以简单把中断抽象为这样一种模型:

    1cd5ec6f5c744f04ffaf6d86ecb8f491.png

    当我们分析某种中断事件时,我们需要搞清楚这四个对象:

    中断源

    • 中断源是谁
    • 中断源在什么条件下触发中断
    • 中断源如何触发

    中断信号

    • 信号具体指的是什么
    • 信号是否需要存储
    • 如何存储

    中断控制器

    • 中断信号的管理

    比如说中断源发送的信号是否屏蔽,信号是否可被中断处理器重复处理,信号的处理是否有优先级...

    中断处理器

    • 如何获取到信号
    • 拿到信号做什么样的操作
    • 处理完信号后做什么样的操作

    在实际的中断事件中,并不一定刚好有上面提到的这四类对象,可能更复杂可能更简单化。但是当我们考虑中断事件时,需要明确应该有类似功能的“对象”承担这样的逻辑。

    下面我们主要围绕操作系统的中断机制,Java的中断机制,如何设计一个异步线程间的中断系统这三部分简单探讨下。

    操作系统的中断机制


    与操作系统有关的中断,通常是指:程序在执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行, 转去执行相应的事件处理程序,待处理完成 后再返回原程序被中断处或调度其他程序执行的过程。

    按照中断事件本身的不同,可以划分为处理器之外的中断事件,异常,系统异常。

    处理器之外的中断事件

    指由外围设备发出的信号引起的,与当前运行指令无关的中断事件。示意图如下:

    77ca5fad7ca0372d9399361ba4418f3b.png

    我们分别以上述四个对象来看:

    • 中断源

    中断源:外部设备,如打印机,键盘,鼠标等。

    触发条件:如外围设备报告I/O状态的I/O中断;外围设备发出的对应信号中断,如时钟中断,键盘/鼠标对应信号的中断,关机/重启动中断等。

    触发方式:由外部设备向中断控制器发出中断请求IRQ。

    • 中断信号

    也就是说中断源通知给中断控制器的是什么。

    可以是通过一条信号线上产生特定的电平(利用高低电平表示是否中断两种状态),也可以在总线上发送特定消息或者消息序列,也可以是在中断寄存器中设置已发生的中断状态等。

    • 中断控制器

    CPU中的一个控制部件,包括 中断控制逻辑线路和中断寄存器。负责中断的发现和响应。

    也就是说负责检查中断寄存器中的中断信号,当发现中断时让CPU切换当前进程程序,去处理中断程序。响应示意图如下:

    ad68dc17e7e25c5f41dae9c7da4eb2e7.png
    • 中断处理器

    指的是CPU接收到不同的中断信号该怎么处理。包括“中断处理过程”和“恢复正常操作”两部分。

    1.中断处理过程

    首先CPU需要将当前运行进程的上下文保存,从中断进程中分析PSW,确定对应的中断源和执行对应的中断处理程序。

    小贴士:PSW(Program Status Word): 是指在电脑中,一段包含被操作系统使用的程序状态信息的内存或硬件区域。一般用一个专门的寄存器来指示处理器状态。可以理解为我们上面提到的中断信号存储装置.

    2.恢复正常操作

    当中断程序执行完毕,接下来执行哪个进程由进程调度决定,由调度策略决定是否调度到中断执行前的进程。

    较为完整的中断响应流程图如下:

    75a70209feba7432cb8d085e3acebb34.png

    异常系统异常 这两类中断事件主要属于处理器执行特定的指令引起的中断事件。和上述硬件外围设备引起的中断事件的中断源不同,中断的发起,控制和处理主要是由操作系统的指令逻辑和线路来承担。是一种同步的处理操作,而外部中断是由外部设备发起,是一种异步的处理操作。下面我们简要介绍下。

    异常

    异常指当前运行指令引起的中断事件。包括错误情况引起的故障,如除零算数错误,缺页异常;也包括不可恢复的致命错误导致的终止,通常是一些硬件错误。

    • 异常的处理

    对于故障的处理,根据故障是否能够被恢复,故障处理程序要么重新执行引起故障的指令,要么终止。

    d44b09219d39c16e8710cbdd76372ade.png

    对于终止的处理,处理程序将控制返回给一个abort例程,该例程会终止这个应用程序。

    2491ed93e8b68bce20e9a2feadfe750f.png

    系统异常

    系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等。

    • 系统调用的处理

    这种有意的异常,称为陷阱处理。处理完成后陷阱程序会将控制返回给应用程序控制流的下一条指令。

    7e30d0d3ac2dde2c7822af77e417b273.png

    总结一下,操作系统的中断类别行为如下:

    b3dbd0fad85ea3830eaca291917cfff1.png

    好了,大头总算完了。因为小姐姐主要是Java码农,下面将主要介绍和Java相关的中断语义是什么。

    Java的中断机制


    理解了上面操作系统的中断之后,Java的中断机制就很easy了 :D

    Java中断指的是 A线程发送中断信号给B线程,B线程再根据自己当前执行程序中的中断处理逻辑决定如何响应。嗯,就这么简单~

    我们来稍微分析一下中断事件中的“四个对象”:

    • 中断源

    中断源:A线程

    中断触发条件:A线程说了算

    中断源触发方式:A线程中调用threadB#interrupt()方法.

    实现机制也不难,扯淡之前我们先思考两个问题:

    问:

    问题1: 线程之间如何通信,A线程的中断信号怎么才能传给线程B?

    问题2: 线程的状态有Running,Blocked,Waiting等,当线程B处在不同的状态下,如何响应中断信号?

    答:

    问题1:这种情况下线程之间通信用共享内存就可以了。只需要给每个线程都设置一个中断标示位, 这样A线程中调用threadB#interrupt()方法,实际操作是把B线程的中断标示位设置为true。信号就算传递过去了

    问题2:当B线程处于非阻塞状态时,B线程可以在自己需要处理中断逻辑的地方判断中断标示位是否为true,就可以响应处理中断。

    但是当B线程处于阻塞状态时,这特么怎么查自己的中断标示位啊?

    JVM帮帮忙,当B线程阻塞在Object#wait(),Thread#join(),Thread#sleep(),实现了InterruptibleChannel接口的IO操作 和Selector接口的select()这些操作时,JVM会让B线程马上抛出异常或被唤醒,从而让B线程可以选择是否响应中断。

    因为是Java实现的中断机制,中断标示位的设置也是JVM帮做的。

    • 中断信号

    信号:线程的中断标示位。

    存储方式:JVM说了算。

    • 中断控制器

    JVM控制了信号的存储和让线程B及时唤醒。线程B控制了自己的中断响应逻辑,何时响应,如何响应。

    • 中断处理器

    获取信号:B线程可通过调用threadB#isInterrupted()方法得知自己是否被中断,也就是通过自己主动拉取信号(poll方式)。

    如何处理信号:B线程说了算。

    处理完信号后做什么:B线程说了算。

    Java的线程中断机制设计的比较灵活,使用者可以决定中断处理的较多事情。

    总结下Java中和中断有关的方法:

    7492062db2b090ab53a568d3d3c169e1.png

    在JDK中,线程池的ThreadPoolExecutor#shutdownNow()方法就是调用workers线程数组中每个worker线程的interrupt()方法来关闭线程池。

    这样暴力关闭线程会存在一个问题,线程池并不知道worker线程的中断执行情况,如果worker线程忽略了中断信号,那可能导致当前任务还在执行,发生意想不到的结果。

    设计一个异步线程间的中断系统


    我们再来看Java的中断机制,它其实只是提供了A线程给B线程发送中断信号。

    • A线程并不能知道B线程的中断处理结果。
    • 如果A线程拿不到B线程的thread对象时,也就没法发送中断信号。

    考虑这么一种场景:当我们执行一个大任务Task1时,它太大了。我们把它分为Task2和Task3,丢进线程池中处理。它们同样很大,我们把他们分别分为Task4,Task5和Task6,Task7,同样丢进线程池中处理。

    d139921e1cfd43ce62260a6e0260f396.png

    如果此时我们想取消task1的执行,如何保证图中所有的worker都成功取消对应task的执行?

    • 需求分析

    当我们取消task1时,想要做的是取消所有task程序的继续运行,并且能够获得所有task程序的取消结果。

    为什么要强调task程序呢?因为worker可能并不是只为一个task工作啊..比如task2的worker,它把task4和task5丢进线程池,就算完事了。如果我们把取消task1变为取消task1的worker线程,可能会导致worker线程当前运行的非task1程序的失败。

    我们不太容易知道所有task程序当前运行的线程,我们还需要知道所有task程序的运行结果。

    • 设计思路

    只用Java的中断机制是满足不了我们的需求的,但是我们可以借鉴它的思路:

    1.它用中断标示位记录线程是否应该中断

    2.当线程阻塞时可以抛出异常

    我们这里要终止的是所有task程序的执行,所以我们需要设计与task 强绑定的中断标示位,可以有未中断,中断中,中断成功,中断失败四种 状态。为了让所有的线程都可以访问到,定义成全局共享变量就可以。

    0fe1de9076b267b647de55f3b94e8347.png

    中断源和中断处理器之间通过task的中断标示位来通信就可以。如果运行task程序的线程一直在阻塞,怎么唤醒它让它判断中断状态 呢?

    对于我们这个场景,我们很难知道当前运行task程序的阻塞线程是谁。。能做的只是多安插中断判断点,这样当阻塞线程醒来后,再次判断task 的中断标示位,就可以响应中断了。

    另:

    唤醒一个线程只有Java的中断机制可以做,但是如果当前worker不是你能管理的线程池,那么它的中断处理逻辑就控制不了。

    如果你能控制运行task的所有worker,而且worker在执行task时是同步获得结果的。那么可以结合与task强绑定的中断标示位和Java中断机制来做,这里前者的作用更多是充当获取到任务的中断结果的作用。

    后记


    • 小姐姐觉得像是“事件处理”这种场景在线程池,消息中间件,流式处理等很多地方有共通之处,比如说:如何保证事件的exactly once,推拉模型,调度等等。
    • 在写这篇文章时,特别是操作系统的中断机制,小姐姐也是现学现卖,并且参考了资料大部分内容。文章中有理解错误或者难懂的地方还请小伙伴帮我指出,一起交流进步。
    • 最后的技术部分讨论“如何设计一个异步线程间的中断系统”,这是小姐姐目前工作中遇到的一个问题。这个问题和任务调度组件的取消任务很相似,只是我们目前还没有用任务调度组件管理起所有的任务工作线程。小伙伴有更好方案的也请告知小姐姐。
    展开全文
  • 当我们分析某种中断事件时,我们需要搞清楚这四个对象:中断中断源是谁中断源在什么条件下触发中断中断源如何触发中断信号信号具体指的是什么信号是否需要存储如何存储中断控制器中断信号的管理比如说中断源发送的...

    77ab9a777ad1e13164e002ebbc53a7c7.png

    # 什么是中断

    中断其实是一种“中断”事件,中断具体代表什么意思需要考虑它所处的上下文环境和参照对象是谁。考虑事件,我们可以简单把中断抽象为这样一种模型:3461ffe86afd5a8be1b8faebc31a4a04.png

    当我们分析某种中断事件时,我们需要搞清楚这四个对象:

    中断源

    • 中断源是谁
    • 中断源在什么条件下触发中断
    • 中断源如何触发

    中断信号

    • 信号具体指的是什么
    • 信号是否需要存储
    • 如何存储

    中断控制器

    • 中断信号的管理

    比如说中断源发送的信号是否屏蔽,信号是否可被中断处理器重复处理,信号的处理是否有优先级...

    中断处理器

    • 如何获取到信号
    • 拿到信号做什么样的操作
    • 处理完信号后做什么样的操作

    在实际的中断事件中,并不一定刚好有上面提到的这四类对象,可能更复杂可能更简单化。但是当我们考虑中断事件时,需要明确应该有类似功能的“对象”承担这样的逻辑。

    下面我们主要围绕操作系统的中断机制,Java的中断机制,如何设计一个异步线程间的中断系统这三部分简单探讨下。

    # 操作系统的中断机制

    与操作系统有关的中断,通常是指:程序在执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行, 转去执行相应的事件处理程序,待处理完成 后再返回原程序被中断处或调度其他程序执行的过程。关注公众号Java面试那些事儿,回复关键字面试,获取最新面试题

    按照中断事件本身的不同,可以划分为处理器之外的中断事件,异常,系统异常。

    处理器之外的中断事件

    指由外围设备发出的信号引起的,与当前运行指令无关的中断事件。示意图如下:a91e7f09ca07654f33a976de73889373.png

    我们分别以上述四个对象来看:

    • 中断源

    中断源:外部设备,如打印机,键盘,鼠标等。

    触发条件:如外围设备报告I/O状态的I/O中断;外围设备发出的对应信号中断,如时钟中断,键盘/鼠标对应信号的中断,关机/重启动中断等。

    触发方式:由外部设备向中断控制器发出中断请求IRQ。

    • 中断信号

    也就是说中断源通知给中断控制器的是什么。

    可以是通过一条信号线上产生特定的电平(利用高低电平表示是否中断两种状态),也可以在总线上发送特定消息或者消息序列,也可以是在中断寄存器中设置已发生的中断状态等。

    • 中断控制器

    CPU中的一个控制部件,包括 中断控制逻辑线路和中断寄存器。负责中断的发现和响应。

    也就是说负责检查中断寄存器中的中断信号,当发现中断时让CPU切换当前进程程序,去处理中断程序。响应示意图如下:

    e92683e707b5c5961b474fcb7f24bf00.png
    • 中断处理器

    指的是CPU接收到不同的中断信号该怎么处理。包括“中断处理过程”和“恢复正常操作”两部分。

    1.中断处理过程

    首先CPU需要将当前运行进程的上下文保存,从中断进程中分析PSW,确定对应的中断源和执行对应的中断处理程序。

    小贴士:PSW(Program Status Word): 是指在电脑中,一段包含被操作系统使用的程序状态信息的内存或硬件区域。一般用一个专门的寄存器来指示处理器状态。可以理解为我们上面提到的中断信号存储装置.

    2.恢复正常操作

    当中断程序执行完毕,接下来执行哪个进程由进程调度决定,由调度策略决定是否调度到中断执行前的进程。

    较为完整的中断响应流程图如下:0f26b26e376f4aef720e22ad0972ab8d.png

    异常 和 系统异常 这两类中断事件主要属于处理器执行特定的指令引起的中断事件。和上述硬件外围设备引起的中断事件的中断源不同,中断的发起,控制和处理主要是由操作系统的指令逻辑和线路来承担。是一种同步的处理操作,而外部中断是由外部设备发起,是一种异步的处理操作。下面我们简要介绍下。

    异常

    异常指当前运行指令引起的中断事件。包括错误情况引起的故障,如除零算数错误,缺页异常;也包括不可恢复的致命错误导致的终止,通常是一些硬件错误。

    • 异常的处理

    对于故障的处理,根据故障是否能够被恢复,故障处理程序要么重新执行引起故障的指令,要么终止。af7e5c4dff0b0045e2d7f284c6a11f54.png

    对于终止的处理,处理程序将控制返回给一个abort例程,该例程会终止这个应用程序。736e9d2579a05b0bbaaa0e2ea14df22a.png

    系统异常

    系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等。

    • 系统调用的处理

    这种有意的异常,称为陷阱处理。处理完成后陷阱程序会将控制返回给应用程序控制流的下一条指令。65010582ece4f8572aa0e864826f2bdb.png

    总结一下,操作系统的中断类别行为如下:b935bd10e9ab7dcfca6c9b6fc55991c6.png

    好了,大头总算完了

    # Java的中断机制

    理解了上面操作系统的中断之后,Java的中断机制就很easy了 :D

    Java中断指的是 A线程发送中断信号给B线程,B线程再根据自己当前执行程序中的中断处理逻辑决定如何响应。嗯,就这么简单~

    我们来稍微分析一下中断事件中的“四个对象”:

    • 中断源

    中断源:A线程

    中断触发条件:A线程说了算

    中断源触发方式:A线程中调用threadB#interrupt()方法.

    实现机制也不难,扯淡之前我们先思考两个问题:

    问:

    问题1: 线程之间如何通信,A线程的中断信号怎么才能传给线程B?

    问题2: 线程的状态有Running,Blocked,Waiting等,当线程B处在不同的状态下,如何响应中断信号?

    答:

    问题1:这种情况下线程之间通信用共享内存就可以了。只需要给每个线程都设置一个中断标示位, 这样A线程中调用threadB#interrupt()方法,实际操作是把B线程的中断标示位设置为true。信号就算传递过去了

    问题2:当B线程处于非阻塞状态时,B线程可以在自己需要处理中断逻辑的地方判断中断标示位是否为true,就可以响应处理中断。关注公众号Java面试那些事儿,回复关键字面试,获取最新面试题

    但是当B线程处于阻塞状态时,这特么怎么查自己的中断标示位啊?

    JVM帮帮忙,当B线程阻塞在Object#wait(),Thread#join(),Thread#sleep(),实现了InterruptibleChannel接口的IO操作 和Selector接口的select()这些操作时,JVM会让B线程马上抛出异常或被唤醒,从而让B线程可以选择是否响应中断。

    因为是Java实现的中断机制,中断标示位的设置也是JVM帮做的。

    • 中断信号

    信号:线程的中断标示位。

    存储方式:JVM说了算。

    • 中断控制器

    JVM控制了信号的存储和让线程B及时唤醒。线程B控制了自己的中断响应逻辑,何时响应,如何响应。

    • 中断处理器

    获取信号:B线程可通过调用threadB#isInterrupted()方法得知自己是否被中断,也就是通过自己主动拉取信号(poll方式)。

    如何处理信号:B线程说了算。

    处理完信号后做什么:B线程说了算。

    Java的线程中断机制设计的比较灵活,使用者可以决定中断处理的较多事情。

    总结下Java中和中断有关的方法:2f1f50a677f8f0870e0a12b709412da5.png

    在JDK中,线程池的ThreadPoolExecutor#shutdownNow()方法就是调用workers线程数组中每个worker线程的interrupt()方法来关闭线程池。

    这样暴力关闭线程会存在一个问题,线程池并不知道worker线程的中断执行情况,如果worker线程忽略了中断信号,那可能导致当前任务还在执行,发生意想不到的结果。

    # 设计一个异步线程间的中断系统

    我们再来看Java的中断机制,它其实只是提供了A线程给B线程发送中断信号。

    • A线程并不能知道B线程的中断处理结果。
    • 如果A线程拿不到B线程的thread对象时,也就没法发送中断信号。

    考虑这么一种场景:当我们执行一个大任务Task1时,它太大了。我们把它分为Task2和Task3,丢进线程池中处理。它们同样很大,我们把他们分别分为Task4,Task5和Task6,Task7,同样丢进线程池中处理。

    22cad37655309cdb0aedfa9a4b5efa40.png

    如果此时我们想取消task1的执行,如何保证图中所有的worker都成功取消对应task的执行?

    • 需求分析

    当我们取消task1时,想要做的是取消所有task程序的继续运行,并且能够获得所有task程序的取消结果。

    为什么要强调task程序呢?因为worker可能并不是只为一个task工作啊..比如task2的worker,它把task4和task5丢进线程池,就算完事了。如果我们把取消task1变为取消task1的worker线程,可能会导致worker线程当前运行的非task1程序的失败。

    我们不太容易知道所有task程序当前运行的线程,我们还需要知道所有task程序的运行结果。

    • 设计思路

    只用Java的中断机制是满足不了我们的需求的,但是我们可以借鉴它的思路:

    1.它用中断标示位记录线程是否应该中断

    2.当线程阻塞时可以抛出异常

    我们这里要终止的是所有task程序的执行,所以我们需要设计与task 强绑定的中断标示位,可以有未中断,中断中,中断成功,中断失败四种 状态。为了让所有的线程都可以访问到,定义成全局共享变量就可以。

    e48a9e19b03420379cd09695afcddba8.png

    中断源和中断处理器之间通过task的中断标示位来通信就可以。如果运行task程序的线程一直在阻塞,怎么唤醒它让它判断中断状态 呢?

    对于我们这个场景,我们很难知道当前运行task程序的阻塞线程是谁。。能做的只是多安插中断判断点,这样当阻塞线程醒来后,再次判断task 的中断标示位,就可以响应中断了。

    另:

    唤醒一个线程只有Java的中断机制可以做,但是如果当前worker不是你能管理的线程池,那么它的中断处理逻辑就控制不了。

    如果你能控制运行task的所有worker,而且worker在执行task时是同步获得结果的。那么可以结合与task强绑定的中断标示位和Java中断机制来做,这里前者的作用更多是充当获取到任务的中断结果的作用。

    # 后记

    • 小姐姐觉得像是“事件处理”这种场景在线程池,消息中间件,流式处理等很多地方有共通之处,比如说:如何保证事件的exactly once,推拉模型,调度等等。

    • 在写这篇文章时,特别是操作系统的中断机制,小姐姐也是现学现卖,并且参考了资料大部分内容。文章中有理解错误或者难懂的地方还请小伙伴帮我指出,一起交流进步。关注公众号Java面试那些事儿,回复关键字面试,获取最新面试题

    • 最后的技术部分讨论“如何设计一个异步线程间的中断系统”,这是小姐姐目前工作中遇到的一个问题。这个问题和任务调度组件的取消任务很相似,只是我们目前还没有用任务调度组件管理起所有的任务工作线程。小伙伴有更好方案的也请告知小姐姐。

     

    # 参考资料:

    [1].https://www.icourse163.org/course/NJU-1001571004

    [2].《深入理解计算机系统》

    [3].https://www.zhihu.com/question/47862508/answer/110694813

    [4].https://zhuanlan.zhihu.com/p/26524241

     往期推荐 

    ?

    • 真强啊!建议每一位Java程序员都读读Dubbo心跳设计的源码...
    • 收藏:大佬总结的异常、堆内存溢出、OOM的几种情况
    • 字节一面,被连问MySQL索引,脸都问绿了...

    2e282aeeca7ecd0c5b2e21ded0834146.png

    3dfe4316c6b56216934cb55cc26301a6.gif 

    点击

    展开全文
  • 当我们分析某种中断事件时,我们需要搞清楚这四个对象:中断中断源是谁中断源在什么条件下触发中断中断源如何触发中断信号信号具体指的是什么信号是否需要存储如何存储中断控制器中断信号的管理比如说中断源发送的...
    8c00759e1a46db6c45ea25dcd7de9f0a.png

    什么是中断


    中断其实是一种“中断”事件,中断具体代表什么意思需要考虑它所处的上下文环境参照对象是谁。考虑事件,我们可以简单把中断抽象为这样一种模型:0d8641d2b207e5b5c1a6f9fecd21e0d8.png

    当我们分析某种中断事件时,我们需要搞清楚这四个对象:

    中断源

    • 中断源是谁
    • 中断源在什么条件下触发中断
    • 中断源如何触发

    中断信号

    • 信号具体指的是什么
    • 信号是否需要存储
    • 如何存储

    中断控制器

    • 中断信号的管理

    比如说中断源发送的信号是否屏蔽,信号是否可被中断处理器重复处理,信号的处理是否有优先级...

    中断处理器

    • 如何获取到信号
    • 拿到信号做什么样的操作
    • 处理完信号后做什么样的操作

    在实际的中断事件中,并不一定刚好有上面提到的这四类对象,可能更复杂可能更简单化。但是当我们考虑中断事件时,需要明确应该有类似功能的“对象”承担这样的逻辑。

    下面我们主要围绕操作系统的中断机制Java的中断机制如何设计一个异步线程间的中断系统这三部分简单探讨下。

    操作系统的中断机制


    与操作系统有关的中断,通常是指:程序在执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行, 转去执行相应的事件处理程序,待处理完成 后再返回原程序被中断处或调度其他程序执行的过程。

    按照中断事件本身的不同,可以划分为处理器之外的中断事件异常,系统异常

    处理器之外的中断事件

    指由外围设备发出的信号引起的,与当前运行指令无关的中断事件。示意图如下:8c45c31ec9ab9312807caa9e4fa3456a.png

    我们分别以上述四个对象来看:

    • 中断源

    中断源:外部设备,如打印机,键盘,鼠标等。

    触发条件:如外围设备报告I/O状态的I/O中断;外围设备发出的对应信号中断,如时钟中断,键盘/鼠标对应信号的中断,关机/重启动中断等。

    触发方式:由外部设备向中断控制器发出中断请求IRQ。

    • 中断信号

    也就是说中断源通知给中断控制器的是什么。

    可以是通过一条信号线上产生特定的电平(利用高低电平表示是否中断两种状态),也可以在总线上发送特定消息或者消息序列,也可以是在中断寄存器中设置已发生的中断状态等。

    • 中断控制器

    CPU中的一个控制部件,包括 中断控制逻辑线路和中断寄存器。负责中断的发现和响应。

    也就是说负责检查中断寄存器中的中断信号,当发现中断时让CPU切换当前进程程序,去处理中断程序。响应示意图如下:

    ec133fbf4729b3e2d9b2acde5804f9ef.png
    • 中断处理器

    指的是CPU接收到不同的中断信号该怎么处理。包括“中断处理过程”和“恢复正常操作”两部分。

    1.中断处理过程

    首先CPU需要将当前运行进程的上下文保存,从中断进程中分析PSW,确定对应的中断源和执行对应的中断处理程序。

    小贴士:PSW(Program Status Word): 是指在电脑中,一段包含被操作系统使用的程序状态信息的内存或硬件区域。一般用一个专门的寄存器来指示处理器状态。可以理解为我们上面提到的中断信号存储装置.

    2.恢复正常操作

    当中断程序执行完毕,接下来执行哪个进程由进程调度决定,由调度策略决定是否调度到中断执行前的进程。

    较为完整的中断响应流程图如下:53890338de53cdef1781fd4520c20b71.png

    异常系统异常 这两类中断事件主要属于处理器执行特定的指令引起的中断事件。和上述硬件外围设备引起的中断事件的中断源不同,中断的发起,控制和处理主要是由操作系统的指令逻辑和线路来承担。是一种同步的处理操作,而外部中断是由外部设备发起,是一种异步的处理操作。下面我们简要介绍下。

    异常

    异常指当前运行指令引起的中断事件。包括错误情况引起的故障,如除零算数错误,缺页异常;也包括不可恢复的致命错误导致的终止,通常是一些硬件错误。

    • 异常的处理

    对于故障的处理,根据故障是否能够被恢复,故障处理程序要么重新执行引起故障的指令,要么终止。7fbfd6e9010b5f0b45723babfbf819a3.png

    对于终止的处理,处理程序将控制返回给一个abort例程,该例程会终止这个应用程序。d1cfc05d7a61540a306f80b2be7e3e87.png

    系统异常

    系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等。

    • 系统调用的处理

    这种有意的异常,称为陷阱处理。处理完成后陷阱程序会将控制返回给应用程序控制流的下一条指令。3030228039901e73d9ef0670e46cca53.png

    总结一下,操作系统的中断类别行为如下:4ed7ba7fb66fe1e466ebe04b07f07134.png

    好了,大头总算完了。因为小姐姐主要是Java码农,下面将主要介绍和Java相关的中断语义是什么。

    Java的中断机制


    理解了上面操作系统的中断之后,Java的中断机制就很easy了 :D

    Java中断指的是 A线程发送中断信号给B线程,B线程再根据自己当前执行程序中的中断处理逻辑决定如何响应。嗯,就这么简单~

    我们来稍微分析一下中断事件中的“四个对象”:

    • 中断源

    中断源:A线程

    中断触发条件:A线程说了算

    中断源触发方式:A线程中调用threadB#interrupt()方法.

    实现机制也不难,扯淡之前我们先思考两个问题:

    问:

    问题1: 线程之间如何通信,A线程的中断信号怎么才能传给线程B?

    问题2: 线程的状态有Running,Blocked,Waiting等,当线程B处在不同的状态下,如何响应中断信号?

    答:

    问题1:这种情况下线程之间通信用共享内存就可以了。只需要给每个线程都设置一个中断标示位, 这样A线程中调用threadB#interrupt()方法,实际操作是把B线程的中断标示位设置为true。信号就算传递过去了

    问题2:当B线程处于非阻塞状态时,B线程可以在自己需要处理中断逻辑的地方判断中断标示位是否为true,就可以响应处理中断。

    但是当B线程处于阻塞状态时,这特么怎么查自己的中断标示位啊?

    JVM帮帮忙,当B线程阻塞在Object#wait(),Thread#join(),Thread#sleep(),实现了InterruptibleChannel接口的IO操作 和Selector接口的select()这些操作时,JVM会让B线程马上抛出异常或被唤醒,从而让B线程可以选择是否响应中断。

    因为是Java实现的中断机制,中断标示位的设置也是JVM帮做的。

    • 中断信号

    信号:线程的中断标示位。

    存储方式:JVM说了算。

    • 中断控制器

    JVM控制了信号的存储和让线程B及时唤醒。线程B控制了自己的中断响应逻辑,何时响应,如何响应。

    • 中断处理器

    获取信号:B线程可通过调用threadB#isInterrupted()方法得知自己是否被中断,也就是通过自己主动拉取信号(poll方式)。

    如何处理信号:B线程说了算。

    处理完信号后做什么:B线程说了算。

    Java的线程中断机制设计的比较灵活,使用者可以决定中断处理的较多事情。

    总结下Java中和中断有关的方法:321cf10f3cf7ea001d688ebcae2c1c1f.png

    在JDK中,线程池的ThreadPoolExecutor#shutdownNow()方法就是调用workers线程数组中每个worker线程的interrupt()方法来关闭线程池。

    这样暴力关闭线程会存在一个问题,线程池并不知道worker线程的中断执行情况,如果worker线程忽略了中断信号,那可能导致当前任务还在执行,发生意想不到的结果。

    设计一个异步线程间的中断系统


    我们再来看Java的中断机制,它其实只是提供了A线程给B线程发送中断信号。

    • A线程并不能知道B线程的中断处理结果。
    • 如果A线程拿不到B线程的thread对象时,也就没法发送中断信号。

    考虑这么一种场景:当我们执行一个大任务Task1时,它太大了。我们把它分为Task2Task3,丢进线程池中处理。它们同样很大,我们把他们分别分为Task4Task5Task6Task7,同样丢进线程池中处理。

    df2868a9cbc559b28c5713fbe9483791.png

    如果此时我们想取消task1的执行,如何保证图中所有的worker都成功取消对应task的执行?

    • 需求分析

    当我们取消task1时,想要做的是取消所有task程序的继续运行,并且能够获得所有task程序的取消结果

    为什么要强调task程序呢?因为worker可能并不是只为一个task工作啊..比如task2的worker,它把task4和task5丢进线程池,就算完事了。如果我们把取消task1变为取消task1的worker线程,可能会导致worker线程当前运行的非task1程序的失败。

    我们不太容易知道所有task程序当前运行的线程,我们还需要知道所有task程序的运行结果。

    • 设计思路

    只用Java的中断机制是满足不了我们的需求的,但是我们可以借鉴它的思路:

    1.它用中断标示位记录线程是否应该中断

    2.当线程阻塞时可以抛出异常

    我们这里要终止的是所有task程序的执行,所以我们需要设计与task 强绑定的中断标示位,可以有未中断,中断中,中断成功中断失败四种 状态。为了让所有的线程都可以访问到,定义成全局共享变量就可以。

    6a76907171c859efb60860baeced9adb.png

    中断源和中断处理器之间通过task的中断标示位来通信就可以。如果运行task程序的线程一直在阻塞,怎么唤醒它让它判断中断状态 呢?

    对于我们这个场景,我们很难知道当前运行task程序的阻塞线程是谁。。能做的只是多安插中断判断点,这样当阻塞线程醒来后,再次判断task 的中断标示位,就可以响应中断了。

    另:

    唤醒一个线程只有Java的中断机制可以做,但是如果当前worker不是你能管理的线程池,那么它的中断处理逻辑就控制不了。

    如果你能控制运行task的所有worker,而且worker在执行task时是同步获得结果的。那么可以结合与task强绑定的中断标示位Java中断机制来做,这里前者的作用更多是充当获取到任务的中断结果的作用。

    后记


    • 小姐姐觉得像是“事件处理”这种场景在线程池,消息中间件,流式处理等很多地方有共通之处,比如说:如何保证事件的exactly once,推拉模型,调度等等。

    • 在写这篇文章时,特别是操作系统的中断机制,小姐姐也是现学现卖,并且参考了资料大部分内容。文章中有理解错误或者难懂的地方还请小伙伴帮我指出,一起交流进步。

    • 最后的技术部分讨论“如何设计一个异步线程间的中断系统”,这是小姐姐目前工作中遇到的一个问题。这个问题和任务调度组件的取消任务很相似,只是我们目前还没有用任务调度组件管理起所有的任务工作线程。小伙伴有更好方案的也请告知小姐姐。

    参考资料:

    [1].https://www.icourse163.org/course/NJU-1001571004

    [2].《深入理解计算机系统》

    [3].https://www.zhihu.com/question/47862508/answer/110694813

    [4].https://zhuanlan.zhihu.com/p/26524241

    Java面试题专栏

    【81期】面试官:说说HashMap 中的容量与扩容实现

    【82期】面试中被问到SQL优化,看这篇就对了!

    【83期】面试被问到了Redis和MongoDB的区别?看这里就对了

    【84期】面试中设计模式能问些什么?比如说一下三种单例模式实现

    【85期】谈谈Java面向对象设计的六大原则,中高级面试常问!

    【86期】五个刁钻的String面试问题及解答

    【87期】面试官问:Java序列化和反序列化为什么要实现Serializable接口

    【88期】面试官问:你能说说 Spring 中,接口的bean是如何注入的吗?

    【89期】面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?

    【90期】面试官:说一下使用 Redis 实现大规模的帖子浏览计数的思路

    aaba42ce9d8a1ddd08d686e2b07c4ba3.png

    欢迎长按下图关注公众号后端技术精选

    0d2427c22cc16beb1cba60ae9642c323.gif

    展开全文
  • 当我们分析某种中断事件时,我们需要搞清楚这四个对象:中断中断源是谁中断源在什么条件下触发中断中断源如何触发中断信号信号具体指的是什么信号是否需要存储如何存储中断控制器中断信号的管理比如说中断源发送的...

    什么是中断


    中断其实是一种“中断”事件,中断具体代表什么意思需要考虑它所处的上下文环境和参照对象是谁。考虑事件,我们可以简单把中断抽象为这样一种模型:

    50e397efe4c26a730f696ba8fa15e0be.png

    当我们分析某种中断事件时,我们需要搞清楚这四个对象:

    中断源

    • 中断源是谁
    • 中断源在什么条件下触发中断
    • 中断源如何触发

    中断信号

    • 信号具体指的是什么
    • 信号是否需要存储
    • 如何存储

    中断控制器

    • 中断信号的管理

    比如说中断源发送的信号是否屏蔽,信号是否可被中断处理器重复处理,信号的处理是否有优先级...

    中断处理器

    • 如何获取到信号
    • 拿到信号做什么样的操作
    • 处理完信号后做什么样的操作

    在实际的中断事件中,并不一定刚好有上面提到的这四类对象,可能更复杂可能更简单化。但是当我们考虑中断事件时,需要明确应该有类似功能的“对象”承担这样的逻辑。

    下面我们主要围绕操作系统的中断机制,Java的中断机制,如何设计一个异步线程间的中断系统这三部分简单探讨下。

    操作系统的中断机制


    与操作系统有关的中断,通常是指:程序在执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行, 转去执行相应的事件处理程序,待处理完成 后再返回原程序被中断处或调度其他程序执行的过程。

    按照中断事件本身的不同,可以划分为处理器之外的中断事件,异常,系统异常。

    处理器之外的中断事件

    指由外围设备发出的信号引起的,与当前运行指令无关的中断事件。示意图如下:

    3b79de16a1695857cce072c1f0f15874.png

    我们分别以上述四个对象来看:

    • 中断源

    中断源:外部设备,如打印机,键盘,鼠标等。

    触发条件:如外围设备报告I/O状态的I/O中断;外围设备发出的对应信号中断,如时钟中断,键盘/鼠标对应信号的中断,关机/重启动中断等。

    触发方式:由外部设备向中断控制器发出中断请求IRQ。

    • 中断信号

    也就是说中断源通知给中断控制器的是什么。

    可以是通过一条信号线上产生特定的电平(利用高低电平表示是否中断两种状态),也可以在总线上发送特定消息或者消息序列,也可以是在中断寄存器中设置已发生的中断状态等。

    • 中断控制器

    CPU中的一个控制部件,包括 中断控制逻辑线路和中断寄存器。负责中断的发现和响应。

    也就是说负责检查中断寄存器中的中断信号,当发现中断时让CPU切换当前进程程序,去处理中断程序。响应示意图如下:

    a061d9daad192cd7a0b57614348d9a73.png
    • 中断处理器

    指的是CPU接收到不同的中断信号该怎么处理。包括“中断处理过程”和“恢复正常操作”两部分。

    1.中断处理过程

    首先CPU需要将当前运行进程的上下文保存,从中断进程中分析PSW,确定对应的中断源和执行对应的中断处理程序。

    小贴士:PSW(Program Status Word): 是指在电脑中,一段包含被操作系统使用的程序状态信息的内存或硬件区域。一般用一个专门的寄存器来指示处理器状态。可以理解为我们上面提到的中断信号存储装置.

    2.恢复正常操作

    当中断程序执行完毕,接下来执行哪个进程由进程调度决定,由调度策略决定是否调度到中断执行前的进程。

    较为完整的中断响应流程图如下:

    cc33c5d980ea46f0611a93e3dc578df5.png

    异常系统异常 这两类中断事件主要属于处理器执行特定的指令引起的中断事件。和上述硬件外围设备引起的中断事件的中断源不同,中断的发起,控制和处理主要是由操作系统的指令逻辑和线路来承担。是一种同步的处理操作,而外部中断是由外部设备发起,是一种异步的处理操作。下面我们简要介绍下。

    异常

    异常指当前运行指令引起的中断事件。包括错误情况引起的故障,如除零算数错误,缺页异常;也包括不可恢复的致命错误导致的终止,通常是一些硬件错误。

    • 异常的处理

    对于故障的处理,根据故障是否能够被恢复,故障处理程序要么重新执行引起故障的指令,要么终止。

    df13ae689433a4251aea935ed204388b.png

    对于终止的处理,处理程序将控制返回给一个abort例程,该例程会终止这个应用程序。

    a23f2f09d1f0f1a70ca10f0578e946aa.png

    系统异常

    系统异常指执行陷入指令而触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等。

    • 系统调用的处理

    这种有意的异常,称为陷阱处理。处理完成后陷阱程序会将控制返回给应用程序控制流的下一条指令。

    984ef2aa090a25b92a12f93e9211364a.png

    总结一下,操作系统的中断类别行为如下:

    bfc72ee900f5e2010169bb13310b257f.png

    好了,大头总算完了。因为小姐姐主要是Java码农,下面将主要介绍和Java相关的中断语义是什么。

    Java的中断机制


    理解了上面操作系统的中断之后,Java的中断机制就很easy了 :D

    Java中断指的是 A线程发送中断信号给B线程,B线程再根据自己当前执行程序中的中断处理逻辑决定如何响应。嗯,就这么简单~

    我们来稍微分析一下中断事件中的“四个对象”:

    • 中断源

    中断源:A线程

    中断触发条件:A线程说了算

    中断源触发方式:A线程中调用threadB#interrupt()方法.

    实现机制也不难,扯淡之前我们先思考两个问题:

    问:

    问题1: 线程之间如何通信,A线程的中断信号怎么才能传给线程B?

    问题2: 线程的状态有Running,Blocked,Waiting等,当线程B处在不同的状态下,如何响应中断信号?

    答:

    问题1:这种情况下线程之间通信用共享内存就可以了。只需要给每个线程都设置一个中断标示位, 这样A线程中调用threadB#interrupt()方法,实际操作是把B线程的中断标示位设置为true。信号就算传递过去了

    问题2:当B线程处于非阻塞状态时,B线程可以在自己需要处理中断逻辑的地方判断中断标示位是否为true,就可以响应处理中断。

    但是当B线程处于阻塞状态时,这特么怎么查自己的中断标示位啊?

    JVM帮帮忙,当B线程阻塞在Object#wait(),Thread#join(),Thread#sleep(),实现了InterruptibleChannel接口的IO操作 和Selector接口的select()这些操作时,JVM会让B线程马上抛出异常或被唤醒,从而让B线程可以选择是否响应中断。

    因为是Java实现的中断机制,中断标示位的设置也是JVM帮做的。

    • 中断信号

    信号:线程的中断标示位。

    存储方式:JVM说了算。

    • 中断控制器

    JVM控制了信号的存储和让线程B及时唤醒。线程B控制了自己的中断响应逻辑,何时响应,如何响应。

    • 中断处理器

    获取信号:B线程可通过调用threadB#isInterrupted()方法得知自己是否被中断,也就是通过自己主动拉取信号(poll方式)。

    如何处理信号:B线程说了算。

    处理完信号后做什么:B线程说了算。

    Java的线程中断机制设计的比较灵活,使用者可以决定中断处理的较多事情。

    总结下Java中和中断有关的方法:

    0966f3a797f5328d882d8e816fdbc3a9.png

    在JDK中,线程池的ThreadPoolExecutor#shutdownNow()方法就是调用workers线程数组中每个worker线程的interrupt()方法来关闭线程池。

    这样暴力关闭线程会存在一个问题,线程池并不知道worker线程的中断执行情况,如果worker线程忽略了中断信号,那可能导致当前任务还在执行,发生意想不到的结果。

    设计一个异步线程间的中断系统


    我们再来看Java的中断机制,它其实只是提供了A线程给B线程发送中断信号。

    • A线程并不能知道B线程的中断处理结果。
    • 如果A线程拿不到B线程的thread对象时,也就没法发送中断信号。

    考虑这么一种场景:当我们执行一个大任务Task1时,它太大了。我们把它分为Task2和Task3,丢进线程池中处理。它们同样很大,我们把他们分别分为Task4,Task5和Task6,Task7,同样丢进线程池中处理。

    3a6a45340ffeda6e5ae637b44a16d7d0.png

    如果此时我们想取消task1的执行,如何保证图中所有的worker都成功取消对应task的执行?

    • 需求分析

    当我们取消task1时,想要做的是取消所有task程序的继续运行,并且能够获得所有task程序的取消结果。

    为什么要强调task程序呢?因为worker可能并不是只为一个task工作啊..比如task2的worker,它把task4和task5丢进线程池,就算完事了。如果我们把取消task1变为取消task1的worker线程,可能会导致worker线程当前运行的非task1程序的失败。

    我们不太容易知道所有task程序当前运行的线程,我们还需要知道所有task程序的运行结果。

    • 设计思路

    只用Java的中断机制是满足不了我们的需求的,但是我们可以借鉴它的思路:

    1.它用中断标示位记录线程是否应该中断

    2.当线程阻塞时可以抛出异常

    我们这里要终止的是所有task程序的执行,所以我们需要设计与task 强绑定的中断标示位,可以有未中断,中断中,中断成功,中断失败四种 状态。为了让所有的线程都可以访问到,定义成全局共享变量就可以。

    fae4272035bf98363b97c6840d46acde.png

    中断源和中断处理器之间通过task的中断标示位来通信就可以。如果运行task程序的线程一直在阻塞,怎么唤醒它让它判断中断状态 呢?

    对于我们这个场景,我们很难知道当前运行task程序的阻塞线程是谁。。能做的只是多安插中断判断点,这样当阻塞线程醒来后,再次判断task 的中断标示位,就可以响应中断了。

    另:

    唤醒一个线程只有Java的中断机制可以做,但是如果当前worker不是你能管理的线程池,那么它的中断处理逻辑就控制不了。

    如果你能控制运行task的所有worker,而且worker在执行task时是同步获得结果的。那么可以结合与task强绑定的中断标示位和Java中断机制来做,这里前者的作用更多是充当获取到任务的中断结果的作用。

    后记


    • 小姐姐觉得像是“事件处理”这种场景在线程池,消息中间件,流式处理等很多地方有共通之处,比如说:如何保证事件的exactly once,推拉模型,调度等等。
    • 在写这篇文章时,特别是操作系统的中断机制,小姐姐也是现学现卖,并且参考了资料大部分内容。文章中有理解错误或者难懂的地方还请小伙伴帮我指出,一起交流进步。
    • 最后的技术部分讨论“如何设计一个异步线程间的中断系统”,这是小姐姐目前工作中遇到的一个问题。这个问题和任务调度组件的取消任务很相似,只是我们目前还没有用任务调度组件管理起所有的任务工作线程。小伙伴有更好方案的也请告知小姐姐。
    展开全文
  • 关注、星标公众号,不错过精彩内容中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件... 1EXTI控制外部中断/事件控制(EXTI)管理了控制的 23 个中断/事件线。每个中断/事件线都对应有一个...
  • arduino 计时中断

    千次阅读 2019-11-03 12:43:01
    定时器0:计时1:定时器2:Timer3,Timer4,Timer5:计时寄存器时钟选择和定时器频率计时模式什么是中断?定时器中断计时溢出:输出比较匹配:定时器输入捕捉:PWM和计时 本教程说明了Arduino板的计时和...
  • 但是效率具体如何提高的,书中的说明我没有太看明白,于是我就把书中提到的函数的源代码找出来分析了一下,希望能够理解锁调度和关中断两者之间的区别。uC/OS完整源代码可以从官网和我的Github上下载。
  • 中断控制

    千次阅读 2016-11-20 16:54:50
    在ARM中CPU有七种工作模式:什么叫做工作模式? 每一种工作模式都有哪些东西? 每一种工作模式下面都有一些不同的寄存器、不同的权限、不同的触发条件;不同的寄存器,如图: 可以看出,不同工作模式使用的寄存器...
  • 中断管理控制NVIC与stm32中断使用

    千次阅读 2016-01-12 15:07:00
    属于Cortex内核的器件,非常强大与方便的嵌套向量中断控制,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK不是由NVIC来控制的。 NVIC 特性 嵌套向量中断控制 NVIC 包含以下特性: ● ...
  • 什么是中断控制呢?中断控制就是负责将众多外设中断转发给CPU的一个中间商,类似于二手车买卖市场(不赚差价)。通常在ARM cortex-M系列中,采用的NVIC,而在ARM cortex-A系列当中,一般都用的GIC。GIC...
  • GIC即通用中断控制( Generic Interrupt Controller),ARM 体系结构定义了通用中断控制(GIC),该控制包括一组用于管理单核或多核系统中的中断的硬件资源。 GIC 提供了内存映射寄存器,可用于管理中断源和行为...
  • 什么是中断”? CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断...
  • 这一篇主要说说中断控制,及GPIO中断触发与中断号的识别,为什么GPIO引脚的触发最后调用特定的中断例程,这中间怎么联系起来的。现在知道的request_irq只是在特定的中断号 链表中注册了一个中断例程,那这...
  • #include "Exti.h" #include "./led/bsp_led.h" static void NVIC_Configuaration2(void) { NVIC_InitTypeDef NVIC_InitStructure; ... //中断分组 ... NVIC_...这进入按键1中断之后再应该执行的函数
  • 文章目录1. 什么是中断1.1 中断的概念1.2 中断源1.2.1 中断源的种类2. 中断寄存器2.1 TCON寄存器2.2 SCON寄存器2.3 ...中断是指中央处理CPU正在处理某件事情的时候,外部发生了某一事件(如定时器计时已到),请求...
  • PLC中断功能有什么用?如何理解!plc这样理解中断功能,在理解中断时,首先要清楚plc的运算周期或者说扫描周期,有必要说下plc顺控循环执行的流程,这理解中断的前提,必须要掌握,分为三部分,输入处理、程序...
  • plc怎样理解中断功能:在理解plc中断时,你首先要清楚plc的运算周期或者说扫描周期。我们有必要说下plc顺控循环执行的流程,这理解中断的前提,必须要掌握。分为三部分:输入处理、程序处理、输出处理。1、输入...
  • GIC 的全称 generate interrupt controller,即 通用中断控制。它由 ARM公司 开发的一个 中断硬件IP,主要用于管理外设中断中断什么需要管理呢?要解决这个问题,我们需要知道 ARM核CPU 的一些小知识。在...
  • 1 垃圾回收在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集在堆进行回收前,第一件事就是要确定这些对象之中哪些还“存活”着,哪些已经“死亡”(即不可能再被任何途径使用的对象)。垃圾回收,其实就是将...
  • Python 解释包括两个主要的子系统:一个表达式解析,负责处理数字表达式;另一个解释,负责程序的实际执行,不是只能解析孤立的表达式。用上一节介绍的方法就...键盘中断(通常Ctrl+C)会引发KeyboardInt...
  • ​1、什么是NVIC? 来自《CM3技术参考手册》的官方资料回答: 即嵌套向量中断控制(Nested Vectored Interrupt Controller)。 说白了NVIC的功能就是中断优先级分组、中断优先级的配置、读中断请求标志、清除中断...
  • 文章目录arduino编码器的使用一、编码器是什么?二、使用步骤1.连接编码器和arduino开发板2.代码总结 一、编码器是什么? 编码器就是一种可以输出90度相位差A,B的两路信号,也就是图上的“CLK”和“DT”端口 二...
  • 可编程中断控制(PIC、APIC)

    千次阅读 2015-04-07 22:07:20
    可编程中断控制器(PIC...中断控制器是作为中断(IRQ)和CPU核之间的一个桥梁而存在的,每个CPU内部都有一个自己的中断控制器,中断线并不是直接与CPU核相连,而是与CPU内部或外部的中断控制器相连。而为什么叫做可编程中
  • 什么是中断一种让CPU知道某一种事件发生的方法。 怎么让CPU知道某种事件发生了呢? 1、查询,即轮询,定期查询结果; 2.中断中断时一种异常) 发生异常后,CPU会干什么事情呢? 1.cpu进入异常模式,包括...
  • 什么是进程的可中断等待状态?进程退出后为什么要等待调度删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) TASK_INTERRUPTIBLE(可中断等待状态) TASK_UNINTERRUPTIBLE(不可中断...
  • 现在,有了这16个基于ISR的新计时,最大间隔实际上无限的(仅受无符号长毫秒限制),而与软件计时相比,其精度几乎完美的。 最重要的功能它们基于ISR的计时。 因此,它们的执行不会受到行为不正常的...
  • (c51学习笔记)计时中断

    千次阅读 2019-01-08 20:06:30
    什么是中断 中断系统为使CPU具有对外界异步事件的处理能力而设置的。 单片机单线程的,通常情况下都在执行死循环,一旦遇到外部情况,就无法跳出当前的循环,这时候就需要用到中断。 程序在执行一项工作时...
  • 《朱老师物联网大讲堂》学习笔记 ... 关于异常,可以将其分为了两个阶段, 第一个阶段是异常向量表的跳转...第二个阶段的主要任务是什么? 在s5pv210中,有4个中断寄存器,每个32位,每位对应一个中断源, 它们的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,254
精华内容 501
关键字:

中断器是什么