一、前言
本章节为计算机组成原理第四篇:输入输出系统(I/O 系统)。
在计算机系统中,CPU 与内存之间的数据交换速度极快,而外部设备(键盘、鼠标、显示器、磁盘、网卡等)的工作速度往往比 CPU 慢几个数量级,且种类繁多、控制方式各异。
围绕“数据如何从外设进入主机、又如何从主机送往外部设备”这一核心问题,本章将依次介绍以下内容:
- IO 接口:说明接口的功能、基本结构与端口编址方式,理解接口在主机与外设之间起到的桥梁作用。
- 程序查询方式:介绍 CPU 通过不断查询设备状态来完成数据传送的控制方式,分析其原理与效率瓶颈。
- 程序中断方式:说明中断请求、中断响应与中断处理的基本流程,理解中断方式如何提高 CPU 的利用率。
- DMA 方式:介绍直接存储器访问的工作原理与传送过程,理解其在大批量高速数据传输中的优势。
二、I/O接口
CPU 和外设之间速度、电平、数据格式差异巨大,不能直接连在系统总线上,I/O 接口(适配器)就是主机和外设之间的桥梁电路,用来解决两边不匹配的问题
I/O接口的功能和组成:
基本构成
CPU与输入设备的信息交互过程:
CPU—>IO:CPU寻找目标设备A(选择设备),IO接口的设备选择电路判断是否是设备A
你(CPU)正在写作业,突然想起来还没吃早饭,于是在手机上打开某APP,精准选中了“好评第一”的跑腿小哥A(寻找目标设备A)
CPU—>IO:发送启动外设的控制命令,启动设备A;CPU发完命令后转去执行其他任务,不再等待(若设备已就绪,发送控制命令)
你给外卖小哥发了一条语音:“去xxx老字号给我带一份双蛋肠粉”(启动命令)
发完之后,你把手机锁屏,扔在一边,继续写作业(CPU不等待,去执行其他任务)
IO—>外设:命令寄存器和命令译码器翻译:@外设,CPU needs your data, please input.(暂存命令并转换为外设的控制信号)
外卖小哥A的手机响了,某APP平台把你的语音转成了文字,并且用小哥看得懂的导航路线展示出来:@外卖小哥,客户需要一份双蛋肠粉,请到某某店取货。
(命令寄存器把指令翻译成了外设看得懂的控制信号)
外设—>IO:ok, I will input my data...(输入数据) finish! (完成输入,数据送入接口缓存寄存器)
外卖小哥到了店里,跟老板说:“单号001,一份双蛋肠粉” 老板打包好后递给小哥,小哥接过肠粉把它放在电动车后面的保温箱里(设备输入数据完毕,把数据放入了接口缓冲寄存器)
IO—>CPU:数据输入完毕,发起中断请求
小哥确认后立刻通过APP平台发出强提醒:“外卖正在送出”(IO接口向CPU发起中断请求,INTR = 1)
CPU—>IO:收到中断请求,满足条件后给出中断响应信号,取走数据
你正在写作业,突然手机一震、门铃响了。你可怜放下笔,响应了这次呼叫(满足条件给出中断响应信号)打开门,把外卖接了过来(CPU读取数据,完成IO操作)
I / O接口结构框图:
三、程序查询方式
程序查询方式(Programmed I/O)是最简单的一种 I/O 控制方式:数据的传送完全由 CPU 执行程序来控制,CPU 通过不断读取设备状态寄存器来判断设备是否就绪,就绪后再完成一次数据传送。
有“强迫症”的你(CPU)一直在写作业,但每隔几秒钟就抬头看一眼门口,看看外卖小哥到了没
基本工作流程:
CPU→IO:CPU 通过地址总线选中目标设备B,发出设备地址(选择设备)。
你(CPU)正在写作业,突然饿了。你从手机上指定“速度排名榜上第一”的外卖小哥(设备B),选中了他的电话(发出设备地址)
*这里的手机 = 状态寄存器 + 数据总线,是CPU和I/O设备沟通的渠道
CPU→IO:向接口的命令寄存器发送启动命令,启动外设工作。
你给外卖小哥打电话:“我要一份猪脚饭,再带份辣椒酱”
CPU→IO(循环查询):CPU 反复读取接口的状态寄存器,检查设备B是否就绪。若未就绪,则继续循环查询,此期间 CPU 一直处于忙等状态。
打完电话就根本没办法专心写作业了,你每隔十几秒就忍不住拿手机看下外卖小哥的行程:
手机显示:“正在取餐......”(状态未就绪,继续死等,一直循环看)
手机显示:“正在配送......”(状态还是没就绪,继续死等,CPU一直忙碌)
手机显示:“距离还有200米.....”(还在循环看)
你明明在等外卖,但什么都干不了,只能干盯着看
IO→CPU:设备B就绪后,状态寄存器置位,CPU 退出查询循环。
手机显示:“外卖已送达”(设备就绪)
你心里一喜,方下手机,不再反复看行程了,立刻站了起来(CPU退出查询循环)
数据传送:CPU 从接口的数据缓冲寄存器读取数据(输入),或把数据写入数据缓冲寄存器(输出)。
你打开门,外卖小哥把外卖(数据)递给你(从接口的缓冲区读取数据)
结束:本次传送完成后,CPU 继续执行后续程序;若还有数据,则重复上述过程。
你关上门,提着外卖回到书桌前,终于能安心地继续写作业了(CPU继续执行后续程序)
CPU 的时间被大量浪费在等待上。当外设速度远低于 CPU 时,这种浪费尤为明显,因此引出了后续的程序中断方式与DMA 方式。
四、程序中断方式
中断:CPU暂时终止现行程序的执行,转而去执行处理更加紧迫的事件服务程序,处理完后又自动返回原程序继续执行的过程。
把CPU想象成正在自己卧室写作业的你:
1.基本过程
中断请求
由 I/O 接口中的中断请求触发器产生。当设备完成一次数据输入(数据已送入接口的数据缓冲寄存器)或输出缓冲寄存器已空时,接口将中断请求标志位置 1,并通过中断请求线向 CPU 发出请求信号。为了便于 CPU 识别请求来源,每个中断源都需要有唯一的中断类型号(中断向量号)。
外卖小哥按门铃:
你在房间写作业(执行程序)。这时候你的外卖到了,外卖小哥(I/O设备)按了你家门铃(发送中断请求)。门铃灯响了(INTR = 1)
中断判优
实际系统中往往有多个中断源同时提出请求,而 CPU 在某一时刻只能响应其中一个,因此需要中断判优(中断优先级排队)。常见的判优方式有:
- 硬件判优——(链式排队器):分散在各个中断源的接口电路中
- 硬件判优——并行优先级编码器:集中在CPU内
一般来说,高速设备、实时性要求高的设备优先级较高;而低速设备优先级较低。此外,故障类中断(如电源掉电)通常具有最高优先级。
假设你家同时有快递小哥、外卖小哥和修水管师傅三个人一起按门铃(多个中断源同时请求)。你开门只能一个个接待:
排队规则:修水管(故障中断)最急,不管它就一直停水;外卖(高速设备)第二,怕饭凉了;快递(低速设备)最后
中断响应
CPU执行程序时,在每条指令结束之前都要检测中断请求信号。
if有请求信号:CPU在当前指令结束后,暂停现行程序执行,响应I/O的中断请求
把这道题写完(指令执行结束)再看一眼门铃
中断隐指令:
CPU响应中断后转去执行中断服务程序。
完成操作:保存程序断电、硬件关中断、将中断服务程序入口地址送PC
起身去拿外卖前,必做几件本能的事:
保存程序断点:记一下刚刚写到第几页第几行了?
硬件关中断:拿外卖前,先把卧室门关上防止空调冷气出去
中断服务
CPU进入与I/O设备交换数据的阶段。
打开门,确认外卖,拿过外卖,跟外卖小哥说声谢谢(CPU与I/O设备交换数据)
中断返回
CPU完成与I/O设备的数据交换,返回到原来执行的程序
我又回到书桌前,看一眼页码,继续接着刚才的地方写作业。
2. 中断服务程序入口地址
中断向量:所有中断服务程序在主存中的入口地址总称
中断向量表:存放中断向量表,所有的中断服务程序入口地址组织成一个一维的表格,存放在一段连续的存储区中。
中断向量地址:读取中断向量所需的地址
CPU 并不是在任何时刻都能响应中断,必须同时满足以下条件:
- 处理器允许中断:EINT = 1
- 外设有中断请求且没有被屏蔽:D = 1且MASK = 0
- 在每条指令执行周期结束时,CPU发中断查询信号:INTR = 1
整个流程可以用下面的流程图表示:
中断方式虽然显著提高了 CPU 的利用率,但每次数据传送都要经历中断响应、保护现场、恢复现场等开销,对于大批量高速数据传输(如磁盘读写)仍然不够高效,这引出了后续的DMA 方式。
五、DMA方式
DMA(直接内存存取) 解决CPU当苦力的问题:让外设与主存之间直接成块搬运数据、不经过 CPU 逐字干预的传送方式
DMA与主存交换数据的三种方式
停止CPU访问主存
解释:DMA的大货车一来,直接把路封死,禁止CPU通行。大货车搬完箱子再把路让给你
效果:DMA效率最高,但CPU会被彻底堵死,效率极低。
周期挪用方式(周期窃取)
解释:大货车在你不注意的时候见缝插针
效果:CPU几乎感觉不到停顿,但大货车效率低了点(只能插空)这是最常用的方式
DMA与CPU交替访存方式(透明DMA)
解释:路被划分成了“单行道”,左边归CPU走、右边归大货车DMA走,互不干扰同时通行
效果:两个的效率都很高,但是对路要求太高(需要更宽的总线)硬件成本最贵
DMA接口功能和组成
DMA工作过程:
1. 预处理(CPU交代任务)
你(CPU)把大货车司机(DMA控制器)叫来,给了他一张详细清单:
把起点和终点地址写在纸上(写入地址寄存器 AR)。
写上要搬的总箱数:10000箱(写入字计数器 WC)。
告诉他搬运模式(写入控制字 DAR)。
交代完这些,你就可以彻底锁屏去写作业了(CPU交出总线控制权)。
2. 数据传送(大货车自动搬)
司机按喇叭(DREQ = 1):司机准备搬一箱货,先按一声喇叭,向系统申请占用大马路(总线)。
调度室放行(DACK = 1):马路调度室确认没车了,挥手说“OK,路归你了!”(批准DMA占用总线)。
司机搬货:司机立刻搬起一箱货(通过 BR 数据缓冲寄存器),从起点搬到终点(DMA控制器直接操控主存与外设传送数据)。
自动记账(AR+1, WC-1):每搬完一箱,司机会在清单上把地址划掉(AR+1),再把箱数减一(WC-1)。
如此循环,直到10000箱全部搬完。
3. 后处理(司机交差)
交清单(溢出信号):搬完最后一箱,清单上的数量正好减到 0。司机立刻按响最后一次门铃(向中断机构发出中断请求)。
你(CPU)出来验收:你听到门铃,放下笔,出来检查一下大仓库,确认10000箱货都完好无损地躺在里面,然后给司机结清运费。
六、小结
本章围绕“数据如何在外设与主机之间流动”这一主线,依次介绍了 I/O 接口、程序查询方式、程序中断方式和 DMA 方式四种由浅入深的 I/O 控制方案,核心思路可以概括为:让 CPU 从“亲自搬数据”逐步解放出来。
1. 四种方式回顾
- I/O 接口:主机与外设之间的桥梁电路,负责速度匹配、电平转换、数据格式转换、地址译码与状态/命令的暂存,是后面所有控制方式共同的硬件基础。
- 程序查询方式:CPU 通过不断读取状态寄存器判断设备是否就绪,就绪后再传送数据。原理最简单、硬件最省,但 CPU 全程忙等,时间被大量浪费在等待上。
- 程序中断方式:外设就绪后主动向 CPU 发中断请求,CPU 在当前指令执行结束后响应,经中断隐指令(保存断点、硬件关中断、送中断服务程序入口地址到 PC)转入中断服务程序完成数据交换,再恢复现场返回原程序。CPU 不必死等,利用率明显提高,但每次传送都要付出中断响应、保护现场、恢复现场的开销。
- DMA 方式:由 DMA 控制器接管总线,在主存与外设之间直接成块搬运数据,CPU 只在传送开始前做预处理(设置地址寄存器 AR、字计数器 WC、控制字 DAR)和传送结束后做后处理(响应结束中断、校验数据),整块传送过程几乎不占用 CPU。
2. 四种方式对比
| 对比项 | 程序查询方式 | 程序中断方式 | DMA 方式 |
|---|---|---|---|
| 数据传送控制者 | CPU 执行程序 | CPU 执行中断服务程序 | DMA 控制器(硬件) |
| CPU 参与程度 | 全程参与,忙等 | 每次传送都要打断 CPU | 仅预处理与后处理参与 |
| 传送单位 | 字(字节) | 字(字节) | 数据块 |
| CPU 利用率 | 最低 | 较高 | 最高 |
| 硬件开销 | 最小 | 中等 | 最大 |
| 适用场景 | 外设少、速度慢、实时性要求低 | 中低速设备、需要及时响应的场合 | 磁盘、网卡等大批量高速数据传输 |
3. 一句话记忆
查询是“我盯着你”,中断是“你叫我”,DMA 是“你俩自己搬,搬完告诉我一声”。
理解这四种方式的演进逻辑,也就理解了 I/O 系统设计的核心矛盾:CPU 与外设之间的速度鸿沟。实际系统中,这几种方式往往并存使用——键盘、鼠标等低速设备多用中断方式,磁盘、网卡等高速设备则交给 DMA,从而在成本与效率之间取得平衡。