CPU轮询和中断机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZCMUCZX/article/details/80696278

主机和控制器之间交互的完成协议可能会很复杂,我们可以用两个位来协调控制器和主机之间的生产者和消费者之间的关系,控制器工作忙的时候就把状态寄存器的忙位设置为1,而如果控制器可以接收下一条指令的时候就清除忙位。

如果是主机就是通过命令寄存器中命令就绪位来表示其意愿,当主机有命令需要控制器执行的时候就设置命令就绪位

当主机需要通过端口来写输出数据的时候,主机和控制器之间握手协调如下所示

  • 1、主机不断地读取忙位,直到该位被清除
  • 2、主机设置命令寄存器当中的写位并且向数据输出寄存器写入一个字节
  • 3、主机设置命令就绪位
  • 4、当控制器注意到命令就绪位已经被设置,就设置忙位
  • 5、控制器读取命令寄存器,并看到写命令,就从数据输出寄存器中读取一个字节,并且向设备执行I/O操作
  • 6、控制器清除命令就绪位,清除状态寄存器的故障位表示设备I/O成功,清除忙位表示成功

输出的每一个字节,都要执行上面的循环

但是这样是有问题的,因为这样的话相当于CPU是处于一种忙等待的情况,就是说CPU利用率不高,一直在不断地读取状态寄存器直到忙位被清除

这个时候,如果对于数据是来自串行端口或者是键盘的数据流的话,需要等待很久采取读取数据的话,那么串行端口或键盘控制器上的小缓冲器可能会溢出,数据会丢失

所以为了提高CPU的使用效率,这个时候出现了一个机制就是中断,中断能使外设通知CPU

下面就简单的介绍下CPU的中断机制

CPU硬件有一条中断请求线,CPU在执行每条指令之后都会去检测IRL,当CPU检测到已经有控制器通过中断请求线发送了信号之后,CPU就会保存当前状态并且跳转到内存固定位置的中断处理程序

中断处理程序会判断中断的原因,进行必要的处理,重新恢复状态,最后会执行中断返回指令可以使CPU返回中断以前的执行状态

总的来说就是设备控制器通过中断请求线发送信号引起中断,然后CPU捕获中断并分发到中断处理程序当中,中断处理程序通过处理设备请求来清除中断

这样的中断机制可以使CPU响应异步事件

在现代的计算机硬件来说,CPU和中断控制器可以提供以下几个特性

  • 1、在进行关键处理的时候,能够延迟中断处理
  • 2、更为有效地将中断分发到合适的中断处理程序,而不是检查所有设备以决定哪个设备引起中断
  • 3、需要多级中断,这样的操作系统能够区分高优先级和低优先级的中断,能够根据紧迫性的程序来响应

下面就是关于采用中断驱动的I/O循环

这里写图片描述

绝大多数CPU都有两个中断请求线,一个是非屏蔽中断,还有一个是可屏蔽的中断,这样的话CPU在执行关键的不可中断的指令序列前加以屏蔽

很多操作系统都是使用中断机制进行虚拟内存分页,页错误引起中断异常,这个中断会挂起当前进程并跳转到内核的页错误处理程序。这个处理程序保存进程状态,将所中断的进程加到等待队列当中,进行页面缓存管理,安排一个I/O操作来获取所需的页面,安排另一个进程恢复执行,并从中断返回

通常来说我们的程序在使用库里面的函数去执行系统调用的时候,库里面的函数就会检测应用程序所给的参数,然后去建立一个数据结构将参数传递给内核,并且去执行软终端或者陷阱指令的特殊指令

当系统调用执行陷阱指令的时候,中断硬件会保存用户代码的状态,切换到内核模式,分派到实现所请求服务的内核程序。陷阱所赋予的中断优先级要比设备中断优先级要低,因为应用程序执行系统调用和在FIFO队列溢出并失去数据之前的处理设备控制器相比来说肯定是后者更加紧迫

中断在现代操作系统中用来处理异步事件和设置陷阱进入内核模式的管理程序

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页