I/O 控制方式

这一节在目录里带 *,但它是全章的主干:7.3 的三个三级节就是这一节前三种方式的展开。这里先把四种方式放在同一条演化线上看清楚,7.3 再逐个拆开。

演化的动力只有一句话:把「等待」和「搬运」这两件苦差事,一步步从 CPU 身上剥离。

flowchart TD
    Q["程序查询<br/>CPU 既等又搬"] -->|"把「等」拿走"| I["程序中断<br/>CPU 不等了,仍要搬"]
    I -->|"把「搬」也拿走"| D["DMA<br/>CPU 只做首尾"]
    D -->|"把「组织一串操作」也拿走"| C["通道 / 外围处理机<br/>CPU 只下达一次任务"]

    classDef s1 fill:#ffcdd2,stroke:#b71c1c
    classDef s2 fill:#ffe0b2,stroke:#e65100
    classDef s3 fill:#c8e6c9,stroke:#1b5e20
    classDef s4 fill:#bbdefb,stroke:#0d47a1
    class Q s1
    class I s2
    class D s3
    class C s4

每一步的代价都是硬件变复杂。 这与全书反复出现的取舍一致:功能往硬件里搬,速度上去了,成本和复杂度也上去了——5.4.2 硬布线与5.4.3 微程序之争、CISC 与 RISC之争,都是同一个取舍的不同外衣。

机制

四种方式的完整对照

这张表是本章的骨架,每一列都是一个独立的考点。

程序查询程序中断DMA通道
CPU 是否忙等是否否否
数据由谁搬CPU 指令CPU 指令(在中断服务程序里)DMA 控制器通道
数据流路径设备→CPU 寄存器→主存设备→CPU 寄存器→主存设备→主存(不经 CPU 寄存器)设备→主存
CPU 干预频率全程每传一个字(或一小批)一次每传一个数据块一次每传一组数据块一次
传送单位字 / 字节字 / 字节数据块一组数据块
响应时机——一条指令结束后一个总线周期(存取周期)结束后——
并行性无CPU 与设备部分并行CPU 与设备并行并行度最高
硬件成本最低低中高

表里有三行是失分重灾区,逐条说明。

第一,“数据流路径”这一行。 程序中断方式的数据仍然经过 CPU 寄存器——这是它与 DMA 的根本区别,而不是”中断比查询快”。中断解决的是”不用干等”,没有解决”CPU 要亲自搬”。只有 DMA 才在设备与主存之间开了一条不经过 CPU 的通路。

第二,“CPU 干预频率”这一行。 这一列从”全程”到”每字”到”每块”到”每组块”,是一条严格递减的链,也正是上面那张演化图的量化版本。题目问”哪种方式 CPU 干预最少”,答案按这条链走。

第三,“响应时机”这一行。 程序中断必须等一条指令执行完(5.5.1 讲过原因:指令中途的机器状态不完整);而 DMA 请求只需等一个总线周期结束,因为 DMA 不改变 CPU 的执行状态,它只是借走总线。“DMA 的响应比中断更及时”这句话是对的,理由就在这里。

立一条贯穿 7.3 的主线:谁负责「同步」

把上面的表再压缩一层,三种方式其实是在回答同一个问题的三种答案:

CPU 怎么知道设备已经准备好了?

方式谁去发现”好了”类比
程序查询CPU 自己反复去问站在门口每秒敲一次门
程序中断设备主动来通知装个门铃,等它响
DMA设备自己把事办完,最后通知一次让快递员自己进门放好,走时留张条

这个”主动问”与”被动等通知”的二分,在第 6 章刚刚出现过。

关联对照:查询 / 中断 ↔ 同步 / 异步

6.2.2 的判据是「有没有公共时钟」,本节的判据是「谁去发现设备就绪」。两者不是同一件事,但结构完全同形:

硬件层(总线定时)软件层(I/O 控制方式)
发起方按固定节奏主动推进同步定时(按时钟拍数)程序查询(按循环轮询)
等待对方发信号才推进异步定时(等 ACK)程序中断(等中断请求)
共同的代价同步按最慢的从设备定拍数查询按最慢的设备定轮询间隔
共同的收益异步各按各的速度中断各设备按各自的时机来打断

注意不要把两者当成一件事。 一条同步总线上照样可以跑中断方式的 I/O——总线定时管的是一次传送内部的节拍,I/O 控制方式管的是两次传送之间怎么等。层次不同,可以自由组合。

但”要整齐就得按最慢的来”这条代价是共享的——定时查询的周期同样必须按最慢的设备定,否则快设备的数据会被覆盖。这是它在本书里的第七次、也是最后一次出现(5.6.1 流水段按最慢段定、6.2.2 同步总线按最慢从设备定拍数……完整七次见 第 1 章总览)。

通道与外围处理机:只需知道边界

这两种在 408 里是”知道有这么回事”的层次,但有三个点可能出判断题:

  1. 通道是专用的 I/O 处理器,有自己的指令系统(通道指令),CPU 用一条 I/O 指令启动它。
  2. 通道与 DMA 的区别在”能不能组织一串操作”——DMA 一次只管一个数据块的搬运,通道能执行一段通道程序,控制一组设备完成多次传送。
  3. 外围处理机(PPU)更接近一台独立的计算机,通用性比通道更强。

层级关系:DMA < 通道 < 外围处理机,独立性递增。

边界

说法判断理由
”中断方式下数据不经过 CPU”❌仍由 CPU 在服务程序里搬,只有 DMA 不经过
”DMA 方式完全不需要 CPU”❌预处理和后处理都是 CPU 做
”DMA 传送时不产生中断”❌块传完后要中断 CPU做后处理
”中断响应比 DMA 响应更及时”❌反了:中断等指令结束,DMA 等总线周期结束
”查询方式下进程处于阻塞态”❌忙等循环里 CPU 在执行该程序,是运行态
”通道指令由 CPU 执行”❌由通道执行
”程序中断方式提高了数据传输率”⚠️提高的是 CPU 利用率;单次传送的速率没变

对照速查

三个关键词,问一遍就能定位任何一道题:

问查询中断DMA
谁在等CPU设备(CPU 去干别的)设备
谁在搬CPUCPUDMA 控制器
谁是总线主设备CPUCPUDMA 控制器(传送期间)

考点

  • 四种方式的对照表,尤其是”数据流是否经过 CPU 寄存器”和”CPU 干预频率”两行。
  • 中断与 DMA 的响应时机差异:指令结束 vs 总线周期结束。
  • “忙等 ≠ 阻塞”:这是计组与 OS 的口径衔接点,见 OS 5.1.2。
  • 通道与 DMA 的分界:能否组织一串操作。

链接