I/O中断原理



I/O中断原理

前言

Windows内核原理-同步IO与异步IO《高性能网络通信原理》两篇文章中,都出现了中断这两个字。本篇文章会对中断操做的原理进行说明。算法

什么是中断

中断指当出现须要时,CPU暂时中止当前程序的执行转而执行处理新状况的程序和执行过程。即在程序运行过程当中,系统出现了一个必须由CPU当即处理的状况,此时,CPU暂时停止程序的执行转而处理这个新的状况的过程就叫作中断。缓存

咱们知道CPU是按指令顺序进行执行的,操做系统每过大约15ms会发生一次线程调度(Windows下),根据线程优先级先调度优先级高的线程。可是实际状况并无那么简单,若咱们接收到一个网络请求,若是要等当前线程执行完或15ms线程调度以后才去处理网络请求,网卡缓冲区颇有可能会被占满,此时就发生了丢包。微信

中断类型

中断分为硬件中断和软件中断。网络

硬件中断

硬件中断即为硬件发出的中断信号,如I/O中断和硬件失效中断。异步

  • I/O中断:由I/O控制器产生,用于发送信号通知操做完成等信号。
  • 硬件失效中断:如掉电或存储器奇偶错之类的故障。

软件中断

软件中断即为非硬件发出的中断信号,如程序中断和时钟中断。async

  • 程序中断:一些指令产生的异常(如算数移除、除数为0等)。
  • 时钟中断:由处理器内部的计时器产生,容许操做系统以必定规程执行函数。函数

    咱们提到了操做系统每过大约15ms会进行一次线程调度,就是利用时钟中断来实现的。性能

I/O中断流程

本篇文章仍是主要解释前几篇文章提到的I/O中断进行解释说明,所以仅以I/O中断举例,可是中断的原理和流程都是类似的。操作系统

I/O中断经过中断处理器执行中断操做。当外部设备的I/O模块准备好时,它会发送给CPU一个中断信号,CPU则会“当即”作出响应,暂停当前程序的处理去服务该I/O设备的程序。

也可能不是当即,好比同时存在多个中断,则根据实际的中断算法决定,是按中断前后顺序执行中断操做,仍是按中断优先级执行。
I/O中断时硬件中断,须要硬件支持来接收中断信号。

无中断

为了更好的说明中断带来的性能提高,咱们先描述一下没有中断时程序如何处理I/O操做。

20191214121307.png

  • 当咱们程序须要从硬盘读取一个文件时,会先检查内核缓存中是否有数据,若没有数据,则执行实际I/O操做。在I/O操做执行时,咱们的用户线程将阻塞等待数据从硬盘写到内存中。对于用户来讲线程是被阻塞的。
  • 在实际的I/O操做过程当中,若没有中断操做,CPU会不断轮询检查I/O操做是否完成,若I/O操做没有完成则继续调度其余线程,过一下子再来检查。若操做完成,CPU将线程加入到线程就绪队列中并恢复线程上下文信息。
  • 线程处于就绪队列,能够被操做系统调度从而继续执行读操做,此时会将数据从操做系统内核缓存读取到用户缓存中。

有中断

20191214121702.png

  • 当咱们程序须要从硬盘读取一个文件时,会先检查内核缓存中是否有数据,若没有数据,则执行实际I/O操做。在I/O操做执行时,咱们的用户线程将阻塞等待数据从硬盘写到内存中。对于用户来讲线程是被阻塞的。
  • 在实际的I/O操做过程当中,CPU向I/O模块(DMA控制器)发送读指令,而后就去调度其余线程。
  • 当I/O模块(DMA控制器)I/O执行完成后,会产生中断信号在通知CPU,CPU将线程加入到线程就绪队列中并恢复线程上下文信息。
  • 线程处于就绪队列,能够被操做系统调度从而继续执行读操做,此时会将数据从操做系统内核缓存读取到用户缓存中。

由此可知,有中断仍是没有中断对于用户来讲线程都是阻塞的,对于操做系统内核来讲经过中断方式主动通知CPU的方式减小了线程轮询判断,提升了线程执行效率。
固然,为了进一步提升线程利用率,此时咱们能够经过异步操做API执行I/O操做。
好比.Net4.5的asyncawait关键字,当调用异步操做后,API内部保存了相关状态机信息(回调信息),线程继续执行其余操做,当操做系统内核读取数据完成时,线程调用回调方法恢复到await的后续操做。整个过程当中线程不会由于阻塞带来致使性能损失。

中断处理

当I/O设备完成一次I/O操做时,发生如下事件:

  • 开始I/O操做前,处理器将当前处理的相关信息如指令地址、必要的状态信息等保存到栈中,使得中断后能够恢复执行。
  • I/O操做完成后,设备给处理器发送一个中断信号。
  • 处理器响应中断信号。
  • 处理器对中断信号进行判断,若存在未响应的中断,则给产生中断信号的设备发送确认信号,确认信号使得设备取消它的中断信号。
  • 处理器将控制前转移给中断程序中,中断程序从栈中获取以前保存的信息,使得能继续执行I/O完成时的后续操做。
  • 处理器将中断程序入口地址载入到程序计数器中,使得处理器能继续执行下一个指令周期。

相关文献

  1. 《操做系统-精髓与设计原理》
  2. 时钟中断是rt-thread的线程调度器的驱动力

20191127212134.png
微信扫一扫二维码关注订阅号杰哥技术分享
出处:http://www.javashuo.com/article/p-mtesadfz-bx.html 做者:杰哥很忙 本文使用「CC BY 4.0」创做共享协议。欢迎转载,请在明显位置给出出处及连接。

相关文章
相关标签/搜索