ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【计算机408】计算机组成原理 | 输出输入设备

【计算机408】计算机组成原理 | 输出输入设备

一、前言

本章节为计算机组成原理第四篇:输入输出系统(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. 中断服务程序入口地址

  1. 中断向量:所有中断服务程序在主存中的入口地址总称

  2. 中断向量表:存放中断向量表,所有的中断服务程序入口地址组织成一个一维的表格,存放在一段连续的存储区中。

  3. 中断向量地址:读取中断向量所需的地址

CPU 并不是在任何时刻都能响应中断,必须同时满足以下条件:

  1. 处理器允许中断:EINT = 1
  2. 外设有中断请求且没有被屏蔽:D = 1且MASK = 0
  3. 在每条指令执行周期结束时,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,从而在成本与效率之间取得平衡。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进