计算机组成原理模块。计组收尾:前面各章把 CPU、存储器造好了,本模块回答“部件之间怎么连”(总线)与“计算机怎么和外界交换数据”(I/O 方式)。 跨学科热点:I/O 中断与 DMA 是 X-2、X-3 的硬件半边(OS 半边见 OS-0/OS-8)。
核心问题
这一部分为什么存在?
总线(CO-6):CPU、主存、I/O 接口都要交换数据。如果两两拉专线, 个部件要 条线——不可扩展。共享总线用一组公共线路 + “谁来说话”的规则(仲裁与定时)解决连接问题,但共享必然带来新问题:多个主设备同时要用怎么办(仲裁)?收发双方速度不一致怎么对齐(定时)?地址和数据线能复用吗、传一块数据要几拍(带宽计算)?
I/O 系统(CO-7):外设比 CPU 慢 3~6 个数量级且格式千差万别。核心矛盾:CPU 不想等、也不该等。I/O 控制方式的演进就是一部“CPU 甩包袱”的历史:
没有这套机制:CPU 90% 以上的时间耗在等键盘、等磁盘上,前面 Cache、流水线的所有提速全部作废。
概念体系
flowchart TD
A["部件互连:专线 O(n²) 不可扩展"] --> B["共享总线"]
B --> C["争用 → 仲裁<br/>链式 / 计数器 / 独立请求"]
B --> D["速度对齐 → 定时<br/>同步 / 异步"]
B --> E["带宽 = 宽度 × 频率 × 每周期次数<br/>复用与突发优化"]
F["外设慢且杂<br/>CPU 不该陪等"] --> G["程序查询:全程陪等"]
G --> H["程序中断:就绪后打断 CPU<br/>传一个字打扰一次"]
H --> I["DMA:硬件直搬一整块<br/>只在开始和结束打扰 CPU"]
I --> J["通道:I/O 专用处理器<br/>(概念级)"]
核心概念:
| 概念 | 要点 | 易考点 |
|---|---|---|
| 总线带宽 | 宽度(B/周期)× 频率 × 每周期传输次数 | 2009-20(4B/2周期 ×10MHz = 20MB/s);双倍数据率要 ×2(2014-19:32 根 ×66MHz ×2 = 528MB/s) |
| 突发(猝发)传输 | 主设备只给一个首地址,连续传多个数据(2014-20 定义题) | 省掉后续地址节拍:2012-19(地址/数据复用,传 128 位 = 1 地址 + 4 数据 = 5 周期) |
| 地址/数据线复用 | 同一组线分时传地址和数据,省引脚 | 复用时带宽计算要计入地址节拍 |
| 数据线上跑什么 | 指令、数据、地址都可走数据线;握手/应答信号走控制线(2011-20);中断 I/O 下 CPU 与端口交换的不可能是“地址”(2015-21:端口地址由地址线给出) | |
| DMA 请求 vs 中断请求 | DMA 请求的是总线使用权(硬件裁决),中断请求的是 CPU 处理时间(2013-22 A) | 中断响应:一条指令执行完;DMA 响应:一个总线事务结束(2013-22 B) |
| 周期挪用(周期窃取) | DMA 趁 CPU 不访存时挪用一个存储周期传一个字 | 与 CPU 访存冲突时 DMA 优先(2012-43 第 3 问:I/O 数据不及时传会丢失,CPU 可以等) |
实现机制
1. 总线仲裁与定时
- 仲裁(多主设备抢总线):链式查询(结构简单、优先级固定、对故障敏感)→ 计数器定时查询(优先级可编程)→ 独立请求(每设备一对请求/允许线,最快、线最多)。三者是“线数 vs 灵活性 vs 速度”的权衡。
- 定时:同步定时(统一时钟,简单但按最慢设备设计;同步总线时钟频率不一定等于工作频率、提高传输率可靠加宽/倍速/突发,2018-21、2015-19)→ 异步定时(握手应答,快慢兼容但开销大)→ 半同步/分离事务(等待期间释放总线给别人用,提高利用率,2016-21 D)。
- 并行 vs 串行的反转(2016-21 A 陷阱):直觉“并行快”在高频下失效——并行线间串扰与偏移(skew)限制频率,高速串行(差分 + 高频)反而更快(QPI/PCIe/USB 都是串行)。
2. 带宽与事务计算模板
- 2014-19:复用 32 根、66MHz、双沿传输 → 4B × 66M × 2 = 528MB/s。
- 2012-19:复用、突发传 128 位(16B):1 地址 + 4 数据 = 5 周期 × 10ns = 50ns。
- 2013-43 大题:突发事务 = 送首地址命令(1 拍)+ 存储器准备(多拍)+ 连续传 32B/4B = 8 拍;Cache 块 32B 正好一次突发事务。
- 2020-19(QPI):点对点全双工同步串行,带宽 = 每秒次数 × 每次字节 × 双向。
3. 三种 I/O 控制方式全对比
| 维度 | 程序查询 | 程序中断 | DMA |
|---|---|---|---|
| CPU 参与 | 全程轮询(忙等) | 每传一个字中断一次 | 仅预处理 + 后处理 |
| 数据搬运 | 软件 | 软件 | 硬件(DMA 控制器) |
| 打扰时机 | — | 外设就绪 | 一块传完(DMA 结束 = 中断,2016-22) |
| 适用 | 简单低速 | 中低速(字符设备) | 高速块设备(磁盘、网卡) |
| 2013-22 陷阱 | — | 并非“适用所有设备”:高速设备中断太频繁会丢数据 | 需要总线控制权 |
中断方式 CPU 占比计算(2009-43 模板):外设 0.5MB/s、32 位/次 → 每秒中断 次;每次服务 (18+2) 条指令 × CPI 5 / 500MHz = 每条 10ns → 每次 200ns;占比 = 125K × 200ns / 1s = 2.5%。
DMA 方式 CPU 占比(2009-43 第 2 问):5MB/s、块 5000B → 每秒 1000 次 DMA;每次前后处理 500 时钟 = 1μs → 占比 0.1%。对比可知:数据率越高、块越大,DMA 优势越碾压。
DMA 全过程排序(2017-43):CPU 初始化 DMA 控制器并启动磁盘 → DMA 控制器发出总线请求、获权后直接在磁盘接口与主存间搬运(周期挪用)→ 全部传完 → DMA 控制器发出中断请求 → CPU 后处理。注意:DMA 传数据期间 CPU 照常运行(除非争用同一总线)。
4. I/O 接口与端口编址
I/O 接口(控制器)内部有数据缓冲寄存器、状态/控制寄存器,CPU 以“端口”寻址:独立编址(专门 I/O 指令)vs 统一编址(内存映射,访存指令即可)。DMA 传送单位由数据缓冲寄存器宽度决定(2012-43:32 位寄存器、4KB 页 → 每秒 DMA 请求 = 页大小/4B × 每秒缺页数)。
方案比较
中断 vs DMA(本模块第一易混对,2013-22 四选项即标准答案集):为什么易混——都会“打断 CPU”。本质区别——中断是请 CPU 来搬(软件搬运,适合少量多次),DMA 是硬件自己搬、搬完才请 CPU(适合大批量)。判别线索:题目给“字符设备/键盘打印机”→ 中断;给“磁盘/块传送/周期挪用”→ DMA;问“请求什么”→ 中断请求 CPU 时间、DMA 请求总线。
同步总线 vs 异步总线:同步按统一时钟打拍(高速、距离短、设备速度相近),异步靠握手(速度差异大)。判别线索:题目给时钟频率和周期数 → 同步定时计算。
应用与考法
形态一:带宽/事务时间计算:2009-20、2012-19、2014-19/20、2018-21、2020-19、2013-43(突发事务完整时序)、2012-43(带宽 + 缺页 + DMA 请求次数综合,见 X-1/X-3)。
形态二:I/O 方式对比与 CPU 占比:2009-43(中断 2.5% vs DMA 0.1%)、2013-22(四项对比找错误项)、2015-21、2016-22(DMA 结束是中断)、2017-43(DMA 过程排序)、2016-43(中断方式输入输出示意大题)。
形态三:总线概念辨析:2010-20(总线标准)、2011-20(数据线不跑握手信号)、2012-20/21(USB、I/O 总线信息)、2015-19(总线定时)、2016-21(并行 vs 串行、分离事务)、2017-20(多总线结构:靠近 CPU 的快、桥接器相连)。
做题触发词:看到“地址/数据复用”→ 事务多一个地址节拍;看到“每周期传两次/双沿”→ 带宽 ×2;看到“CPU 用于 I/O 的时间占比”→ 先算每秒打扰次数 × 每次开销;看到“DMA 与 CPU 争总线”→ DMA 优先(2012-43 第 3 问)。
来源:真题markdown/2009-2024统考真题.md 对应题号。
前后联系
- 向前依赖:CO-4(指令执行完的时机是中断响应点;单总线数据通路就是总线思想的片内版本)、CO-3(存储器总线带宽须匹配 Cache 缺失流量,2012-43;多体交叉 + 突发传送的配合,2013-43)。
- 向后引出 / 跨学科:
- 中断响应过程 → OS-0 中断与系统调用、X-2;
- DMA 搬磁盘数据 → OS-8 I/O 管理、X-3;DMA 优先级高于 CPU → 对 OS 缺页处理时间的理解(X-1);
- 总线仲裁(共享介质争用)→ 与计网 CSMA/CD 介质访问控制思想同源(X-8 级别的跨学科呼应:都是“共享通道如何分配使用权”)。
闭卷回忆链
- 为什么不用专线互连?共享总线带来哪三个新问题?(仲裁、定时、带宽)
- 三种总线仲裁方式各用什么代价换什么?
- 同步和异步定时分别适合什么场景?
- 总线带宽怎么算?复用和突发分别怎么影响事务时间?
- 为什么高频时代并行总线反而输给串行?(串扰与偏移)
- 外设很慢,最笨的 I/O 方式是什么?它浪费在哪?
- 中断方式怎么解放 CPU?为什么高速设备用中断会丢数据?
- DMA 把哪段工作从 CPU 手里拿走?CPU 还剩什么活?(预处理 + 后处理)
- DMA 请求和中断请求求的东西有何不同?响应时机有何不同?(总线使用权 vs CPU 时间;总线事务末 vs 指令末)
- DMA 与 CPU 抢总线谁优先?为什么?(I/O 数据不等人,2012-43)
- 怎么算“CPU 用于 I/O 的时间占比”?中断和 DMA 各按什么节奏打扰?
- 这一套机制如何支撑 OS 的 I/O 层次与磁盘读写?(接 OS-8、X-3)