目录
一.I/O系统的基本概念
(1)I/O硬件
(2)I/O控制方式
1.程序查询方式
2.程序中断方式
3.DMA(Direct Memory Access)控制方式
4.通道控制方式
(3)I/O软件
1.I/O指令
2.通道程序
二.外部设备
(1)输入设备
(2)输出设备
三.I/O接口
1.I/O接口的作用
2.I/O接口
3.I/O接口的工作原理
4.I/O端口
•统一编址
•独立编址
5.I/O接口的类型
四.I/O控制方式
1.程序查询方式
例题:
2.程序中断方式
(1)中断的基本概念
(2)中断请求标记
(3)中断判优
(4)中断处理过程
•软件查询法
•硬件向量法
(5)中断服务程序
(6)多重中断
例题:
(7)程序中断方式的工作过程
例题:
3.DMA方式
(1)DMA方式工作流程
(2)DMA控制器的结构
(3)DMA传送过程
(4)DMA传送方式
1.停止CPU访问主存
2.DMA与CPU交替访存
3.周期挪用(周期窃取)
一.I/O系统的基本概念
I/O系统由I/O软件与I/O硬件两部分构成。
(1)I/O硬件
I/O硬件包括I/O设备,I/O接口、I/O总线等。
I/O设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备。
常见的输入输出设备(也称为外部设备)
输入设备:鼠标,键盘
输出设备:显示器,打印机
即可输入,又可输出的设备:硬盘,光盘
主机如何与I/O设备进行交互?
I/O接口:又称I/O控制器(I/O Controller)、设备控制器,负责协调主机与外部设备之间的数据传输。
由于I/O设备种类很多,所以I/O接口也多种多样,会制定相应的标准,如:用于控制USB设备的IO接口、用于控制SATA3.0硬盘的IO接口等。(I/O控制器就是一块芯片,常被集成在主板上)
所以若CPU的厂商想要通过I/O控制器控制某一外部设备,只需要遵守I/O控制器的标准,给I/O控制器发出响应命令即可。
(2)I/O控制方式
主机如何通过I/O接口控制I/O设备?
如下图所示,当执行到scanf("%c",&i);时,需要等待键盘I/O的完成:
CPU如何检查键盘是否有数据输入?
如上图所示,I/O接口由数据寄存器,控制寄存器,状态寄存器组成:
数据寄存器:用来存放输出到外设的数据或外设输入主机的数据。
控制寄存器:用于反映外设需要做什么工作。
状态寄存器:反映了当前外设的状态。
CPU通过控制总线,向I/O接口发送读命令,再通过地址总线指明CPU要读的是什么设备,同时地址总线也指明了要从这个设备读入的数据放在哪一个数据寄存器中。
1.程序查询方式
CPU不断轮询检查I/O控制器中的“状态寄存器”,检测到状态为"已完成"之后,再通过数据总线从数据寄存器取出输入数据。
采用程序查询方式,当遇到scanf语句,若键盘不完成输入,CPU就会不断轮询检查I/O控制器中的“状态寄存器”,不会进行其他工作,这样CPU的利用率是极低的。
2.程序中断方式
等待键盘I/O时CPU可以先去执行其他程序,键盘I/O完成后I/O控制器向CPU发出中断请求,CPU响应中断请求,并取走输入数据。CPU在每一条指令执行周期的末尾,都会先检查有没有中断请求,若收到中断请求,就会转而处理中断服务程序。
键盘输入这一中断请求对应的中断服务程序是将I/O接口中数据寄存器的内容转存到CPU内部。
以上两种工作方式的数据流:
数据流:键盘--->接口的数据寄存器--->数据总线--->CPU某寄存器--->主存(变量i的对应位置)
键盘通过外部USB连接线,将数据输入到I/O接口的数据寄存器中,接着数据寄存器的内容会通过数据总线传输给CPU的某个寄存器中。
对于scanf("%c",&i),需要将键盘输入的值,赋给i变量,而变量都是存放在主存中的,所以CPU需要将取得的数据写入主存中,即变量i对应的位置。
对于这两种方式,键盘每输入一个字,就需要CPU介入一次,将I/O设备输入的数据放到主存中。
对于快速I/O设备,如“磁盘”,每准备好一个字就给CPU发送一次中断请求(程序中断方式),那么CPU需要花大量的时间来处理中断服务程序,CPU利用率严重下降。
3.DMA(Direct Memory Access)控制方式
下图是之前讲到的三总线结构,CPU通过主存总线与主存进行数据传送,通过I/O总线与低速设备的I/O接口进行连接,通过DMA总线,与高速外设的DMA接口进行连接。其中的DMA接口就是DMA控制器,是一种特殊的I/O控制器。
DMA控制方式:主存与高速I/O设备之间有一条直接数据通路(DMA总线)。CPU向DMA接口发出“读/写”命令,并指明磁盘地址(CPU此次要读的数据在磁盘中的什么位置)、主存地址(读入主存后应该放在主存的什么位置)、读写数据量等参数。
DMA控制器自动控制磁盘与主存的数据读写,每完成一整块数据读写(如1KB为一整块),才向CPU发出一次中断请求。
DMA方式工作过程如下:
若CPU想读某外设数据,CPU向DMA接口发出“读”命令,并指明主存地址、磁盘地址、读写数据量等参数。发出这一I/O指令后,CPU就可以进行其他工作。
I/O设备准备的数据会先存到DMA控制器中,每准备好一个字的数据,DMA控制器就会发出DMA请求。接下来DMA控制器就会占用一个存取周期,往主存的对应位置写入一个字的数据。
若在这个存取周期内,CPU也想访问主存,只能等DMA控制器写完数据后,才能访问主存。而DMA控制器占用的一个存取周期的时间,一定比CPU处理中断服务程序的时间更短。
对于程序中断方式,每处理一个字,CPU都需要运行一次中断服务程序。对于DMA方式,每处理一个字,只需要占用主存一个存取周期的时间,并且每完成一整块数据读写(如1KB为一整块),才向CPU发出一次中断请求。
4.通道控制方式
若I/O设备特别多,即使使用DMA方式,CPU也需要花费很多时间处理中断请求。所以为了让I/O设备脱离繁杂的I/O设备管理工作,就出现了通道控制方式。
通道:通道是具有特殊功能的处理器,能对I/O设备进行统一管理。可以识别并执行一系列通道指令,通道指令种类、功能通常比较单一。引入通道后,CPU与各种I/O接口间不会直接交互,I/O接口的管理工作都是由通道通过控制总线进行的。
工作流程如下:
① 若CPU此时想要操作某个I/O设备,那么CPU会向通道发出I/O指令。指明通道程序在内存中的位置(通道程序:通道管理I/O设备时应该执行的指令),并指明要操作的是哪个I/O设备。CPU就可以去做其他事情。
② 通道根据CPU的指示,到内存中取通道程序,并执行内存中的通道程序,控制I/O设备完成一系列任务。
③ 通道执行完规定的任务后,向CPU发出中断请求,之后CPU对中断进行处理。
相比于DMA控制方式,通道控制方式进一步减少了CPU处理中断请求的次数。
(3)I/O软件
包括驱动程序、用户程序、管理程序、升级补丁等。 通常采用I/O指令(CPU指令的一部分)和通道指令(通道能识别的指令)实现主机和I/O设备的信息交换。
1.I/O指令
I/O指令格式如下所示:
操作码:识别这是不是一条I/O指令,是一条什么I/O指令;
命令码:用于指明对I/O设备的具体操作;
设备码:指明对哪个设备进行操作。
为了让I/O指令能够正确指示相应设备进行相应操作,各产商在生产设备时,一般都会提供配套的驱动程序。
注:I/O指令与普通指令(操作码+地址码)格式略有不同。操作码指明了CPU要对I/Ó接口做什么. 命令码指明了接口对设备做什么。
2.通道程序
通道程序会提前编制好放在主存中,所以主存中不仅会保存CPU要执行的程序,也要保存通道程序。在含有通道的计算机中,CPU执行I/O指令对通道发出命令,由通道执行一系列通道指令,代替CPU对I/O设备进行管理。
上面对I/O系统结构进行了整体概述,接下来更加细致地探讨其中的某些部分:
二.外部设备
注:这一节主要关注
1.显存(VRAM)的容量,带宽的相关计算。
2.阴极射线管(CRT)显示器中的字符显示器,显示字符的原理。
(1)输入设备
键盘
键盘是最常用的输入设备,通过它可发出命令或输入数据。每个键相当于一个开关,当按下键时,电信号连通;当松开键时,弹簧把键弹起,电信号断开。
键盘输入信息可分为3个步骤:
①查出按下的是哪个键;
②将该键翻译成能被主机接收的编码,如ASClI码;
③将编码传送给主机。
鼠标
鼠标是常用的定位输入设备,它把用户的操作与计算机屏幕上的位置信息相联系。常用的鼠标有机械式和光电式两种。
工作原理:
当鼠标在平面上移动时,其底部传感器把运动的方向和距离检测出来,从而控制光标做相应运动。
(2)输出设备
显示器
显示器的分类:
按显示设备所用的显示器件分类:
阴极射线管(CRT)显示器:
CRT显示器主要由电子枪、偏转线圈、荫罩、高压石墨电极和荧光粉涂层及玻璃外壳5部分组成。具有可视角度大、无坏点、色彩还原度高、色度均匀、可调节的多分辨率模式、响应时间极短等优点。
液晶显示器(LCD):
原理:利用液晶的电光效应,由图像信号电压直接控制薄膜晶体管,再间接控制液晶分子的光学特性来实现图像的显示。
特点:体积小、重量轻、省电、无辐射、绿色环保、画面柔、不伤眼等。
LED(发光二极管)显示器:
原理:通过控制半导体发光二极管进行显示,用来显示文字、图形、图像等各种信息。
LCD与LED是两种不同的显示技术,LCD是由液态晶体组成的显示屏,而LED则是由发光二极管组成的显示屏。与LCD相比,LED显示器在亮度、功耗、可视角度和刷新速率等方面都更具优势。
阴极射线管(CRT)显示器按所显示的信息内容分类:
字符显示器:
显示字符的方法以点阵为基础。点阵是指由m x n个点组成的阵列。点阵的多少取决于显示字符的质量和字符窗口的大小。字符窗口是指每个字符在屏幕上所占的点数,它包括字符显示点阵和字符间隔。
重点:
显存中存放的是ASCLL码,显存里的ASCLL码在显示之前需要根据ROM芯片里的字符点阵信息,得到每个字符显示在屏幕上的形状。
具体地,将点阵存入由ROM构成的字符发生器中,在CRT进行光栅扫描的过程中,从字符发生器中依次读出某个字符的点阵,按照点阵中0和1代码不同控制扫描电子束的开或关,从而在屏幕上显示出字符。对应于每个字符窗口,所需显示字符的ASCII代码被存放在视频存储器VRAM中,以备刷新。
根据CRT的控制信息以及字符的ASCLL码,就能选中某个字符的字形码在ROM中的存放位置,将这一字形信息传送到输出缓冲寄存器中,再用阴极射线管将其显示在显示器上。
图形显示器:
将所显示图形的一组坐标点和绘图命令组成显示文件存放在缓冲存储器中,缓存中的显示文件传送给矢量(线段)产生器,产生相应的模拟电压,直接控制电子束在屏幕上的移动。为了在屏幕上保留持久稳定的图像,需要按一定的频率对屏幕进行反复刷新。这种显示器的优点是分辨率高且显示的曲线平滑。目前高质量的图形显示器采用这种随机扫描方式。缺点是当显示复杂图形时,会有闪烁感。
图形显示器根据扫描方式不同可分为:光栅扫描显示器与随即扫描显示器
图像显示器:比图形显示器显示的图形要复杂,丰富些。
显示器的性能指标:
屏幕大小:以对角线长度表示,常用的有12~29英寸等。
分辨率:所能表示的像素个数,屏幕上的每一个光点就是一个像素,以宽、高的像素的乘积表示,例如,800x600、1024x768和1280x1024等。
灰度级:灰度级是指黑白显示器中所显示的像素点的亮暗差别,在彩色显示器中则表现为颜色的不同,灰度级越多,图像层次越清楚逼真,典型的有8位(256级)、16位等。n位可以表示2^n种不同的亮度或颜色。
刷新:光点只能保持极短的时间便会消失,为此必须在光点消失之前再重新扫描显示一遍,这个过程称为刷新刷新频率:单位时间内扫描整个屏幕内容的次数,按照人的视觉生理,刷新频率大于30Hz时才不会感到闪烁,通常显示器刷新频率在60~120Hz。
显示存储器(VRAM):也称刷新存储器,为了不断提高刷新图像的信号,必须把一帧图像信息存储在刷新存储器中。其存储容量由图像分辨率和灰度级决定,分辨率越高,灰度级越多,刷新存储器容量越大。VRAM容量=分辨率*灰度级位数,这是显存理论上达到的最小容量,即一帧的大小,若小于这个容量,显示器就不能正常工作了。
VRAM带宽 = 分辨率x 灰度级数 x 帧频,就是VRAM一秒钟能写入多少数据。
现代计算机中,显存除了作为当前显示帧的缓存,还会用于保存即将渲染的图像数据。所以现代计算机的显存都比较大。
集成显卡计算机中,通常分配一片内存作为显存。
注:显示存储器(VRAM)重点学习。
打印机
打印机是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上。
按印字原理不同可分为:
击打式打印机
利用机械动作使印字机构与色带和纸相撞而打印字符
优点:设备成本低印字质量好
缺点:噪声大速度慢
如:机打发票、银行回执单(防伪性好)非击打式打印机
采用电、磁、光、喷墨等物理、化学方法来印刷字符
优点:速度快,噪声小
缺点:成本高
按打印机工作方式不同可分为:
串行打印机:逐字打印,速度慢
行式打印机:逐行打印,速度快
按工作方式不同可分为:
针式打印机
原理:在联机状态下,主机发出打印命令,经接口、检测和控制电路,间歇驱动纵向送纸和打印头横向移动,同时驱动打印机间歇冲击色带,在纸上打印出所需内容。特点:针式打印机擅长“多层复写打印”,实现各种票据或蜡纸等的打印。它工作原理简单,造价低廉,耗材(色带)便宜,但打印分辨率和打印速度不够高。
喷墨式打印机原理:带电的喷墨雾点经过电极偏转后,直接在纸上形成所需字形。彩色喷墨打印机基于三基色原理即分别喷射3种颜色墨滴,按一定的比例混合出所要求的颜色。
特点:打印噪声小,可实现高质量彩色打印,通常打印速度比针式打印机快;但防水性差,高质量打印需要专用打印纸。
激光打印机
原理:计算机输出的二进制信息,经过调制后的激光束扫描,在感光鼓上形成潜像,再经过显影、转印和定影,便在纸上得到所需的字符或图像。特点:打印质量高、速度快、噪声小、处理能力强;但耗材多、价格较贵、不能复写打印多份,目对纸张的要求高。激光打印机是将激光技术和电子显像技术相结合的产物。感光鼓(也称为硒鼓)是激光打印机的核心部件。
三.I/O接口
1.I/O接口的作用
•数据缓冲:通过数据缓冲寄存器(DBR)达到主机和外设工作速度的匹配
•错误或状态监测:通过状态寄存器反馈设备的各种错误、状态信息,供CPU查用
•控制和定时:接收从控制总线发来的控制信号、时钟信号
•数据格式转换:串-并、并-串等格式转换
上面描述的功能都是为了主机与I/O设备的通信,即实现主机---I/O接口---I/O设备之间的通信
2.I/O接口
主机侧(系统总线):内部接口与系统总线相连,实质上是与内存、CPU相连。数据传输方式可以是并行传输也可以是串行传输。
设备侧(接口电缆):外部接口通过接口电缆与外设相连,外部接口的数据传输可能是串行方式,因此I/O接口需具有串/并转换功能。
注:一个I/O接口可以连接一个I/O设备(SATA接口),也有的I/O接口可以连接多个I/O设备。
3.I/O接口的工作原理
① 发命令:CPU发送命令字(控制字)到I/O控制寄存器,I/O控制寄存逻辑根据CPU发送的命令字,对设备发出控制信号,即向设备发送命令(需要驱动程序的协助)
② 读状态:CPU从状态寄存器读取状态字,获得设备或I/O控制器的状态信息
③ 读/写数据:CPU从数据缓冲寄存器发送或读取数据,在I/O控制逻辑的控制下,完成主机与外设的数据交换。
④ 完成工作后,外设会向I/O接口反馈状态信息,当I/O接口检测到工作已经完成,就会修改状态寄存器中相应的bit位,这样CPU就能通过状态寄存器得知I/O操作是否完成。
如何检测呢?
1.CPU不断轮询检查状态寄存器(程序查询方法)。
2.通过I/O控制器可以通过控制线给CPU发送中断请求信号,当CPU检测到中断请求信号,再对中断进行处理。
这里补充一下:为什么图中状态寄存器与控制寄存器写在了一起?
CPU控制设备进行输入/输出操作时,一定是CPU先向设备发送命令,这个命令可以放到控制寄存器中,当I/O控制逻辑取出这条命令后,这样控制寄存器就空闲了。
接下来这一控制寄存器就可以作为状态寄存器,接收外设反馈的状态信息。
所以,控制寄存器、状态寄存器在使用时间上是错开的,因此有的I/O接口中可将二者合二为一。
CPU与I/O控制器之间的I/O总线的作用:
地址线:I/O控制器的各种寄存器称为I/O端口,例如,数据寄存器称为数据端口,状态寄存器称为状态端口,其他同理。CPU在对端口的数据进行读/写时,需要通过地址线指明读/写哪一个端口。
数据线:数据总线会传送读写数据、状态字、控制字、中断类型号(区分中断类型)。
控制线:CPU通过控制总线发出读/写IO端口的信号、中断请求信号。
一个I/O接口可以连接多个外设,CPU如何传递设备的选择信息?
方案一:
在有的系统当中,地址线不仅用来指明要读/写哪一个I/O端口(哪一个寄存器),也被用于指明要使用的设备编号,I/O端口的编号与设备编号需要分两次传输
方案二:
每个设备对应一组寄存器,操作不同的寄存器就是在操作不同的设备。
4.I/O端口
上面讲到I/O端口,I/O端口是指接口电路中可以被CPU直接访问的寄存器。
如何访问I/O端口呢?可以用以下两种方式对I/O端口进行编址:
•统一编址
把I/O端口当做存储器的单元进行地址分配,用统一的访存指令就可以访问I/O端口,又称存储器映射方式。靠不同的地址码区分内存和I/O设备,I/O地址要求相对固定在地址的某部分。
RISC(精简指令集)机器常用这种方式,因为精简指令集指令只会有两个访存方式:LOAD和STORE。用这两个指令,CPU就可以实现对所有I/O设备的控制。
如系统总线中地址线共10根,则可以访问的存储单元个数为2^10=1024个,假设要给10个I/O端口编址:
1.0~9表示I/O地址,10~1023为主存单元地址(低地址作为I/O地址,高地址作为主存单元地址)
2.0~1013表示主存单元地址,1014~1023为IO地址(低地址作为主存单元地址,高地址作为IO地址)
3.10~19表示I/O地址,0~9、20~1023为主存单元地址(中间地址作为I/O地址,其他地址作为主存单元地址)
一旦确定了主存单元地址与IO地址分布,那么就不能随意更改。
优点:
1.不需要专门的输入/输出指令,所有访存指令都可直接访问端口,程序设计灵活性高。
2.由于I/O端口与主存单元共享地址空间,端口有较大的编址空间。
3.读写控制逻辑电路简单。
缺点:
1.端口占用可主存地址空间,使主存地址空间变小
2.外设寻址时间长(地址位数多,地址译码速度慢)
•独立编址
I/O端口地址与存储器地址无关,独立编址CPU需要设置专门的输入/输出指令访问端口,又称I/O映射方式。靠不同的指令区分内存和I/O设备。(Intel处理器常用,IN,OUT就是IO指令)
IN:从某个I/O端口读数据到CPU的某个寄存器中 OUT:将CPU某个寄存器的内容写到指定I/O端口中
优点:
1.使用专用I/O指令,程序编制清晰。
2.I/O端口地址位数少,地址译码速度快。
3.I/O端口的地址不占用主存地址空间。
缺点:
1.I/O指令类型少,一般只能对端口进行传送操作,程序设计灵活性差。
2.需要CPU提供存储器读/写、I/O设备读/写两组控制信号,增加了控制逻辑电路的复杂性。
5.I/O接口的类型
按数据传送方式可分为:
并行接口:一个字节或一个字所有位同时传送。
串行接口:一位一位地传送。
注:这里所说的数据传送方式指的是外设和接口一侧的传送方式,而在主机和接口一侧,数据可以是并行传送,也可以是串行传送的。接口要完成数据格式转换。
按主机访问I/O设备的控制方式可分为:
程序查询接口
中断接口
DMA接口
按功能选择的灵活性可分为:
可编程接口
不可编程接口
四.I/O控制方式
1.程序查询方式
CPU不断轮询检查I/O控制器中的“状态寄存器”,检测到状态为"已完成"之后,再通过数据总线从数据寄存器取出输出数据到CPU的某个寄存器中。
x86中的IO指令实例:
IN Rd,Rs:把IO端口 Rs的数据输入到CPU寄存器 Rd
OUT Rd,RS:把CPU寄存器Rs的数据输出到IO端口Rd
若此时要打印abc3个字符:
1.通过地址线指明,此时CPU要传送数据到Rn+1端口(状态/控制寄存器),再通过控制线指明,此时要对I/O端口进行"写"操作。最后CPU通过数据线向指定的I/O端口传输命令字(控制字)数据即可,就是用OUT输出一个IO指令。
2.I/O接口的I/O控制逻辑会根据控制寄存器中的指令,通过控制线给打印机发送相应的控制信号。打印机收到命令后启动。
3.打印机启动后,会通过状态线给I/O接口反馈。当I/O接口发现打印机启动操作完成时,会通过I/O控制逻辑,将就绪的状态信息存放到状态/控制寄存器中。
4.若采用程序查询方式,那么当CPU发出OUT指令后,会一直通过数据线轮询检查状态寄存器的状态是否已经变为就绪态。
这种轮询是怎么实现的呢?
通过IN Rd,Rs这样的IN指令,就可以一直取得状态寄存器的信息到CPU的某一寄存器。
5.CPU通过IN指令发现,现在打印机已经处于就绪的状态,CPU就会通过地址线指明,现在要传输的端口是Rn端口(数据缓冲寄存器),通过控制线指明,此时要对I/O端口进行"写"操作。最后通过数据线把"a"这一字符写入到数据缓冲寄存器中。(a字符的写入只需要用一个OUT指令即可)
6.I/O控制逻辑将这一字符的信息,通过数据线输出给打印机,同时I/O控制逻辑也会发出相应的控制信号。
7.当打印机在打印字符时,就处于忙碌的状态,此时反馈给状态寄存器的信息就是忙碌的状态。直到打印工作完成后,打印机又会通过状态线,给I/O接口反馈打印完成的信号,这时状态寄存器中的信息改为就绪态。
8.CPU就可以继续通过数据线往Rn端口中写入数据了,与上述步骤一样。
9.打印完成后,CPU会通过数据线给Rn+1(状态/控制寄存器)发送一个"停机"的命令字。
这个停机操作也需要打印机的驱动程序执导,因为只有驱动程序知道这台打印机“停机”应该发出什么样的命令字。
10.最后通过I/O控制逻辑的传送,停机的信号会传送给打印机,打印机的工作就停止了。
程序查询方式的流程图如下:
优点:接口设计简单、设备量少。
缺点:CPU在信息传送过程中要花费很多时间用于查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低。
例题:
在程序查询方式的输入/输出系统中,假设不考虑处理时间,每一个查询操作需要100个时钟周期,CPU的时钟频率为50MHz。现有鼠标和硬盘两个设备,而且CPU必须每秒对鼠标进行30次查询,硬盘以32位字长为单位传输数据,即每32位被CPU查询一次,传输率为2X2^20B/s。求CPU对这两个设备查询所花费的时间比率,由此可得出什么结论?
频率的角度:
CPU的时钟频率为50MHz,即每秒50x10^6个时钟周期时间的角度:
一个时钟周期为 1/50MHz=20ns一个查询操作耗时 100x20ns=2000ns
(1)鼠标
每秒查询鼠标耗时 30x2000ns=60000ns
查询鼠标所花费的时间比率=60000ns/1s=0.006%
对鼠标的查询基本不影响CPU的性能
(2)硬盘
每32位需要查询一次,每秒传送 2X2^20 B
每秒需要查询(2x220B)/4B=2^19次
查询便盘耗时:2^15 x 2000ns = 512*1024*2000ns 1.05 *10^9ns
查询硬盘所花费的时间比率=(1.05x10^9ns)/1s=105%
CPU将全部时间都用于对硬盘的查询也不能满足磁盘传输的要求
对于慢速的I/O设备,采用程序查询,不会影响CPU性能。但是对于快速的I/O设备,采用程序查询方式,则会大幅降低CPU的性能。
之前说程序查询方式会一直轮询检查,但其实CPU也可以采用定时查询的方式:
定时查询:在保证数据不丢失的情况下,每隔一段时间CPU就查询一次I/O状态。查询的间隔内CPU可以执行其他程序。
独占查询:CPU 100%的时间都在查询I/O状态,完全串行。(之前讲的方式)
2.程序中断方式
(1)中断的基本概念
程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
注:CPU在每执行完一条指令后,都会检查是否有中断请求信号需要处理。若有中断请求信号,则会转到中断服务程序处理中断请求。
CPU如何响应一个中断信号呢?
1.中断请求
中断源向CPU发送中断请求信号。
2.中断响应
若有中断信号,则CPU会判断当前的状态是否可以响应中断信号,即满足响应中断的条件。例如执行关中断,则CPU就会暂时不理睬中断请求信号。若此时可以响应中断信号,就需要进行中断判优:多个中断源同时提出请求时通过中断判优逻辑响应一个中断源。
3.中断处理
中断隐指令:把CPU的执行流转移到正确的中断服务程序。本质上就是修改PC的值,使PC的值为相应中断服务程序的第一条指令。接下来CPU就能执行中断服务程序了。
CPU如何判断自己是否处于关中断的状态呢?
这一状态信息会被存放在PSW(程序状态字寄存器)中
关中断用IF表示:
IF=1表示开中断(允许中断)
IF=0表示关中断(不允许中断)
若此时状态寄存器中的IF=0,则CPU处于关中断状态,关中断的作用是:实现原子操作。这一系列的操作要么就不做,要么就一气呵成全部完成,不会理睬中断请求信号。例如①②③指令想要不受干扰的全部完成,就可以在①之前执行关中断指令,再③完成后在开中断即可。
但是也有一些优先级很高的中断请求,即使在关中断时也会被响应:
非屏蔽中断:关中断时也会被响应(如:掉电)
可屏蔽中断:关中断时不会被响应
(2)中断请求标记
判断是哪个设备发来的中断信号?
每个中断源向CPU发出中断请求的时间是随机的。为了记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器INTR,当其状态为“1”时,表示中断源有请求。
这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。
对于外中断,CPU是在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号,以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻。
CPU响应中断必须满足3个条件:
① 中断源有中断请求。
② CPU允许中断即开中断。
③ 一条指令执行完毕,且没有更紧迫的任务。
(3)中断判优
中断判优需要解决的问题:有多个中断信号同时到来,先处理哪个?
中断判优既可以用硬件实现,也可用软件实现:
硬件实现是通过硬件排队器实现的,它既可以设置在CPU中,也可以分散在各个中断源中;软件实现是通过查询程序实现的。
硬件实现:
可以将不同中断源的中断请求标记位用以下电路连接起来,最左边的中断源对应的信号是优先级最高的信号,越往后,优先级越低。优先级越高的中断请求信号会越优先被CPU处理。
软件实现:
如下图所示,按照优先级递减的方式,一位一位的检查是否有中断请求信号
软件实现的中断判优比硬件实现的中断判优要慢很多。
可以使用以下原则来设置各个中断的优先级:
1.硬件故障中断属于最高级,其次是软件中断;
2.非屏蔽中断优于可屏蔽中断;
3.DMA请求优于I/O设备传送的中断请求;
4.高速设备优于低速设备;
5.输入设备优于输出设备;
6.实时设备优于普通设备。
(4)中断处理过程
CPU如何找到与中断请求信号相应的中断服务程序?
当前指令执行结束后,PC内容为K+1。进入中断服务程序的方法是把该程序第一条指令的地址放入PC。回到主程序的方法是把K+1放入PC。如何实现以上操作:
CPU检测到中断信号后会自动执行中断隐指令:保存原程序的PC值,并让PC指向中断服务程序的第一条指令。
注:中断隐指令不是CPU中的一条指令,而是CPU检测到中断信号后固定完成的一系列操作。
中断隐指令的主要任务:
①关中断。在中断服务程序中,为了保护中断现场(即CPU主要寄存器中的内容)期间不被新的中断所打断,必须关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。
②保存断点。为了保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容)保存起来,可以存入堆栈,也可以存入指定单元。
③ 引出中断服务程序。引出中断服务程序的实质就是取出中断服务程序的入口地址并传送给程序计数器(PC)。
回到最开始的问题:如何找到与中断请求信号相应的中断服务程序的起始地址?
•软件查询法
•硬件向量法
由 硬件 产生 向量地址,再由 向量地址 找到 中断服务程序的入口地址
具体地,我们可以用硬件排队器实现中断判优,中断判优会导致只有一个输出线会输出1,其他输出线输出0。将这一输出作为中断向量地址形成部件的输入,经过这一电路的处理后,会把对应的信号映射为向量地址。
例如下图,根据排队器输出的结果可以判断是哪一个中断源发出中断请求信号,再经过终端向量地址形成部件的处理,会形成一个向量地址(也称为中断类型号),用12进制表示这一向量地址=12H。所以12H就是与这一中断请求信号对应的中断向量的保存地址。而中断向量又指向了这一中断请求服务程序的入口地址。(这里一定要区分向量地址与中断向量的区别)
为什么向量地址不直接指向中断服务程序的入口地址呢?
因为中断服务程序可能被修改,例如下图,打印机服务程序只占200~299地址,但如果这一服务程序变长/变短了,显示器所对应的服务程序入口地址就会改变。所以若采用这种方式,一旦修改了服务程序,就需要修改中断向量地址形成部件这一硬件电路,这样的做法是不对的。
若加入中断向量,那么修改服务程序时,只需要修改主存中的中断向量,使其指向正确的服务程序入口地址即可。
(5)中断服务程序
中断服务程序的主要任务:
①保护现场
保存通用寄存器和状态寄存器的内容(eg:保存ACC寄存器的值),以便返回原程序后可以恢复CPU环境。可使用堆栈,也可以使用特定存储单元。
② 中断服务(设备服务)
主体部分,如通过程序控制需打印的字符代码送入打印机的缓冲存储器中(eg:中断服务的过程中有可能修改ACC寄存器的值)
③ 恢复现场
通过出栈指令或取数指令把之前保存的信息送回寄存器中(eg:把原程序算到一半的ACC值恢复原样)
④ 中断返回
中断返回指令回到原程序断点处。
中断处理的过程如下:
以上讲解的都是单重中断,即执行中断服务程序时不响应新的中断请求。
(6)多重中断
在某些系统中,单重中断的方式也许无法满足需求,所以提出了多重中断。
多重中断:又称中断嵌套,执行中断服务程序时可响应新的中断请求。如下图所示:
CPU若要具备多重中断的功能,须满足下列条件:
①在中断服务程序中提前设置开中断指令。
②优先级别高的中断源有权中断优先级别低的中断源。但优先级低的中断源不能中断优先级高的中断源。例如,当前在处理中断源为DMA的中断请求,紧接着键盘发来了中断请求信号,DMA为优先级高的中断源,所以键盘发来的中断请求信号不应该被理会。
要怎么实现优先级别高的中断源有权中断优先级别低的中断源呢?
这就需要中断屏蔽技术,在硬件排队器的基础上增加中断屏蔽功能,原来的硬件排队器收到多个中断请求时,只响应其中固定优先级,但是增加屏蔽功能后,可以调整多重中断的优先级。
每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。用屏蔽字指明,哪些中断请求应该被屏蔽,哪些中断请求可以打断当前的中断处理程序。将优先级高的设置为不能被中断的屏蔽字,将优先级低的设置为可被中断的屏蔽字即可。
例如,INTR1表示的是DMA中断请求,INR4表示的是键盘中断请求,INR1被处理的优先级要大于INR4,当两者同时发出中断请求信号时,INR1中断请求会先被响应。当CPU在处理键盘发来的中断请求时,紧接着收到了DMA发来的中断请求,那么这一键盘发来中断请求,又会被DMA发来的中断请求中断。
若给键盘这一中断源设置一个与之对应的中断屏蔽字,即、、、设为1,这就能保证与键盘对应的中断服务程序不能被中断。
屏蔽字设置的规律:
1.一般用'1'表示屏蔽,’0'表示正常申请。
2.每个中断源对应一个屏蔽字(在处理该中断源的中断服务程序时,屏蔽寄存器中的内容为该中断源对应的屏蔽字)。
3.屏蔽字中'1'越多优先级越高。每个屏蔽字中至少有一个1(至少要能屏蔽自身的中断)。例如CPU在处理键盘发来的中断请求时,键盘又发来了中断请求,键盘这一中断请求信号是不能中断前一个中断请求的。
单重中断与多重中断的对比:
对于多重中断,中断服务程序不仅要保护现场也要保护屏蔽字。在保护现场和屏蔽字后,会接着执行一个开中断指令,就是新的中断请求可以打断当前中断服务程序。
可以将第一个开中断放到保护现场和屏蔽字前面吗?
不能,若将第一个开中断放到保护现场和屏蔽字前面,那就意味着,可能主程序的现场只保存了一半,又被新的中断打断,这就导致了主程序以前运行的现场丢失。
所以保护现场的执行应该是一气呵成的。
恢复现场同理,所以需要在恢复现场前关中断,恢复现场后在开中断
例题:
设某机有4个中断源A、B、C、D,其硬件排队优先次序为A>B>C>D,现要求将中断处理次序改为D>A>C>B。
(1)写出每个中断源对应的屏蔽字。
(2)按下图所示的时间轴给出的4个中断源的请求时刻,画出CPU执行程序的轨迹。设每个中断源的中断服务程序时间均为20us。
(1)若要将A>B>C>D改为D>A>C>B,设置A对应的屏蔽字时,只有D的中断请求能中断A的中断服务程序,所以屏蔽字为:1,1,1,0,即D不被屏蔽,其他都被屏蔽。
所有的中断请求都能打断B的中断服务程序,所以除了屏蔽B,其他中断源发来的请求信号都应该被响应。
其他类似:
(2)
① 在5时刻B发来了中断请求信号
② 由于B对应可以被D中断源中断,所以D会先运行中断服务程序,运行时间20us,D执行结束后,再回到B
③ B执行了5us后,在35时刻遇到了A中断源发来的中断请求信号,由于A的优先级>B,所以先执行A的中断服务程序。运行时间为20us,执行结束后回到B
④ B执行5us后,在60时刻,又被C中断源中断。C运行20us后,执行结束。
⑤ 由于B之前已经运行了15us,所以之后再运行5us即可。
(7)程序中断方式的工作过程
① 外部设备完成工作后,会给CPU发送中断请求信号,CPU在指令执行周期的末尾检测到中断请求信号,会对中断请求进行处理。处理完中断请求后,会继续返回原程序。
下图的K表示当前原程序执行到K地址,则执行完中断请求后,将返回K+1地址继续执行原程序。
② 中断处理的过程如下:
1.完成中断隐指令。2.执行中断服务程序(保护现场,执行中断服务程序)
③ CPU取走了外设准备的第一个数据。外部设备准备下一个数据。
④ CPU执行完中断服务程序后,恢复现场,就可以继续执行原程序。
所以引入程序中断方式后,CPU与外部设备就能并行工作了。
例题:
假定CPU主频为50MHz,CPI为4。设备D采用异步串行通信方式向主机传送7位ASCII字符,通信规程中有1位奇校验位和1位停止位,从D接收启动命令到字符送入I/O端口需要0.5ms。请回答下列问题,要求说明理由。
(1)设备D采用中断方式进行输入/输出,示意图如下:
I/O端口每收到一个字符申请一次中断,中断响应需10个时钟周期,中断服务程序共有20条指令,其中第15条指令启动D工作。若CPU需从D读取1000个字符,则完成这一任务所需时间大约是多少个时钟周期?CPU用于完成这一任务的时间大约是多少个时钟周期?在中断响应阶段CPU进行了哪些操作?
I/O端口每收到一个字符申请一次中断,中断响应需10个时钟周期,中断服务程序共有20条指令,其中第15条指令启动D工作。
(1)完成这一任务所需时间大约是多少个时钟周期?
主频50MHz,时钟周期为1/50MHz=20ns
0.5ms对应时钟周期数为0.5ms/20ns=25000
传送1个字符需要的时钟周期数为 25000+10+15x4 = 25070
传送1000个字符需要的时钟周期数为 25070x1000=25070000
(2)CPU用于完成这一任务的时间大约是多少个时钟周期?
CPU用于该任务的时间大约为:
1000x(10+20x4)=9x10^4 个时钟周期(3)在中断响应阶段CPU进行了哪些操作?
中断隐指令:1.关中断 2.保存断点(PC) 3.引出中断服务程序
3.DMA方式
(1)DMA方式工作流程
DMA控制器通常用于控制某一些块设备(以块为单元进行读/写的设备),例如磁盘。
若采用这种方式,CPU需向DMA控制器指明要输入还是输出;要传送多少个数据;数据在主存、外设中的地址。
若CPU要读取磁盘中的某一块数据,DMA控制器中会记录要传送多少字的数据,还会记录要读的数据在磁盘中的存放位置,以及需要读取到主存的哪一个位置。
DMA的数据缓冲寄存器用来接收磁盘传过来的一个字的数据,每收到一个字的数据,DMA控制器就会根据主存读写地址,将数据通过系统总线传入主存中。
读完一个字后,主存读写地址与外设读写地址都需要更新。其他同理,直到DMA控制器中记录的"要传的字"为0后,表示读取完毕了。
总结:
传送前:
1.DMA控制器接收磁盘发来的DMA请求,并向CPU发出总线请求。
2.CPU响应此总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期。
传送时:
3.DMA控制器确定传送数据的主存单无地址及长度,并能自动修改主存地址计数和传送长度计数。
4.DMA控制器需要控制数据在主存和外设间的传送方向,这一传送方向是起始CPU发送给DMA控制器的,例如,发出读写等控制信号,执行数据传送操作。
传送后:
5.向CPU报告DMA操作的结束。
(2)DMA控制器的结构
•控制/状态逻辑:由控制和时序电路及状态标志组成,用于指定传送方向,修改传送参数,并对DMA请求信号和CPU响应信号进行协调和同步。
•DMA请求触发器:每当I/O设备准备好数据后给出一个控制信号,使DMA请求触发器置位。
•数据缓冲寄存器:用于暂存每次传送的数据。
当I/O设备准备好数据后,会向DMA请求触发器发送有效信号,接着控制/状态逻辑修改相关信号,使得数据缓冲寄存器的数据送到主存中。
•主存地址计数器:简称AR,存放要交换数据的主存地址。
•传送长度计数器:简称WC,用来记录传送数据的长度,计数溢出时,数据即传送完毕,自动发中断请求信号。
•中断机构:当一个数据块传送完毕后触发中断机构,向CPU提出中断请求。
注:在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU的主存控制信号被禁止使用(因为CPU与主存的数据传输也需要使用系统总线)。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其操作。
(3)DMA传送过程
预处理:
① CPU向DMA控制器指明接下来要读/写的数据存放在主存的什么位置,主存的起始地址会放在AR中:主存起始地址--->AR
② CPU还需向DMA控制器指明设备的读写地址:I/O设备地址--->DAR
③ CPU还需向DMA控制器指明要传送多少数据:传送数据个数--->WC
④ 启动I/O设备
数据传送:
数据传送的同时CPU可以继续执行主程序
① 设备将数据写入DR,同时向DMA请求触发器发送有效信号。
② DMA请求触发器写满后向控制/状态逻辑发送DMA请求。
③ 控制/状态逻辑收到DMA请求(一个字已经传送完毕),接着向总线发送总线请求。
④ CPU将总线控制权交给DMA控制器。
⑤ DMA控制器获得总线控制权后,就可以通过数据线,地址线,控制线给主存发送读/写命令。
⑥ 一个字的数据传输完后,需要修改主存地址计数器以及传送长度计数器的参数。
⑦ 所有数据传输完毕后,传送长度计数器会发送溢出,中断机构收到溢出信号后,会通过系统总线向CPU发送中断请求。
⑧ CPU对DMA的中断信号进行处理。
注:DMA请求与DMA的中断请求不同。发生DMA请求意味着一个字的数据传送完毕。发生DMA中断请求意味着所有数据传输完毕。
后处理:
CPU执行中断服务程序,做DMA结束处理。接着继续执行主程序。
(4)DMA传送方式
之前说过,在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU的主存控制信号被禁止使用。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其操作。是否将总线控制权交给DMA控制器,完全由CPU决定。
但若采用以下连接方式(三总线方式),即CPU和主存之间通过主存总线进行交互,主存与DMA控制器间用DMA总线进行交互。那么DMA控制器是否与主存进行数据传输就不由CPU控制了。
若某一时刻CPU想访问主存,DMA控制器也想访问主存,若主存不是双端口主存,那么对主存的访问请求是先满足CPU,还是先满足DMA控制器。
可以用以下三种方式解决CPU与DMA控制器的访存冲突。
1.停止CPU访问主存
DMA控制器传输一整块数据时,主存的使用权会完全分配给DMA控制器,这样会导致CPU的运行停止,即不执行程序。
特点:控制简单。但CPU处于不工作状态或保持状态,未充分发挥 CPU 对主存的利用率。
2.DMA与CPU交替访存
一个CPU周期被分为C1和C2两个周期,C1专供DMA访存,C2专供CPU访存
不需要总线使用权的申请、建立和归还过程(因为使用周期是固定的),但是硬件逻辑更为复杂。并且未必能很好地发挥主存的读写性能。例如,CPU对主存的访问很频繁,每一个分配给CPU的访存周期,CPU都能使用到,但是DMA控制器而言,由于需要等待外部设备输入一个字,输入一个字后才会访存,所以分配给DMA控制器的访存周期不能被充分使用。
3.周期挪用(周期窃取)
这里的周期指的是主存的存取周期,DMA访存主存有三种可能:
1.CPU 此时不访存(不冲突)
2.CPU正在访存(存取周期结束让出总线)
3.CPU 与 DMA 同时请求访存(I/O访存优先,即DMA控制器优先访存),因为若数据缓冲寄存器不及时把数据传输到主存中,外部设备继续往数据缓冲寄存器写数据,就会把之前的数据覆盖。
总结:
主存和DMA接口之间有一条直接数据通路。
由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。
DMA方式具有下列特点:
①它使主存与CPU的固定联系脱钩,主存既可被CPU访问,又可被外设访问。
②在数据块传送时,主存地址的确定、传送数据的计数等都由硬件电路直接实现。
③主存中要开辟专用缓冲区,及时供给和接收外设的数据。
④DMA传送速度快,CPU和外设并行工作,提高了系统效率。
⑤DMA在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。
中断方式与DMA方式对比:
对于DMA方式而言,每发送一次DMA请求,就仅能传送数据。而对于程序中断方式,若I/O设备发生异常,也可以通过中断请求信号给CPU发送相应通知。