I/O 控制与可靠性专题 I/O & Reliability · 中断 DMA 通道 · 串并联

软考 · 软件设计师 | 硬件 6 分里最后的洞| 希赛累计:I/O 控制 11(本模块最高)、可靠性 3、总线 2
CPU / 浮点 / Cache / 流水线 / 校验已经有页。本页只补那三块。2024 上 Q9 原卷是图,本页按选项 D 画等价示意图。
⏱ 考前 10 分钟速览
① 四种 I/O:程序查询 CPU 空转死等;中断 CPU 干别的,设备好了再喊;DMA 成块搬、CPU 只管开头结尾;通道 = 专职 I/O 处理器,比 DMA 更独立。
② 中断向量 = 中断服务程序的入口地址(不是断点、不是设备地址)。
③ CPU 介入从多到少:查询 > 中断 > DMA > 通道。速度反过来:通道 / DMA 最快。
④ 系统总线连 CPU、主存、外设。片内总线才连运算器/寄存器。
⑤ 串联 R=R1×R2(一个挂全挂)。并联 R=1−(1−R1)(1−R2)(都挂才挂)。混联:先算并联块,再当一个元件去串。
⑥ 千小时可靠度:N 台跑 T 小时坏了 k 台 → 失效率 λ=k/(N×T),千小时 R=1−1000λ。或 1000 小时里坏的比例直接 1−k/N(T 刚好 1000 时)。
目录: ⚡ 对照 · ① 四种 I/O · ② 中断 · ③ DMA / 通道 · ④ 总线 · ⑤ 可靠性 · 真题 · 速记

⚡ 今早先看

看见题干闭眼选
CPU 不断查设备好了没有程序查询,效率低
中断向量提供什么中断服务程序的入口地址
CPU 只在传送开始和结束插手,中间成块搬DMA
DMA 传送期间谁管总线DMA 控制器,CPU 放弃总线
比 DMA 更独立、本身是处理器通道 / IOP
系统总线用来连接主存和外设部件(以及 CPU)
两个部件都好系统才好串联,R=R1×R2
两个备份,一个活着就行并联,R=1−(1−R1)(1−R2)
中间两个并联、两头各一个串联R × (1−(1−R)²) × R

① 四种传送方式 谁干活、CPU 管多宽

外设和内存搬数据,CPU 可以管得很多,也可以几乎不管。四种方式就是「CPU 放手到什么程度」。

程序查询中断DMA通道 / IOP
谁搬数据CPU 指令一条条搬还是 CPU,但等设备喊才搬DMA 硬件成块搬通道处理器执行通道程序
CPU 在干什么死循环问「好了没」可以干别的;被打断后去跑服务程序只在启动和结束过问;中间把总线让出去几乎不管 I/O
适合很慢、很少的设备键盘、慢速字符设备磁盘等成块高速大型机、很多设备
效率最低中高最高

程序查询还有个亲戚叫无条件传送:假定设备永远准备好,连问都不问。卷面少见。

🎯 CPU 介入从多到少:查询 > 中断 > DMA > 通道。速度反过来。看见「成块、不需要 CPU 干涉、只在开始和结束」闭眼 DMA。

② 中断

设备准备好 → 发中断请求 → CPU 做完当前指令 → 保存现场(把 PC 等推进栈)→ 转入中断服务程序 → 搬完数据 → 恢复现场接着跑原来的程序。

词是什么不是什么
中断向量服务程序的入口地址(或用来形成入口地址)不是设备地址,不是主程序断点,不是数据起始地址
中断向量表一张表,中断号 → 入口地址—
断点被打断时下一条指令的地址(在 PC 里,要保存)不是向量本身
中断嵌套正在服务时来了更高优先级,先去伺候更急的同级或更低的要等

多个中断源怎么认是谁:多根线、软件轮询、菊花链、总线仲裁、中断向量表(最常考)。

练一练 · 2023上 · 中断向量

2023上 中断向量
中断向量提供的是( )。
A. 中断源的设备地址
B. 中断服务程序的入口地址
C. 传递数据的起始地址
D. 主程序的断点地址
答案 B 向量表里存的就是「去哪执行服务程序」。断点是 PC 保存的现场,不是向量提供的。

③ DMA 和通道

DMA:内存 ↔ 外设成块直接搬。

步发生什么
1外设向 DMAC 请求
2DMAC 向 CPU 发 HOLD(请把总线让给我)
3CPU 结束当前总线周期,回 HLDA,输出脚改高阻 = 放弃总线
4~5DMAC 管总线,自己发地址和控制信号,把这一块数据搬完
6搬完撤 HOLD,CPU 拿回总线接着干活

DMA 期间 CPU 不能用总线(可以用缓存里已经有的东西做点运算,但访存不行)。

通道是带专用指令的 I/O 处理器(IOP)。CPU 只要丢给它一条通道程序,后面的排队、启动设备、收尾它自己干。比 DMA 更放手。

🎯 中断:CPU 还是搬运工,只是不用空等。DMA:搬运工换成硬件,CPU 当监工(开工、收工)。通道:请了专职物流公司。

三个对照常考:

CPU 和外设能不能同时干活谁搬数据搬完怎么喊 CPU
程序查询不能,CPU 空转死等CPU 指令不用喊,自己在轮询
中断能。CPU 干别的,设备好了再打断仍是 CPU 在服务程序里搬设备发中断请求
DMA能。搬的过程 CPU 不用插手DMA 控制器整块搬完再发中断收工

中断是外部来的(设备、DMA 收工、键盘)。异常 / 内部中断是指令自己惹的:除零、缺页、非法指令。别把除零当成外设中断。

DMA 占总线的三种教材说法:停 CPU、总线周期分时、总线周期挪用(周期窃取)。卷面问「DMA 传送时谁管总线」→ DMA 控制器;CPU 当前总线周期结束才让出。

练一练 · 中断 / DMA 并行(历年原话高频)

2021下附近 · 高频原话 三种方式对照
以下关于程序查询方式、中断方式和 DMA 方式的叙述中,正确的是( )。
A. 程序查询方式下,CPU 与外设可以并行工作
B. 中断方式下,CPU 与外设可以并行工作
C. DMA 方式下,每传送一个数据都要打断 CPU
D. 中断方式下,数据传送不需要 CPU 执行程序
答案 B 查询在死等,A 错。中断:CPU 干别的,设备喊了才进来,所以能并行;但搬数据仍要跑服务程序,D 错。DMA 是成块搬,不是每个字节都打断 CPU,C 把 DMA 说成中断了。DMA 其实也能并行,但这题四个选项里只有 B 全对。

练一练 · 中断还是异常

2022上附近 · 高频 中断 ≠ 异常
下列事件中,属于异常(内部中断)而不是外设中断的是( )。
A. 打印机缺纸
B. 键盘有键按下
C. 除数为 0
D. DMA 传送结束
答案 C A、B、D 都是外部设备来喊 CPU。除零是正在跑的指令自己惹的祸,走异常 / 内部中断入口。DMA 收工用的就是一次普通中断。

④ 总线(2 分)

总线连接谁
系统总线CPU、主存、I/O 接口 / 外设
片内总线运算器、控制器、寄存器(芯片里面)
通信 / 外部总线接口和外设、或设备之间

练一练 · 2023上 · 系统总线

2023上 总线
计算机中,系统总线用于( )连接。
A. 接口和外设
B. 运算器、控制器和寄存器
C. 主存和外设部件
D. DMA 控制器和中断控制器
答案 C 系统总线挂主机各大部件。B 是片内总线。A、D 更像外部/专用连接。

⑤ 可靠性(串并联)

可靠度 R = 规定时间内还不坏的概率。失效率 λ 很小且恒定时,短时间 R ≈ 1 − λt。

结构公式人话
串联R = R1 × R2 × …一条绳上的蚂蚱,一个断全断。越多越脆
并联R = 1 − (1−R1)(1−R2)…备份,全部挂才挂。两个相同:1−(1−R)²
混联先把并联块收成一个数,再当元件去串从里往外收

N 台设备跑 T 小时,坏了 k 台:λ = k / (N×T)。千小时可靠度 = 1 − 1000λ。若 T 正好 1000,就是 1 − k/N。

练一练 · 2024上 · Q9(原卷有图)

2024上 Q9 混联
某系统由下图所示的冗余部件构成。若每个部件的千小时可靠度都为 R,则该系统的千小时可靠度为(9)。(原卷为框图。空白卷没有图。选项 D 对应「两头各一个串联、中间两个并联」。本页等价示意图,不是原卷截图:)
R R R R
A. (1−(1−R)²)(1−R)
B. (1−R)² (1−R²)
C. R(1−R²)R
D. R(1−(1−R)²)R
答案 D 中间并联:1−(1−R)²。再和前后两个 R 串联:R × [1−(1−R)²] × R。C 把并联写成了 1−R²,那是另一回事。

练一练 · 2022下 · 千小时可靠度

2022下 失效率
某种部件用在 2000 台计算机系统中,运行工作 1000 小时后,其中有 4 台计算机的这种部件失效,则该部件的千小时可靠度 R 为( )。
A. 0.990 B. 0.992 C. 0.996 D. 0.998
答案 D 正好跑了 1000 小时,2000 台坏 4 台 → 千小时失效比例 4/2000=0.002,R=0.998。或 λ=4/(2000×1000)=2×10⁻⁶,1−1000λ=0.998。

真题索引

2021下 中断可并行 · 2022上 除零是异常 · 2022下 千小时 R · 2023上 中断向量 · 2023上 系统总线 · 2024上 Q9 混联

2024 上 Q9 原卷是图。空白卷没有框图,本页按选项 D 的标准串并混联画等价示意图。CPU / 浮点 / Cache / 流水线 / 校验见其它专题,本页不重复。
本专题速记总收
① 查询死等;中断被喊再搬;DMA 成块、CPU 只开头结尾;通道是 I/O 处理器。
② 中断向量 = 服务程序入口地址。嵌套只让更高优先级打断。
③ DMA:HOLD 要总线,HLDA 让出,搬完还回去。
④ 系统总线连主存和外设。片内才连运算器寄存器。
⑤ 串联相乘;并联 1−Π(1−Ri)。千小时 R=1−k/N(跑满 1000 小时时)。