系统总线的结构
单总线、双总线、三总线这三种结构,不是三种可以随便挑的设计风格,而是同一条演化线上的三个时刻。驱动力自始至终只有一个:
总线是分时共享的,所以挂在同一条总线上的设备必须迁就彼此的速度。把速度差异大的流量分开,是唯一的出路。
每多加一条总线,就是承认又有一类流量的速率与其他类不同,把它单独拉出去。这一节按这条线索读,三张图就不必分别背。
机制
单总线结构
CPU、主存、所有 I/O 接口挂在同一条系统总线上。
flowchart LR CPU --- B MEM["主存"] --- B IO1["I/O 接口"] --- B IO2["I/O 接口"] --- B B["系统总线(一条)"] classDef bus fill:#fff8e1,stroke:#f9ab00,stroke-width:2px class B bus
- 优点:结构最简单、成本最低、易于扩展新设备(接上去就行)。
- 致命问题:同一时刻只能有一对设备通信。CPU 访存与 I/O 传输互相排队,总线成为整机瓶颈。
- 次要问题:挂的设备越多,电气负载越重,能跑的频率反而越低。
这里出现了本书那条老规律的又一次实例:一条总线要同时服务快设备和慢设备,它的时序参数只能按最慢的那个留余量——5.4.2 同步控制、5.2.3 单周期方案说的是同一件事。
双总线结构
把 CPU—主存这条最频繁、最怕延迟的通路单独拉出来。
flowchart LR CPU --- MB MEM["主存"] --- MB MB["主存总线(高速)"] --- CH["通道 / 桥"] CH --- IOB["I/O 总线(低速)"] IOB --- D1["设备"] IOB --- D2["设备"] classDef bus fill:#fff8e1,stroke:#f9ab00,stroke-width:2px classDef bridge fill:#e8f0fe,stroke:#4285f4,stroke-width:2px class MB,IOB bus class CH bridge
主存总线只挂 CPU 和主存,负载轻、可以跑高频;所有慢速 I/O 退到 I/O 总线上,通过通道或桥接入。
代价是桥本身:它要做协议转换、速率匹配和跨时钟域缓冲,是新增的硬件,也是新的潜在瓶颈。
遗留问题:I/O 的数据要进主存,必须经过 CPU 或桥中转。对高速外设(磁盘成块传输)来说这是浪费——数据本来只需要在设备和主存之间流动,却要占用 CPU 侧的通路。
三总线结构
在前者基础上再拉出一条 DMA 总线,让高速 I/O 直接与主存成块交换。
flowchart LR CPU --- MB MEM["主存"] --- MB MB["主存总线"] MEM --- DB DMA["DMA 控制器<br/>+ 高速外设"] --- DB DB["DMA 总线"] CPU --- IOB IOB["I/O 总线"] --- D1["低速设备"] classDef bus fill:#fff8e1,stroke:#f9ab00,stroke-width:2px classDef master fill:#e8f0fe,stroke:#4285f4,stroke-width:2px class MB,DB,IOB bus class DMA master
三条总线各司其职:主存总线管 CPU 访存,DMA 总线管高速外设与主存的成块传输,I/O 总线管低速设备。三者可以并行工作——这是三总线结构真正的收益。
但主存端口仍是共享的:CPU 和 DMA 控制器都要访问主存,最终还是要在存储器端口上排队(周期挪用,见 OS 5.1.2)。加总线解决的是通路争用,解决不了目标部件本身的争用。
三种结构的对照
| 总线条数 | 能并行的通信 | 主要开销 | 遗留瓶颈 | |
|---|---|---|---|---|
| 单总线 | 1 | 无 | 最低 | 总线本身 |
| 双总线 | 2 | 主存访问 ∥ I/O 传输 | 桥 / 通道 | I/O 进主存要中转 |
| 三总线 | 3 | 再加 DMA ∥ 前两者 | 再加一套控制 | 主存端口 |
读法是从右往左:每一行的”遗留瓶颈”,就是下一行要解决的问题。
现代结构:桥接与点对点
再往后,“一条总线上电气并联多个设备”这个模型本身被放弃了。现代系统用点对点链路 + 交换结构:CPU 到内存、CPU 到 PCIe 设备都是专线,多个设备之间靠交换芯片转发,而不是共享同一组导线。
408 仍用总线抽象来理解共享通信与事务,因为事务的五个阶段、定时方式、带宽计算这些概念在点对点链路上依然适用;变的只是”是否存在电气意义上的共享导线”。
疑问点:总线就对应主板吧?主板有哪些骚操作?
“对应主板”是个好用的第一直觉,但它把范围划小了——主板只是总线的一种载体,而且只是中间那一层。
按 6.1.2 的三层划分:
- 片内总线在 CPU 芯片内部(5.3.3 那条 CPU 内部单总线),根本没上主板
- 系统总线 / I/O 总线才是主板上那些走线和插槽
- 通信总线在机箱之外——网线、USB 线
反过来也不成立:主板上不全是总线。 现在 CPU 到内存、CPU 到显卡都是点对点链路,不是多设备并联的经典总线。
至于”骚操作”,主板这几十年最大的一件事是:北桥消失了。
经典布局(就是上面的双/三总线结构在真实主板上的样子):
芯片 挂什么 速率 北桥(离 CPU 近) 内存控制器、显卡接口 高 南桥(离 CPU 远) 硬盘、USB、网卡、声卡、BIOS 低 现在:北桥被整个吃进了 CPU 芯片。内存控制器、PCIe 控制器、核显全在 CPU 里,主板上只剩一颗做南桥工作的芯片组(Intel 叫 PCH,AMD 叫芯片组)。
为什么被吃掉的是北桥而不是南桥? 答案就在这一节的主线里——北桥挂的恰好是最需要带宽、最怕延迟的两个设备。把内存控制器搬进 CPU,省掉的是一次完整的跨芯片往返;而南桥挂的都是慢设备,多一跳在它们的时间尺度上无所谓。
这条演化和 6.1.3 的三张图是同一件事的两种画法:单 → 双 → 三总线是”把最挤的流量拉出来”,北桥内聚是”把最急的控制器搬到最近”。判据都是速率差异。
另外两个常被问到的主板事实,也都能用本章的判据解释:
- 内存插槽为什么成对(双通道):等于把内存总线的位宽加倍(6.1.5 的
),走的是”并行加宽”那条路。 - 显卡插槽为什么标 ×16 / ×8:PCIe 按 lane 数扩展带宽,走的是”串行加通道”那条路。同一块板子上,两条路各用在一处。
边界
“总线条数越多越好”不成立。 每加一条总线要加一套控制逻辑、一个桥、一组引脚,成本与复杂度都上升。选几条取决于系统里有几类速率差异大的流量。
加总线解决通路争用,不解决目标部件争用。 三总线结构下 CPU 与 DMA 仍要争主存端口。多体交叉编址(3.2.4)才是解决主存端口争用的手段——两者是不同层次的措施。
桥不是”透明的”。 它引入延迟、缓冲和协议转换,跨桥的事务时间必须单独计入。
“三总线结构”的第三条在不同教材里可能指不同的东西(DMA 总线 / 局部总线 / 扩展总线)。答题按题图给的名字与连接关系判断,不要凭名字套记忆中的图。
教材的三张结构图与现代主板的对应关系是示意性的。 现代系统里没有一条电气意义上的”系统总线”,但事务、定时、带宽这些概念照常适用。
对照速查
| 问题 | 判据 |
|---|---|
| 为什么要拆总线 | 把速率差异大的流量分开,否则快的要迁就慢的 |
| 单 → 双拆出了什么 | CPU—主存这条最频繁的通路 |
| 双 → 三拆出了什么 | 高速外设直达主存的通路(DMA) |
| 三总线还剩什么瓶颈 | 主存端口(靠多体交叉缓解,不靠加总线) |
| 北桥为什么消失 | 它挂的是最需要带宽、最怕延迟的设备 |
| 双通道内存 vs PCIe ×16 | 并行加宽 vs 串行加通道 |
考点
- 结构辨识:给一张连接图,判断是几总线结构、哪些通信可以并行进行。
- 并行性判断:单总线结构下”CPU 访存”与”DMA 传输”能否同时——不能。三总线结构下能否——通路上能,但主存端口仍需排队。
- 瓶颈分析:某结构下增加高速外设,先撞到哪个瓶颈。
- 概念题:桥/通道的作用是协议转换 + 速率匹配 + 缓冲,不是”提高总线频率”。
链接
- 🏠 返回总览:计算机组成原理第 6 章:总线总览
- ⬅️ 上一节:6.1.2 总线的分类
- ➡️ 下一节:6.1.4 常见的总线标准
- 🔗 CPU 内部那条单总线:5.3.3 数据通路的基本结构
- 🔗 「要整齐就得按最慢的来」:5.4.2 硬布线控制器
- 🔗 主存端口争用的解法:3.2.4 多模块存储器
- 🔗 DMA 与周期挪用:OS 5.1.2 I/O 控制方式