系统总线的结构

单总线、双总线、三总线这三种结构,不是三种可以随便挑的设计风格,而是同一条演化线上的三个时刻。驱动力自始至终只有一个:

总线是分时共享的,所以挂在同一条总线上的设备必须迁就彼此的速度。把速度差异大的流量分开,是唯一的出路。

每多加一条总线,就是承认又有一类流量的速率与其他类不同,把它单独拉出去。这一节按这条线索读,三张图就不必分别背。

机制

单总线结构

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 传输”能否同时——不能。三总线结构下能否——通路上能,但主存端口仍需排队。
  • 瓶颈分析:某结构下增加高速外设,先撞到哪个瓶颈。
  • 概念题:桥/通道的作用是协议转换 + 速率匹配 + 缓冲,不是”提高总线频率”。

链接