06 总线
CPU、主存、外设都各干各的,总线是把它们连起来共用的"高速公路"。感性的带宽对比和接口大全在 总线与接口 讲过,本篇讲计组考点:三类仲裁(谁先上路)、定时方式(什么节奏走)、带宽算术(一秒运多少货)。
一、总线三分类
| 类型 | 连接对象 | 传输内容 |
|---|---|---|
| 数据总线 DB | 各部件 | 数据(双向) |
| 地址总线 AB | CPU → 主存/外设 | 地址(单向) |
| 控制总线 CB | 各部件 | 命令/时序/中断/应答(混合方向) |
- 片内总线:芯片内部(寄存器之间)
- 系统总线:CPU/主存/IO 各大部件之间(计算机系统级)
- 通信总线:计算机之间(如 USB/网络)
⚠️ 地址总线单向、数据总线双向——判断题常客。地址线 n 根 → 寻址空间 2ⁿ 单元。
性能算术
\[\text{总线带宽} = \text{工作频率} \times \text{位宽} / 8\]
💡 例:32 位(4B)数据总线、100MHz、每周期传一次 → 带宽 = 4B × 100M = 400 MB/s;若 DDR(上下沿都传)翻倍到 800 MB/s。
二、总线仲裁:多个主人抢一条路
总线上多个主设备(CPU、DMA 控制器都能发起传输)要抢总线——仲裁分集中式(有个中央裁判)和分布式(大家自商量)。
集中式三方式(408 必考)
| 方式 | 原理 | 优先级 | 优点 | 缺点 |
|---|---|---|---|---|
| 链式查询 | 总线同意信号 BG 串着往后传,谁先拿到谁用 | 离控制器越近越固定地高;后面的可能饿死 | 只用 3 根线(BR/BG/BS),线少省 | 优先级死板、对故障敏感(断一个全瘫) |
| 计数器查询 | 控制器计数器往设备号线上发号,报号者认领 | 可从上次终止点继续(循环优先级) | 灵活,优先级可调 | 要 log₂n 根设备号线 + 控制逻辑 |
| 独立请求 | 每个设备单独一对 BR/BG 线直连控制器 | 控制器可编程任意调度 | 最快最灵活 | 线最多(2n 根),成本最高 |
💡 记忆锚点:链式=一串糖葫芦(省线但死板),计数器=点名报到(中等),独立=专线电话(豪横)。
分布式仲裁
无中央控制器,各设备自己比较仲裁号——号小的赢(获胜者把仲裁号留在总线上,别人比对后自动退让)。如 CAN 总线、SCSI。
三、总线定时:什么节奏交换数据
1. 同步定时
统一时钟信号,双方按节拍行动。
- 优点:规约简单、速度快(不用等待应答)
- 缺点:必须迁就最慢的设备;时钟漂移在高频下致命
- 适用:总线短、速度接近的部件(CPU—主存)
2. 异步定时
无统一时钟,靠握手(应答):主方发请求,从方回应答。
| 方式 | 握手规则 | 特点 |
|---|---|---|
| 不互锁 | 请求/应答各发各的,不等待确认 | 最快,但不可靠(可能撞车/丢失) |
| 半互锁 | 主方等应答才撤销请求;从方不等主方 | 折中 |
| 全互锁 | 请求↔应答完全互相确认,双方都等对方动作 | 最可靠,最慢 |
💡 记忆:互锁 = 谁锁谁。全互锁像"你说'我到了',我说'收到',你才把请求撤掉,我确认后才算完"——每一步都确认。
3. 半同步(了解)
同步里加一条 WAIT 应答线:跟不上就拉 WAIT 插入等待周期——同步的骨架、异步的妥协(x86 总线的 READY 信号)。
四、总线的数据传输:一次事务的分解
一次总线事务(Bus Transaction)四阶段:
- 申请分配:仲裁(上一节)
- 寻址:主方发地址 + 命令(读/写)
- 传输:数据一个节拍一个节拍地上
- 结束:撤信号、释放总线
⚠️ 突发传输(Burst):给首地址后连续传多个字,地址自动 +1——DDR、PCIe 全靠它吃满带宽,和 03-存储系统 的"低位交叉 + 局部性"是一套组合拳。
五、盲点自测
- 地址总线方向?n 根地址线寻址多少?(单向;2ⁿ 个单元)
- 链式查询为什么可能饿死?优点是什么?(BG 串行传递固定优先级,后面的设备可能永远抢不到;只用 3 根线)
- 独立请求方式最贵在哪?(每设备 2 根专用线,2n 根)
- 同步总线为什么必须迁就最慢设备?(统一节拍,快设备只能等)
- 全互锁为什么最可靠?代价?(双向确认,无动作丢失;每次传输都要多次往返,慢)
- 64 位总线 200MHz 每周期传一次,带宽多少?(8B × 200M = 1600 MB/s)
六、动手玩
# 看一眼你这台机器的"总线树"
system_profiler SPHardwareDataType SPPCIDataType # macOS:PCI 设备挂在哪
lspci -tv # Linux:树状总线拓扑
你会看到 PCIe 树状结构——根复杂、分支挂 GPU/NVMe/网卡,正是"总线分层"的现实版。
💬 评论