Skip to content

I/O 与 CPU 占用率:数 CPU 被这台外设拉走了多少拍(专题总纲)

Intro

这一类题的题面给的东西很有规律:一个主频、一个 CPI、一个外设数据传输率,再加一个「每次要花多少条指令 / 多少个时钟周期」。然后问一句话——

CPU 用于该外设 I/O 的时间占整个 CPU 时间的百分比是多少?

这是 2009 年那道两小问的原话。2018 年那道换了个说法——「CPU 用于设备 A 输入/输出的时间占 CPU 总时间的百分比至少是多少?」——问的是同一个量。2016 年那道换了记法,问的是绝对的时钟周期数;2022 年那道不问时间,改数总线请求次数。但它们背后是同一件事:

数 CPU 被这台外设拉走了多少拍。

而这个数永远等于两个因子相乘:

CPU 用于该外设的周期数=N一秒被拉走几次×C每次拉走几拍占比=N×Cf(f=主频,即 CPU 一秒能提供多少拍)

程序查询、中断、DMA 是同一个问题的三档答案——搬这批数据时 CPU 参与多少。算法从头到尾不变,换的只有 NC 这两个因子怎么填。

三档只改两个因子

方式N:一秒被拉走几次C:每次几拍
程序查询1 s÷ 设备准备一个传输单位的时间查询程序的指令数 × CPI
中断数据传输率 ÷ 传输单位;题面若给的是设备准备时间,则同上一行题面直接给周期数就用它(2018、2016 都是这样),只给指令数才乘 CPI
DMA数据传输率 ÷ 块大小预处理 + 后处理的周期数

C 那一列越往下越大,N 那一列越往下越小,而 N 掉得比 C 涨得快——这就是三档的全部差别。2009 年那道把这一点摆得最清楚:中断按 4 B 一次算,DMA 按 5000 B 一块算,颗粒度差 1250 倍。

N 的来源有一处结构差异,值得单独记。 中断和 DMA 的 N 是设备主动来叫的次数,由数据量除以颗粒度定;程序查询的 N 却是由「不能丢数据」这个约束反推出来的——CPU 主动去看,看得不够勤就会漏掉一个数据,所以查询间隔的上界等于设备准备一个传输单位的时间,N 取这个上界的倒数。2018 年那道第 (1) 问问的正是「最多间隔多长时间查询一次」,这个「最多」就是这么来的。

DMA 的 C 里没有搬运

这是这个专题最贵的一分。在题面声明「DMA 与 CPU 无访存冲突」(或按交替访问方式)时,DMA 的 C 只有预处理加后处理,整块搬运一拍都不算。 换成周期窃取或停止 CPU 就不成立了——那两种方式下搬运本身要占 CPU 的拍,巩固栏第一道就是算这个的。 这个前提是否写在题面上,逐年不同:

  • 2009 年那道写「假设 DMA 与 CPU 之间没有访存冲突」,块大小 5000 B;
  • 2018 年那道第 (3) 问没有这句声明,只给了「CPU 用于 DMA 预处理和后处理的总时钟周期数为 500」和块大小 1000 B,按统考通行做法默认无冲突。

把 5000 或 1000 乘进 C 里,算出来的就是程序查询方式下的数了。

分母不一定是主频

f 这个分母只在题目问「百分比」时才出现。2016 年那道问的是「多少个时钟周期」,分子算完就是答案,不要再除一次。 而且它同一道题里给了两个时间,下一节单说。

边界必错点

2016 年那道有两个时间,差着两个量级。 题面连着问「完成这一任务所需时间大约是多少个时钟周期?CPU 用于完成这一任务的时间大约是多少个时钟周期?」——

  • 任务总时间含 CPU 等设备 D 备好一个字符的 2.5×104 拍,一个字符 25 070 拍,1000 个字符是 2.507×107
  • CPU 用于该任务的时间只有中断响应 10 拍加服务程序 80 拍,一个字符 90 拍,1000 个字符是 9×104

两个数相差近 280 倍,写反就整问归零。等设备的那段时间 CPU 并没有闲着,它在跑别的程序,所以不进 CPU 占用。

同一道题里,C 在两种算法下取的指令段还不一样。 还是 2016 年那道:中断服务程序共 20 条指令,第 15 条启动设备 D 工作。

  • 任务总时间只算到第 15 条为止(15×4=60 拍)——第 15 条一执行,D 就开始备下一个字符了,后 5 条与它重叠;
  • CPU 占用时间要把 20 条算满(20×4=80 拍)——重叠归重叠,这 5 条 CPU 是真的在跑。

15 和 20 这两个数在同一道题里都要用到,各用在各的地方。

问「能不能」的时候不要去算占比。 2018 年那道第 (2) 问是「设备 B 能否采用中断 I/O 方式?为什么?」——做法是拿 C 和设备产出一个传输单位的周期比大小:一次中断 400×2 ns=0.8 μs,设备 B 备好 4 B 只要 4 B÷40 MB/s=0.1 μs结论必须落到「上一个数据还没读走,下一个就把缓冲寄存器覆盖了,会丢数据」。 只写「占用率太高」拿不到这一分——中断方式在这里失效的原因是物理上做不到,占用率高低是另一码事。

2018 年那道第 (1) 问的方向别写反。 「最多间隔多长时间查询一次」求的是上界 2 μs,查询间隔不能超过它;写成「最少间隔 2 μs」意思就反了。

2022 年那道数的是次数,而且单位要先统一。 「磁盘控制器中的数据缓冲区大小为 64 位,则在一个扇区读写过程中,DMA 控制器向 CPU 发送了多少次总线请求?」——缓冲区给的是,扇区容量 512 是字节

512 B×8 bit/B64 bit=409664=64 

不换单位会算成 8 次。

一道题的答卷长什么样

以 2018 年那道为例——它把三档在一道题里摆齐了。中间量要一个不落地写在卷面上——这类题的分是按推导步骤给的,跳步直接写结果,中间那几步的分就没了。(408 官方不公布小问级细则,本文引的分值摊法是本站按同一标准拟的,只作对照。)

先把三小问共用的分母写在最上面

T_clk = 1 / 500 MHz = 2 ns
CPU 每秒提供 5×10⁸ 个时钟周期        ← 后面三问都除它

(1) 设备 A · 定时查询

设备 A 备好 32 位(4 B):4 B / 2 MB/s = 2 μs
  → 查询间隔最多 2 μs(超过就丢数据)
N = 1 s / 2 μs = 5×10⁵ 次/s
C = 10 条 × CPI 4 = 40 个时钟周期
占比 = 5×10⁵ × 40 / 5×10⁸ = 2×10⁷ / 5×10⁸ = 4%

(2) 设备 B · 中断能不能用

一次中断      C = 400 × 2 ns = 0.8 μs
设备 B 备好 4 B  = 4 B / 40 MB/s = 0.1 μs
0.8 μs > 0.1 μs
  → CPU 还没处理完上一个,下一个数据就把缓冲寄存器覆盖了 → 丢数据
  → 设备 B 不能采用中断方式

(3) 设备 B · DMA

N = 40 MB/s / 1000 B = 4×10⁴ 次/s
C = 500 个时钟周期        ← 只有预处理 + 后处理,1000 B 的搬运不占 CPU
占比 = 4×10⁴ × 500 / 5×10⁸ = 2×10⁷ / 5×10⁸ = 4%

⚠️ 第 (1) 问和第 (3) 问算出来都是 4%,这是这道题的巧合。同样 4% 底下服务的数据量差 20 倍:设备 A 是 2 MB/s,设备 B 是 40 MB/s。写完回头看见两个 4% 别慌着改。

第二组的卷面:同一段过程,两个分子

2016 年那道的第 (2) 问 9 分,是本专题最大的一个小问。它把「设备忙了多久」和 「CPU 为它忙了多久」摆在同一段过程上分别问,两个数差了两个数量级——分母都不除,直接要拍数

先把时钟周期折出来

时钟周期 = 1 / 50 MHz = 20 ns
设备准备一个字符 0.5 ms = 0.5 ms / 20 ns = 2.5 × 10⁴ 拍

分子一:一个字符从开始到送完,整段占了多少拍(含 CPU 在等的时间)

2.5 × 10⁴(等设备准备)
+ 10        (中断响应)
+ 15 × 4    (服务程序前 15 条指令,CPI = 4,第 15 条启动 D)
= 25070 拍
1000 个字符 ≈ 1000 × 25070 = 2.507 × 10⁷ 拍

⚠️ 后 5 条指令不计入——它们与下一个字符的准备时间重叠,题面把这个重叠写在了指令序列里。

分子二:这段过程里 CPU 真正为它花了多少拍(等设备的时间不算)

1000 × (10 + 20 × 4) = 9 × 10⁴ 拍

两个数相差约 280 倍,而这 280 倍正是中断方式的意义所在:CPU 只在那 90 拍里被占住, 其余 2.5 万拍它可以去跑别的

最后一小问问的是操作而不是数:中断响应阶段 CPU 做四件事——关中断、保护断点、 保护 PSW、识别中断源。这一档 2 分,答成「保护现场」笼统一句拿不满

真题的三种形态

第一组 · 三档换算(2009-43、2018-43)——给主频、CPI、数据传输率和每次的开销,问占 CPU 总时间的百分比。两道题骨架完全一样:算分母、填 N、填 C、相除。2018 年那道把查询、中断、DMA 三档一次摆齐,2009 年那道摆了中断和 DMA 两档。

第二组 · 同一个分子,两种问法(2016-44)——不除主频了,直接问周期数,并且要求同时给出「任务总时间」和「CPU 用于该任务的时间」两个数。这一组的功夫全在分清哪些拍算进 CPU 占用。它还多问一句「在中断响应阶段 CPU 进行了哪些操作」——答关中断、保护断点即可。

第三组 · 数次数与判优(2022-44)——不算时间了,改数一个扇区读写里 DMA 要打断总线几次;再问 CPU 和 DMA 同时要总线时谁让谁。

其中两道是拼盘题,外挂的小问独立给分。

  • 2016-44 的第 (1) 问前半是外挂:「每传送一个字符,在异步串行通信线上共需传输多少位」考的是异步串行帧格式(起始 1 + 数据 7 + 校验 1 + 停止 1 = 10 位),属于通信规程,1 分。同一问的后半「每秒钟最多可向 I/O 端口送入多少个字符」(1 s÷0.5 ms=2000)已经是本专题 N 那个因子的原型了,2 分。
  • 2022-44 的第 (1)(2) 问是外挂:CHS 三个地址字段的名称与位数、一个扇区的平均访问时间,属于外存储器那一章,各 2 分共 4 分。只有第 (3) 问的 4 分挂在本专题的骨架上。

外挂的小问单独给分,本专题那部分不熟也不会连累它们,反过来也一样。

交卷前扫一眼

先把主频折成「每秒几拍」放在最上面 · 再填 N(被拉走几次)和 C(每次几拍)· DMA 的 C 里没有搬运 · 问「能不能」就拿 C 和设备产出周期比大小 · 题目问周期数就别除主频

配套内容

大纲这几条的其余打法、这 4 道真题没有正面考过的(前四条在专题的巩固栏里配了题):

  • DMA 三种工作方式在 CPU 占用上的差别——停止 CPU 访存、周期挪用、交替访问三档,2022 年那道题面写了「周期挪用」四个字当前提,另外三道的题干里这三个名字一个都没出现;三种方式各占多少、为什么分这三档,没让算过
  • 多个 DMA 设备之间的总线优先级仲裁(⚠️ 总线仲裁在 2026 大纲里查无此项,属大纲外的延伸)——2022 年那道只问了 DMA 和 CPU 二选一;两台 DMA 设备同时申请总线谁先上、依据什么,没考过
  • 中断向量地址怎么算、断点入栈之后栈里是什么——2016 年那道问到「在中断响应阶段 CPU 进行了哪些操作」就停了,答关中断、保护断点就给分;向量表基址加类型号乘表项长度这一步,以及 PC 和 PSW 压栈后 SP 变成多少,没往下问
  • 多重中断与中断屏蔽字——四道真题的题干里一次都没出现「屏蔽」或「嵌套」;2016 年那道停在中断响应阶段,而多重中断要在保护现场之后再开中断——这一步以及屏蔽字怎么设,没考过
  • I/O 端口的编址方式——统一编址还是独立编址、各自用什么指令访问,大纲要求;2016 年那道题干里出现了「I/O 端口」,但只当作字符的落脚点,没问过它怎么编址
  • I/O 通道方式(⚠️ 通道已移出大纲,I/O 控制方式只剩程序查询、程序中断、DMA 三种;这里保留一句是为了让你知道见到它可以跳过)
  • SSD 的组成与磨损均衡——2022 年那道考的是机械磁盘的 CHS 与平均访问时间,固态盘没出现过

逐题精讲(建设中)——真题作答与 AI 判分入口见站内大题专题

真题练习