输入输出系统

考点定位

  • 大纲章节:I/O 系统组成与基本概念、I/O 接口(I/O 控制器)、I/O 方式(程序查询、程序中断、DMA、通道)
  • 常见题型:选择题密集(接口编址方式、中断隐指令、屏蔽字分析、DMA 传送阶段/传输方式辨析),中断响应次序与屏蔽字推演是近年热门大题/综合题,DMA 与中断对比是高频简答/选择题素材
  • 考查频率:高(与存储器章节并列的计组大题来源,中断与 DMA 几乎隔年进综合题)
  • 前置知识:中断的硬件背景(中断请求触发器、判优逻辑等部件级概念)见计算机系统概述,总线周期与仲裁见总线,指令执行与 CPU 内部结构见中央处理器,操作系统层的中断处理视角见操作系统科目
  • 工程师读者注意:你写过信号处理、用过 epoll,但考试考的是硬件级中断序列的机械步骤与屏蔽字矩阵的设计规则——顺序错一步全盘扣分,必须形成"事件序列表"式的条件反射

一、I/O 系统组成与 I/O 接口

1.1 I/O 系统组成

I/O 系统 = I/O 硬件 + I/O 软件:

  • I/O 硬件:外部设备、设备控制器(I/O 接口)、I/O 总线(含总线仲裁机构)
  • I/O 软件:对设备进行管理的指令/程序,从"CPU 直接控制外设"(程序查询)到"CPU 几乎不介入"(通道)逐步卸载

核心矛盾与本章主线:外设速度远慢于 CPU(且各外设速度差异巨大)。四种 I/O 方式的本质区别就是CPU 介入程度从高到低:程序查询(CPU 全程忙等)→ 程序中断(事件驱动介入)→ DMA(仅启动与结束介入)→ 通道(CPU 只下发通道程序)。

1.2 I/O 接口的功能与结构

I/O 接口(设备控制器/适配器)是主机与外设之间的交接电路,位于系统总线与外设之间。功能:

  1. 数据缓冲:接口中的数据缓冲寄存器匹配 CPU 与外设的速度差
  2. 信号转换:串—并转换、电平转换(总线并行数据 ↔ 外设串行位流)
  3. 设备选择(选址):通过地址译码识别 CPU 访问的是哪个端口
  4. 状态反馈与控制:记录设备忙/就绪/错误等状态,传递主机命令
  5. 中断请求与屏蔽(支持中断方式时)

接口内部结构(可编程接口的核心寄存器组):

端口:接口中可被 CPU 直接访问的寄存器(数据端口、状态端口、控制端口)。注意口径:"接口"是整个电路,"端口"是接口里的寄存器,CPU 通过端口地址访问接口。

1.3 I/O 端口编址:统一编址与独立编址(必考对比)

对比项统一编址(存储器映射)独立编址(I/O 映射)
编址空间I/O 端口与主存单元共用同一地址空间I/O 端口空间与主存空间相互独立
访问指令用普通访存指令(LOAD/STORE)访问端口需专用 I/O 指令(IN/OUT 类)
地址线地址线两用,不需要单独的控制信号区分访存/访端口需额外控制线(或专用指令操作码)区分
端口地址译码占用主存地址空间(译码慢一点,地址位数多)端口地址位数少、译码快、不占主存
指令系统无需专门 I/O 指令,功能强(可对端口数据直接运算)指令系统中必须设 I/O 指令,功能受限

记忆锚点:统一编址"地址不分家、指令不分家",代价是吃内存地址;独立编址"地址分家、指令分家",代价是要专门指令。ARM/MIPS 用统一编址,x86 用独立编址(IN/OUT 指令)——工程经验直接对上。

例题(模拟题) 某机采用独立编址,主存 20 位地址,I/O 端口 10 位地址。CPU 访问一个 I/O 端口时( )。 A. 使用 20 位地址访问主存地址空间中的端口 B. 使用专用 I/O 指令,地址为 10 位端口地址 C. 使用访存指令,地址为 10 位端口地址 D. 无法访问,独立编址不支持端口寻址

解析:独立编址 = 地址空间独立 + 专用 I/O 指令,选 B。

二、程序查询方式

2.1 流程

CPU 启动设备后,原地循环读取状态端口,直到设备就绪才传送一个(或一批)数据:

  1. CPU 向控制端口写入启动命令,设备开始工作
  2. CPU 读状态端口,判断"就绪(READY)"位
  3. 未就绪 → 回到 2 继续忙等待(轮询);就绪 → 经数据端口传送数据(读入或写出)
  4. 若还需传送,回到 2;结束则退出

时间关系(CPU 视角,待动画化):

CPU: [启动]--[查询][查询][查询]...[查询]--[传送]--[查询][查询]...--[传送]--
设备:    [准备中...........就绪]        [准备中..............就绪]

2.2 CPU 利用率分析

设设备准备一个数据需 TT,传送一个数据需 CPU 介入 tt(T≫tT \gg t),则一次传输周期 T+tT + t 中 CPU 有效用于传送的时间仅 tt,CPU 效率:

η=tT+t≈tT (当 T≫t)\eta = \frac{t}{T + t} \approx \frac{t}{T}\ (\text{当 } T \gg t)

例题(模拟题) 某外设准备一个数据需 100 μs,CPU 每次传送一个数据(含查询开销)需 2 μs。采用程序查询方式连续传送 100 个数据,CPU 用于轮询等待的总时间约为( )。 A. 200 μs B. 102 μs C. 10000 μs D. 9800 μs

解析:每个数据周期 100+2=102100 + 2 = 102 μs,其中等待 100 μs;100 个数据总等待 ≈100×100=10000\approx 100 \times 100 = 10000 μs,选 C。要点:查询方式下 CPU 几乎全部时间耗在等待上。

特点总结:接口最简单(无需中断逻辑)、CPU 与外设串行工作、CPU 利用率极低。适用:CPU 不忙、实时性要求不高、速度极快的场合(或查询极快设备)。

三、程序中断方式

3.1 中断的基本概念

CPU 在执行程序过程中,出现某些突发事件时,CPU 暂停当前程序,转去执行处理该事件的中断服务程序,处理完毕后返回原程序断点继续执行。

  • 中断请求:中断源(外设接口、掉电、定时器、软件陷阱)向 CPU 发出的请求信号
  • 断点:被中断处下一条指令的地址(PC 值),返回时恢复
  • 中断服务程序入口地址的获取:向量中断由中断向量地址指向的向量表给出(硬件查表),非向量中断由软件查询确定

3.2 中断全流程:事件序列表(逐步推演,必背,待动画化)

以"键盘输入一个字符"为例,从键按下到原程序继续执行:

步骤事件执行主体关键动作
0CPU 执行第 kk 条指令期间,用户按键外设/接口接口完成串并转换,字符写入数据缓冲寄存器 DBR
1中断请求接口置位中断请求触发器 INTR(前提:接口中的中断屏蔽触发器 MASK 未被屏蔽且设备工作已结束/就绪),INTR 线向 CPU 发出请求
2中断判优排队器(中断判优逻辑)多个请求同时到达时,硬件排队电路按优先级选出最高者;故障类 > DMA(通常最高)> 高速外设 > 慢速外设(打印最低)
3中断响应CPU(硬件)条件:一条指令执行完毕(响应时间是重要考点,见 3.3)且未被更高优先级屏蔽。CPU 内部自动完成"中断隐指令"(见 3.4):关中断、保存断点、引出服务程序入口
4中断处理(执行服务程序)CPU(软件)保护现场(压栈保存通用寄存器等)→ 设备服务(从 DBR 读走字符)→ 恢复现场;期间可开中断允许多重中断
5中断返回CPU(软件+硬件)执行中断返回指令(如 IRET),从栈中弹出断点(和程序状态字)装入 PC(和 PSW),回到第 k+1k+1 条指令继续

时间线(待动画化):

原程序:  [指令k][指令k+1] ......(暂停)...... [指令k+1执行]...
判优:           ↑ 请求→判优→响应(指令边界)
服务:           [隐指令][保护现场][设备服务][恢复现场][IRET]

3.3 中断响应条件与响应时间

响应条件(同时满足):

  1. 有中断请求(INTR = 1)且该请求未被屏蔽
  2. CPU 允许中断(EINT/IF 标志位为开,"关中断"状态下不响应)
  3. 一条指令已执行完毕(通常在指令周期结束前统一采样中断请求线)

响应时间:指令执行结束时(指令边界),而不是指令执行中间。这是选择题高频点:响应检测通常安排在每个机器周期结束或指令周期结束(教材口径:一条指令执行周期结束时刻检查)。例外:异常(如缺页)在指令执行中产生,立即响应。

3.4 中断隐指令:硬件自动做的三件事(必背)

CPU 响应中断后,不是程序员写的指令,而是由硬件自动完成的"中断隐指令",恰好三件事:

  1. 关中断(置 IF = 0):保证接下来保存断点、现场的过程不被新中断打断
  2. 保存断点:将 PC(下一条指令地址)压入堆栈或存入指定单元
  3. 引出中断服务程序入口地址:由向量地址查中断向量表(硬件向量法),或转入固定查询入口(软件查询法)

常见坑:保存通用寄存器(现场)是服务程序(软件)干的,保存断点(PC)是隐指令(硬件)干的——两者主体最容易混。程序状态字 PSW 的保存:有的机器在隐指令中完成,408 选择题通常按"硬件自动保存断点(及程序状态字)"口径,注意题干限定。

3.5 中断服务程序流程

入口 → [保护现场:压栈保存通用寄存器]
     → [设置屏蔽字:装入本服务程序的中断屏蔽字]
     → [开中断:允许更高级中断嵌套](若采用多重中断)
     → [设备服务:执行具体 I/O 传送]
     → [关中断]
     → [恢复屏蔽字、恢复现场:出栈]
     → [开中断、中断返回 IRET]

单重中断(不允许嵌套)时省去中间的屏蔽字设置与开中断步骤。

3.6 多重中断与中断屏蔽字(大题核心)

多重中断(中断嵌套):执行中断服务程序时,又出现新的更高优先级请求,CPU 暂停当前服务程序转去处理新中断。

优先级包含两层,必须分开(大题第一坑):

  • 响应优先级:由硬件排队器固定,决定多个请求同时到达时先响应谁——不可更改
  • 处理优先级:由中断屏蔽字决定——可通过设置屏蔽字动态改变。屏蔽字是服务程序开头的"软件优先级"

屏蔽字设置规则(必背):

  1. 每个中断源对应屏蔽字中的一个二进制位,1 表示屏蔽该中断源,0 表示开放(408 通行口径,以题干说明为准)
  2. 对应自身的位必为 1(服务程序要屏蔽自己,防同级嵌套)
  3. 若要中断源 A 允许被 B 打断,则 A 的屏蔽字中 B 对应位为 0;否则为 1
  4. 屏蔽字中 1 越多,处理优先级越高(屏蔽的人越多,自己越不容易被打断,处理级别越高)

例题(模拟题,屏蔽字设计与次序推演) 某机 4 个中断源 A、B、C、D,响应优先级 A > B > C > D。现要求处理次序改为 A > D > C > B(即 D 的处理优先级升到第二)。写出各服务程序的屏蔽字(从左到右依次为屏蔽 A、B、C、D 的位,1 为屏蔽),并推演:CPU 执行主程序时 B、D 同时发出请求,随后 C、A 再依次(间隔足够长)发出请求,给出实际处理次序。

解析: 屏蔽字设计规则逐位应用:放行处理优先级高于自己的源(位 0),屏蔽自己与低于自己的源(位 1)。逐行推导(位序 A,B,C,D):

服务程序屏 A屏 B屏 C屏 D屏蔽字依据
A11111111A 处理优先级最高,屏蔽所有源(含自己)
D01110111只放行 A;屏蔽 B、C 与自己
C01100110放行 A、D;屏蔽 B 与自己
B00010001B 处理优先级最低,只屏蔽自己

以 C 行演示逐位核对方法:位 A——A 高于 C,放行 0;位 B——B 低于 C,屏蔽 1;位 C(自己)——必为 1;位 D——D 高于 C,放行 0。

最终答案:A = 1111,D = 0111,C = 0110,B = 0001。

次序推演(事件序列):

  1. 主程序中 B、D 同时请求:响应优先级 B > D,先响应 B,执行 B 的服务程序(屏蔽字 0001,除自身外全部放行)
  2. D 立即(B 已开中断后)打断 B(D 处理优先级高于 B)→ 执行 D 服务程序
  3. C 到达:C 处理优先级低于 D(D 的屏蔽字屏蔽 C),D 执行完,回到 B 服务程序前,C 可打断 B(C 高于 B)→ 执行 C 服务程序
  4. A 到达:A 最高,打断当前任何程序 → 执行 A 服务程序,完毕返回
  5. 最终完成顺序:A → D → C → B;返回主程序

注意推演细节:C 到达时若 D 正在服务且 D 屏蔽 C,则 C 挂起等待;"打断与否看正在执行的服务程序的屏蔽字",这是推演的唯一依据。

3.7 中断方式小结

  • CPU 与外设并行工作:CPU 启动设备后继续执行原程序,设备就绪才打扰 CPU
  • 数据传送仍由服务程序(软件)经 CPU 完成,每传一个数据打断一次
  • 缺点:慢速字符设备频繁中断仍耗大量 CPU 时间;批量高速传送不划算 → 引出 DMA

例题(模拟题) 下列事件中,由中断隐指令(硬件)自动完成的是( )。 A. 保护通用寄存器内容 B. 关中断与保存断点 C. 从数据缓冲寄存器读走数据 D. 恢复现场并返回断点

解析:隐指令三件事 = 关中断、保存断点、引出服务程序入口,选 B。A、C、D 均为服务程序(软件)职责。

四、DMA 方式

4.1 基本思想

DMA(直接存储器存取):主存与外设之间开辟直接数据通路,数据传送完全由 DMA 控制器(DMAC)硬件完成,CPU 不执行传送程序——仅在传送前(初始化)与后(结束处理)介入。

4.2 DMA 控制器组成

CPU 与 DMA 都可能访问主存 → 存在主存使用权冲突,由 CPU 与 DMAC 之间的请求—授权(HRQ/HLDA,类似总线仲裁)协调,三种协调方案即 4.4 的三种传输方式。

4.3 DMA 传送三阶段(必背)

  1. 预处理(初始化):CPU 执行程序向 DMAC 写入:主存首地址 → AR、传送字数 → WC、传输方向与启动命令。然后 CPU 继续原工作,传送期间 CPU 完全不介入数据通路
  2. 数据传送:DMAC 硬件循环完成"申请总线 → 访问主存 ↔ 外设传送 → 地址 +1、字数 −1",直至 WC 计数到 0
  3. 后处理:WC 溢出 → DMAC 的中断机构向 CPU 发中断请求,CPU 在服务程序中校验数据、决定是否继续传送。DMA 的结束靠中断通知(高频考点)

4.4 三种传输方式(对比 + 时间线)

(1)停止 CPU 访存(成组/猝发传送)

DMA 传送时 CPU 脱离总线(停止访存),整块数据传完才归还。控制简单但 CPU 在整块传送期间完全不能访存(若 CPU 无 Cache 且程序不访存则这段时间被白白浪费)。适合 CPU 事务与 DMA 交替的批处理场景。

(2)周期挪用(周期窃取,最常用)

DMA 需要传送时挪用一个存储周期访存,传一个字立即归还总线:

  • CPU 此时未访存:不冲突,直接挪用
  • CPU 正在访存:DMA 等待当前周期结束再挪用(CPU 优先)
  • CPU 与 DMA 同时申请:CPU 优先,DMA 等待(保证 CPU 不停顿,DMA 每字等待时间有限)

特点:兼顾两者、实现稍复杂,是实际最常用的方式。

(3)交替访存(透明 DMA)

将一个存储周期均分给 CPU 与 DMA(如前半周期 CPU 访存、后半周期 DMA 访存),二者永不冲突、无需申请归还,对 CPU 完全透明。代价:存储周期逻辑复杂、且当 DMA 空闲时其时间片浪费。适合 CPU 工作周期比访存周期长的场景。

时间线示意(待动画化):

停止CPU访存: CPU[---停---停---停---停---]     DMA[■■■■■■■■整块占用]
周期挪用:     CPU[访][访][等][访][等][访]     DMA[  ][  ][挪][  ][挪][  ](冲突时DMA让CPU)
交替访存:     CPU[C-][C-][C-][C-][C-]        DMA[-D][-D][-D][-D][-D](同一存储周期两半分用)
对比项停止 CPU 访存周期挪用交替访存
总线控制权DMA 整块独占按字借用,冲突时 CPU 优先时间片固定划分,无冲突
CPU 影响传送期间完全停止访存每字最多让出一个周期无影响(透明)
控制复杂度最简单较复杂复杂(周期分时逻辑)
效率低(CPU 空等)高,实际最常用高但浪费空闲 DMA 片
适用猝发大批量传送一般场景CPU 周期长于存储周期

4.5 DMA 与中断方式对比(必背表)

对比项程序中断DMA
数据通路经 CPU(接口 ↔ CPU ↔ 主存)主存与外设直接通路,不经过 CPU
传送控制者CPU 执行中断服务程序(软件)DMAC 硬件
CPU 介入时机每传一个数据中断一次仅传送前初始化与传送结束(结束仍用中断通知)
响应时间一条指令执行结束(指令边界)一个存储周期/总线周期结束即可响应(更及时)
异常处理能力能处理复杂事件仅数据传送,异常仍靠中断
适用慢速/中速字符设备、随机事件高速、大批量数据(磁盘、网卡、显卡)
优先级DMA 请求优先级高于中断请求(数据不及时会丢失)同左

例题(模拟题) 关于 DMA 与程序中断,下列说法错误的是( )。 A. DMA 结束时的后处理通常由中断服务程序完成 B. DMA 请求的响应时机是一个存储周期(或总线周期)结束,比中断响应更及时 C. DMA 方式下每个数据的传送都需要 CPU 执行一段服务程序 D. 高速磁盘适合 DMA,键盘适合程序中断

解析:C 错误——DMA 传送由 DMAC 硬件完成,CPU 只管头尾,这正是与中断方式的本质区别。

五、通道方式(按大纲了解)

通道是能执行通道程序的 I/O 处理部件(可视为"专职 I/O 的简化处理器")。CPU 执行 I/O 指令启动通道后,通道独立执行内存中的通道程序控制设备传送,结束后向 CPU 发中断。四级 I/O 过程:CPU → 通道 → 设备控制器 → 设备。

通道分类(了解):字节多路通道(分时服务多台低速设备)、数组选择通道(独占、高速成组,利用率低)、数组多路通道(结合前两者:成组 + 分时复用多台高速设备)。

CPU 介入程度阶梯(全章总纲):程序查询(全程)> 程序中断(每数据)> DMA(每批头尾)> 通道(每任务头尾)。

常见坑

  1. 响应优先级 vs 处理优先级:排队器定响应次序(硬件固定),屏蔽字定处理次序(软件可改)——大题问"改变处理次序"必然通过屏蔽字实现,别答"改排队器"。
  2. 屏蔽字 1/0 含义与自身位:1 = 屏蔽(通行口径,题干说明为准);对角线(自身位)必为 1;检查屏蔽字设计是否正确,先看对角线。
  3. 隐指令 vs 服务程序职责划分:关中断、保存断点、送入口 = 硬件(隐指令);保护现场(通用寄存器)、设备服务、恢复现场、IRET = 软件(服务程序)。
  4. 中断响应时间:指令执行结束才响应(外中断);DMA 响应则是存储/总线周期结束——两者时间尺度不同,常放一起考。
  5. DMA 不是完全不用中断:结束处理仍靠中断;说"DMA 方式下 CPU 与外设并行、无中断参与"是典型错误选项。
  6. 周期挪用的冲突规则:CPU 优先,DMA 让路;不是"DMA 优先"。
  7. 统一编址与独立编址记反:统一编址无专用 I/O 指令、占内存空间;独立编址有 IN/OUT、不占内存空间。

自测

1.(选择)统一编址方式下,CPU 访问 I/O 端口使用的指令和信号是( )。 A. 专用 IN/OUT 指令 B. 访存指令,无需专门的访端口控制信号 C. 访存指令,需专门的访端口控制信号 D. 中断指令 2.(选择)下列属于中断隐指令完成的是( )。 A. 保护现场 B. 恢复现场 C. 关中断 D. 执行设备服务 3.(设计)3 个中断源 L1、L2、L3,响应优先级 L1 > L2 > L3。要求处理次序改为 L2 > L3 > L1,写出屏蔽字(从左到右 L1、L2、L3,1 为屏蔽)。 4.(选择)周期挪用方式中,DMA 与 CPU 同时申请访存时,优先权通常给( )。 A. DMA B. CPU C. 先到者 D. 随机 5.(计算)某设备 DMA 传送每挪用一个存储周期传 4 B,每秒需传 2 MB 数据,主存存储周期 100 ns。DMA 传送占用主存时间比例约为多少?

自测答案

  1. B。统一编址下端口就是主存地址,普通访存指令即可,靠地址范围区分,无需专门控制信号。
  2. C。隐指令三件事:关中断、保存断点、引出服务程序入口。
  3. 按处理次序 L2 > L3 > L1,每个源屏蔽"自己 + 处理优先级低于自己的所有源":L2 屏蔽 L1 与自己 → 110;L3 屏蔽 L1 与自己 → 101;L1 只屏蔽自己 → 001。即(位序 L1,L2,L3):L1 = 001,L2 = 110,L3 = 101。
  4. B。CPU 优先,DMA 等待——保证 CPU 不停顿。
  5. 每秒挪用 2 MB4 B=524288≈5.24×105\frac{2\text{ MB}}{4\text{ B}} = 524288 \approx 5.24 \times 10^5 个周期,占用时间 5.24×105×100 ns≈52.4 ms5.24\times10^5 \times 100\text{ ns} \approx 52.4\text{ ms},比例约 5.2%。