计算机组成原理 第七章-I/O系统第一部分————I/O方式详解(计组完结)

这里是计算机组成原理的最后一部分了,本文将详细的探讨I/O方式即CPU是如何知道需要外部的I/O设备需要被调用的。本章的前半部分已经介绍过有三种方式,现在来一一探讨。

1.程序查询方式

前面已经说过程序查询方式的基本原理就是当CPU向I/O接口发出一个指令之后,就一直处于等待和询问之中,每一个节拍都查看一下I/O接口的状态寄存器,看是否已经完成。如果完成了,CPU就进行数据的交互(CPU向I/O传数据或者从I/O的数据寄存器取数据)。王道PPT上举了一个例子进行说明:
在这里插入图片描述
如图,目前我们需要使用打印机打印三个字符的数据。需要两条I/O指令,IN和OUT分别控制数据从I/O输入到CPU,从CPU传出到I/O。具体的操作如下:其实是先OUT后IN。
(1)首先从主存里面把要打印的数据从主存放到CPU的一个寄存器里面,假设第一个字符a取到了R0,I/O指令Out存在R1里面。
(2)CPU通过地址线选通Rn+1,然后通过控制线指明要进行写的操作,控制寄存器Rn+1做好写的准备,然后R1通过数据线把指令传到Rn+1里面。
(3)Rn+1把这个命令发给I/O控制逻辑单元,控制逻辑单元进行翻译然后向外设界面控制逻辑发出对应信号,外设界面控制逻辑单元通过控制线向外设发出控制线信号。
(4)然后外设开始启动,并且通过状态线发回一个Ready信号,外设逻辑单元把信号发给I/O控制逻辑单元,逻辑单元把信号发给Rn+1覆盖原本的指令。
(5)这个时候,CPU在不断的执行In指令,I/O一直持续不断的把自己状态寄存器Rn+1里面的值发给CPU。直到CPU收到了Ready的状态,CPU才会停止执行IN指令。
(6)紧接着,CPU继续执行OUT指令,用地址线选通I/O端口的数据寄存器Rn,然后一样的,控制线发出写的命令,数据线把R0里面的a取到Rn中。
(7)a这个字符从Rn传递到I/O的控制逻辑单元,然后一样的从外设界面(也就是接口)的数据线传递到外设。打印机就打一个a出来,打印完成之后把Ready状态传回I/O的状态寄存器。
(8)一样的,CPU不断地执行IN指令获取I/O接口的状态寄存器的值,直到获得打印机Ready的信号,它才会发出下一个字符,以此类推。。。
(9)打印完成之后,CPU向I/O接口的控制指令发出停机指令(需要驱动程序的协助),之后打印机停止工作,反馈一个STOP的状态,CPU受到STOP以后就不管了,否则还是会一直询问I/O接口的状态寄存器。

还需要最后要说明的是,并不是所有的I/O接口的样子都是上面的图中这样(因为前面说过,目前很多I/O接口有多组寄存器),但是基本组成是一致的,附上王道考研总结的流程图:
在这里插入图片描述
如上图中所说的,它有着会踏步的缺点,但是也有着设计起来简单的优点,所以早期的计算机才会使用,但是目前一些简单的儿童玩具,比如一个读故事机器人,它不需要和其他的设备交互,只需要和音响交互,所以用的也是这种简单的程序查询方式。这是一个王道PPT给出的例题:
在这里插入图片描述
首先还是分析题目:用的是程序查询方式的输入输出系统,且不需要考虑处理时间。CPU的时钟频率为50MHZ,那么一个时钟周期就是1/50M s,一个查询操作需要2/1M s,那么CPU每一秒内对鼠标的查询时间就是60/1Ms=0.006%(1M=1000000十的六次方)所以对鼠标的查询是可接受的。然后先计算一秒钟需要查询硬盘几次:32位的数据,其实是4B,那么用传输率 2 21 2^{21} 221来除以 2 2 2^2 22就是 2 19 2^{19} 219次,一次的时间也是2/1Ms,那么就是 2 20 2^{20} 220/1Ms,拿计算器算一次是105%,所以CPU用程序查询方式完成不了对硬盘的访问的。所以程序查询仅适用于慢速的I/O设备。

题目中说的方法是定时查询,也就是每隔一段时间查询一次。前面学习的是独占式查询。在数据不易丢失时常采用定时查询,如果容易丢失则采用独占式查询。

2.程序中断方式(非常重要)

这里又提到了中断,因为是和操作系统的交叉,所以几乎必考,这里的知识将侧重于硬件是如何实现中断的。

2.1 中断的基本原理

2.1.1 什么是中断

在操作系统里面和前面都描述过:正常情况下,指令的执行是在同一个进程里面执行的,也就是进程一直在占用CPU,但是实际电脑需要能并发的执行多个进程,所以需要中断系统。中断系统:在每一个指令周期的末尾都加上一个中断周期,来检测是否需要中断(前面就讲过了)。简单来说中断就是停止运行当前的进程,转而运行其他的进程的过程。但是在计组这里,我们因为学习的是I/O设备,所以只考虑I/O中断,比如键盘和鼠标等的中断信号的处理,不考虑进程并发是怎么实现的,那是操作系统的事情。

2.1.2 中断的流程

(1)中断请求:中断请求信号由键盘鼠标等外设,以及时钟信号,都可以发出中断信号。
(2)中断响应:CPU收到中断信号以后,首先需要判断是否响应该中断(是否处于关中断的状态),其次可能会收到多个中断信号,CPU在决定响应中断的同时,还需要决定响应哪一个中断(也叫中断判优)。
(3)处理中断:保存当前状态,然后执行中断服务程序(后面会说)。

2.1.3 开中断和关中断

在CPU里面有一个一位存储元IF,相当于一个开关,当IF=0的时候就实现了关中断,这个时候大部分的中断请求都不允许被执行,可以保证一些进程的连续执行,IF=1的时候是开中断,这个时候CPU才会响应中断请求。IF被开中断指令和关中断指令控制,而且这两个指令是原子的。这里的知识和操作系统是一致的,所以不细讲了。
这里额外说一下,关中断的时候,并不是所有的中断信号都不会请求,它可以响应非屏蔽中断,比如你按住关机键3s,然后就可以发出强制关机指令,这个时候即便处于关中断状态,CPU还是会立即响应关机的进程。CPU在关中断的时候,仅可以响应可屏蔽中断我们考试只会考可屏蔽中断

2.1.4 中断请求标记

因为同一时间有可能会有多个中断信号发送过来,所以CPU里面有一个中断请求标记寄存器来保存各个中断信号的来源。如图所示:
在这里插入图片描述
图中的INTR1等就是中断源,只有中断源有信号,CPU才会进入中断周期。

2.1.5 中断判优

中断判优就是判断当前执行哪个中断信号,方法有两种:
(1)硬件判优:如图是一个硬件排队器:
在这里插入图片描述
也就是对不同的中断进行与非操作,让它们根据优先级依次响应。可以自己假设输入全为1,看看结果(只有第一个会输出1)。
(2)软件判优:其实可以把中断请求标记寄存器里面设计成按照优先级排序的,然后用软件遍历整个寄存器,越前面的越优先执行。
因为软件实现要比硬件慢,并且硬件也不是那么复杂,所以目前都是硬件判优。

2.1.6 中断的优先级

如下:
(1)硬件故障享有最高的优先级(坏都坏了还谈什么);
(2)非屏蔽中断要比屏蔽中断高(前面说过);
(3)DMA中断优先于I/O设备的中断(因为DAM解决了可以很长时间不用管);
(4)高速设备优于低速设备(这是因为先处理高速的设备更划算,慢速设备的损失不大);
(5)输入设备优于输出设备(因为输入是用户干的,用户当然需要有优先权,同时输入快了,后面的数据会覆盖先前数据,所以需要及时取走);
(6)实时设备优于普通设备(比如打游戏肯定先处理显示屏,在处理后台的各种程序,否则打游戏就会卡)。

2.1.7 中断隐指令(会考第三步中的硬件向量法)

中断隐指令不是一个指令,而是指CPU在准备执行中断时,把当前的PC值保存,然后把PC指向中断服务程序进程的第一条指令的操作。它可以细化为:
(1)关中断,因为保存当前PC的过程不能被打断。
(2)保存当前的PC值到内核堆栈中的栈顶,结构类似于函数调用栈,它也是存在主存里面的。
(3)把PC的值改成中断服务程序的第一个地址(什么是中断服务程序看下面)。这个过程可以用硬件向量法实现:
【1】给每一个中断请求信号一个编号,在主存里面给每一个中断请求都设置好一个JMP指令,JMP后面的地址就是需要跳转到的中断服务程序的首地址,这就叫中断向量,对应的位置称之为中断入口地址;
【2】之前的中断排队器后面加一个中断向量形成部件,因为它可以形成对应的中断向量的地址,称为向量地址,也叫中断类信号,也就是在确定是哪个中断的同时,就已经确定它的中断程序地址了。如图:
在这里插入图片描述
向量地址输出的是12H,找到了200的位置,开始执行。因为入口地址是可能随着当前运行的进程的改变而改变的,所以中断向量也在改变,但是中断向量的地址不会变,所以硬件实现中断时,对于同一类中断,指向的中断地址是相同的,这也是它硬件实现的基础,如果硬件指向的是入口地址,那么将会限制入口地址程序的变动(因为一号进程如果需要更多的内存会把二号入口往下挤,但是硬件修改起来不容易)。还有软件的实现方法,就是用类似于函数调用的的形式实现(把进程看作函数),这个不在计组考纲中,就不细讲了。
(4)执行中断服务程序。
(5)开中断。
这种在执行中断服务程序的时候,不响应其他中断的方式称之为单重中断。但是目前多数系统是多重中断,具体实现在下面会说。

2.1.8 中断服务程序

中断服务程序的任务就是完成中断:
(1)保护现场:让当前进程的寄存器的值等保存到主存里面去。
(2)中断服务:会根据当前的进程和要求进行中断的进程执行对应的操作,比如键盘输入要保存等。
(3)恢复中断前的状态。
和函数调用非常相似,建于回去复习一下函数调用的实现,几乎是一样的,把进程看作函数就行。

2.1.9 总结一下怎么实现中断

在这里插入图片描述

2.2 多重中断

多重中断也叫中断嵌套,其思想就是在中断服务程序的运行中允许继续进行中断,运行新的中断服务程序。它和单重中断最大的区别在于,它在保护完现场和屏蔽字之后,会运行开中断指令。那什么是屏蔽字呢?

2.2.1 屏蔽字

屏蔽字也叫中断屏蔽字,它的作用是屏蔽某些中断。它在多重中断中,可以保证先把优先的任务完成,也就是说不是在多重中断中,任何的中断请求都会被受理的,只有那些不被中断屏蔽字屏蔽的中断请求才会被受理。如图是增加了中断屏蔽字功能的线路:
在这里插入图片描述
MASK就是中断屏蔽字,当这里是1也就是被激活的时候,因为上面有一个横线,所以实际上就设置为了0,那么不管INTR的值是1还是0,都会在与操作之后变为0(可以自己试一下)。就实现了屏蔽这里输入的效果。最后提一句,为了防止各个操作自己中断自己(比如上一个键盘操作还没有保存就来新的键盘操作),一般首先会把当前中断服务所对应的操作的中断屏蔽字激活。来个例题:
在这里插入图片描述
第一问很简单,按照新的顺序,比如A只能被D中断,那么除了D全设置为1即可。以此类推。我们按照它本身以及以后的全为1,优先级高的为1即可。不用纠结太多。
(2)看图即可,首先是B发出,B发出以后因为优先级小于D,所以B在运行5us后被D中断,直到运行到30us的时候,D运行完成,B继续运行,运行到35us时,又被A中断,A运行到55us时运行完成,60us时B又被C中断,之后C运行到80us完成,最后到85us时,B终于运行完成。如图:
在这里插入图片描述

2.3 扩展—CPU的中断原理(不考,了解即可)

在这里插入图片描述
上图是8086CPU的引脚图。IF是里面的一个小开关,用来保存是否开关中断,这个部分是和INTR连接的,INTR高电平就有中断,低电平无中断,但是关中断时会把INTR隔开,这个时候只有NIMI能响应。当中断生效的时候,INTA就被激活。和8086配套的中断控制器如下:
在这里插入图片描述
中断控制器后面的每一根线都和一个外部终端上设备连接。图中的优先权电路就是中断判优电路,前面说过。这里额外说一句,中断信号是通过数据总线向CPU传递中断数据的。

2.4 I/O 控制–程序中断

和前面说的一致,当I/O设备工作完成时,会发出中断请求信号,然后CPU才会对中断信号进行处理。用下图即可说明:
在这里插入图片描述
来个例题:

这里传输的总周期加不加5都可以。CPU用于该任务指的其实是中断的时间,考过的不会再考也不用太担心。至于中断操作之前已经说过了。

3.DMA方式

之前已经说过,DMA就是一个特殊的接口,可以同时处理一大批数据的交互。这里我们完善一下:
(1)DMA设备总是用于控制辅存比如磁盘和主存的数据交互,它控制的设备能够按块传输数据,块的意思就是一次读入多位数据。
(2)CPU要向DMA指明要从主存输入还是输出数据,数据的主存地址,以及要输入输出多少。
(3)DMA里面有一个计数器,每完成一次操作,计数器就会自动减一,同时把主存地址减一,当计数器减到0以后向CPU发出中断。
传输完一个字需要的时间成为一个DMA周期

3.1 DMA流程

(1)接受外部的DMA请求,并且向CPU发出总线请求。
(2)CPU把总线控制权交给DMA,DMA成为主设备,进入DMA周期。
(3)确定主存的地址单元以及要传输几次。
(4)代替CPU向外设和主存发送读写数据,发出控制信号,并且能自动的改变主存的位置和计数器的数据,如果计数器不为0,则回到(3)。
(5)向CPU发出中断信号,报告完成。

3.2 DMA控制器的组成

在这里插入图片描述
上图的DMAC就是DMA控制器。其中的:
(1)控制/状态逻辑电路完成上面说的各种操作。
(2)当设备完成一次数据传输之后(可以是把数据放入数据缓冲寄存器也可以是把数据从数据缓冲寄存器取走),DMA请求触发器为1,数据会从数据缓冲寄存器法进入主存,或者从主存放入数据缓冲寄存器。
(3)主存地址计数器,简称AR,可以作为一个缓存存放当前的主存地址,还可以自动地改变其中的数据。
(4)传送长度计数器简称WC,就是用于记录需要传几次的,也是能自动改变数据(上面的+1就是这个意思)。要注意的是,长度计数器的长度是有限的,如果一直加1,也会溢出。
(5)中断机构会在计数器完成操作时被激活,向CPU发出中断请求信号,如果长度计数器一直加1到溢出,其实也是会变0,所以对于长度计数器而言,加1还是减1是一模一样的,一般都是加1,因为这样可以最大限度的利用DMA控制器,如果是减一的话,还必须提前直到DMA里面长度计数器的大小,不然会出现溢出(也不是不能知道,只是对于大量数据的时候加1才划算,最后几个数据用减一微调)。还要注意,DAM请求触发器是控制主存和设备的,中断请求是联系CPU的
一个完整的MDA流程如下(选择题常考):
在这里插入图片描述

3.3 DMA的特点

在这里插入图片描述
如图所示,上面展示的是前面说过的三总线模式,DMA可以直接控制主存,就不需要再向CPU申请一次了,但是又会出现CPU和DMA同时访问主存的情况,对这种情况有三种解决办法(选择题常考):
(1)在DMA传输一块数据时,停止CPU对主存的访问,但是这样效率不高。
(2)DMA和CPU交替访存,也就是并发执行,效率较高,但是控制逻辑复杂,并且这种方式不一定能很好的利用主存的性能,因为CPU是高速设备,每一秒都会访问内存,但是DMA不一定每一秒都需要访存(比如等待外设放数据的时候)。

(3)周期挪用(周期窃取):当主存正在访存的时候,DMA需要等待主存访存完成(因为主存挺快的)。当主存和DMA同时访存的时候,优先让DMA,因为DMA的数据缓冲寄存器存不了多少数据,外部可能正在源源不断输入。这是目前常用的方案
目前的计算机都是四总线结构,但是DMA和CPU还有主存之间其实是有专用数据通路来联系的,具体内容可以百度一下,不是重点。

3.4 DMA和中断的对比(选择常考)

在这里插入图片描述

结束语

到此计算机组成原理就结束了,剩下的只需要不断的去做试卷即可。如果你要深入的学习计算机组成原理,不是为了考研,那么学到这里其实根本没有结束,因为很多内容不在考试大纲里面,所以王道考研就没有讲,需要去看看黑皮书,买个英文版的二手书也只需要15,不贵:
在这里插入图片描述
本专栏所有的内容均是根据王道考研计算机组成原理的公开课编写的,不清楚的地方可以在对应课程里面学习。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值