2026-06-15 22:39:57 +08:00
|
|
|
|
---
|
|
|
|
|
|
tags:
|
|
|
|
|
|
- 计算机系统结构
|
|
|
|
|
|
- 复习
|
|
|
|
|
|
- 总线
|
|
|
|
|
|
- IO系统
|
|
|
|
|
|
create time: 2026-06-15 10:00
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 总线与 I/O 系统
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
本文档讲解总线的基本概念、分类与仲裁方式、同步/异步总线的工作机制、分离事务总线的工作原理,以及 I/O 系统的核心组成——DMA 与中断机制。最后讨论 I/O 系统的性能评价与计算方法。总线是连接处理器、存储器和 I/O 设备的通信通道,其设计直接影响系统整体性能。
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
> [!tip] 考试重点
|
2026-06-15 22:55:55 +08:00
|
|
|
|
> 分离事务总线的概念和别称常以选择题出现。DMA 三种工作模式的对比、中断处理流程是简答题高频考点。I/O 系统性能计算(总线带宽、CPU 占用率)是综合题常客。
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
## 正文
|
|
|
|
|
|
|
|
|
|
|
|
### 一、总线基础
|
|
|
|
|
|
|
|
|
|
|
|
**总线**(Bus)是计算机系统中多个功能部件之间共享的通信通道,由一组导线和相关的控制逻辑组成。
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.1 总线分类
|
|
|
|
|
|
|
|
|
|
|
|
| 分类方式 | 类型 | 说明 |
|
|
|
|
|
|
|----------|------|------|
|
|
|
|
|
|
| 按用途 | 数据总线、地址总线、控制总线 | 分别传输数据、地址、控制信号 |
|
|
|
|
|
|
| 按层次 | 系统总线、I/O 总线 | 系统总线连接 CPU 和主存,I/O 总线连接外设 |
|
|
|
|
|
|
| 按控制 | 同步总线、异步总线 | 同步靠时钟,异步靠握手信号 |
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.2 总线性能指标
|
|
|
|
|
|
|
|
|
|
|
|
- **总线带宽**:单位时间内传输的数据量(MB/s)
|
|
|
|
|
|
- **总线宽度**:数据线的位数(如 64 位)
|
|
|
|
|
|
- **总线频率**:总线时钟频率(如 800 MHz)
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
三者之间的关系:
|
|
|
|
|
|
|
|
|
|
|
|
$$\text{总线带宽} = \text{总线宽度} \times \text{总线频率} \times \text{每个时钟传输次数}$$
|
|
|
|
|
|
|
|
|
|
|
|
> [!question] 思考
|
|
|
|
|
|
> 一条 64 位宽、800 MHz 的总线,理论峰值带宽是多少?如果每个时钟周期传输 1 次,答案是 $64 \div 8 \times 800 = 6400\ \text{MB/s}$。若采用 DDR(双倍数据率)技术,带宽翻倍为 12800 MB/s。这就是为什么现代总线普遍采用 DDR 技术。
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.3 总线仲裁
|
|
|
|
|
|
|
|
|
|
|
|
多个设备可能同时请求使用总线,**总线仲裁器**(Arbiter)决定谁获得使用权。仲裁方式分为两大类:
|
|
|
|
|
|
|
|
|
|
|
|
| 仲裁方式 | 仲裁器位置 | 优点 | 缺点 | 典型策略 |
|
|
|
|
|
|
|----------|:----------:|------|------|----------|
|
|
|
|
|
|
| **集中式仲裁** | 专用硬件仲裁器 | 决策快、确定性强 | 仲裁器是单点瓶颈 | 菊花链、轮询、独立请求 |
|
|
|
|
|
|
| **分布式仲裁** | 无集中仲裁器,各设备自行协商 | 可扩展性好 | 延迟不确定 | 自举分布式、冲突检测 |
|
|
|
|
|
|
|
|
|
|
|
|
**集中式仲裁的三种策略**:
|
|
|
|
|
|
|
|
|
|
|
|
- **菊花链仲裁**:Grant 信号沿设备链逐级传递,离仲裁器越近优先级越高。简单但不公平,低优先级设备可能饿死。
|
|
|
|
|
|
- **轮询仲裁**:仲裁器按固定顺序轮询各设备。公平但效率不高。
|
|
|
|
|
|
- **独立请求仲裁**:每个设备有独立的请求/应答线。速度快、灵活,但线数随设备数增加。
|
|
|
|
|
|
|
|
|
|
|
|
> [!question] 思考
|
|
|
|
|
|
> 如果系统中有 16 个 I/O 设备,独立请求仲裁需要多少对请求/应答线?答案是 16 对。设备再多,线数就成了问题——这就是为什么大规模系统倾向于使用分布式仲裁或层级式仲裁。
|
|
|
|
|
|
|
|
|
|
|
|
### 二、同步总线与异步总线
|
|
|
|
|
|
|
|
|
|
|
|
总线通信的同步方式决定了设备间如何协调时序。
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.1 同步总线
|
|
|
|
|
|
|
|
|
|
|
|
所有操作由**统一的时钟信号**驱动。发送方和接收方在时钟边沿进行数据采样。
|
|
|
|
|
|
|
|
|
|
|
|
- 优点:控制简单、速度快
|
|
|
|
|
|
- 缺点:所有设备必须以同一时钟频率工作,灵活性差;总线长度受时钟偏移(clock skew)限制
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.2 异步总线
|
|
|
|
|
|
|
|
|
|
|
|
没有统一时钟,通过**握手信号**(Handshake)协调通信。典型的四周期握手协议如下:
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
|
participant S as "发送方"
|
|
|
|
|
|
participant R as "接收方"
|
|
|
|
|
|
|
|
|
|
|
|
S->>R: "1. 数据就绪 (Data Valid)"
|
|
|
|
|
|
R->>S: "2. 数据接收 (Data Ack)"
|
|
|
|
|
|
S->>R: "3. 撤销数据就绪"
|
|
|
|
|
|
R->>S: "4. 撤销数据接收"
|
|
|
|
|
|
Note over S, R: "一个完整的四周期握手完成"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- 优点:允许不同速度的设备通信,灵活性高
|
|
|
|
|
|
- 缺点:握手开销增加了延迟,速度比同步总线慢
|
|
|
|
|
|
|
|
|
|
|
|
> [!note] 半同步总线
|
|
|
|
|
|
> 实际系统常采用**半同步总线**:以时钟为基本定时参考,但引入 `Wait` 信号允许慢速设备插入等待周期。兼顾了同步的效率和异步的灵活性。
|
|
|
|
|
|
|
|
|
|
|
|
### 三、分离事务总线
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
**核心思想**:将一个总线事务分成**请求**和**响应**两个阶段,在请求和响应之间的空闲时间内,总线可以供给其他 I/O 设备使用。
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
|
participant C as CPU
|
|
|
|
|
|
participant B as Bus
|
|
|
|
|
|
participant M as Memory
|
|
|
|
|
|
|
|
|
|
|
|
C->>B: 请求阶段(发送地址+命令)
|
|
|
|
|
|
B->>M: 内存准备数据
|
2026-06-15 22:55:55 +08:00
|
|
|
|
Note over B: "总线空闲, 可服务其他请求"
|
2026-06-15 22:39:57 +08:00
|
|
|
|
M->>B: 响应阶段(返回数据)
|
|
|
|
|
|
B->>C: 数据到达
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**别称**:
|
|
|
|
|
|
|
|
|
|
|
|
| 名称 | 说明 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| 流水总线 | 因为请求和响应可以流水化 |
|
|
|
|
|
|
| 分离协议总线 | 因为协议将事务分离 |
|
|
|
|
|
|
| **交叉互连总线** | **不是**分离事务总线的别称,是另一种总线拓扑 |
|
|
|
|
|
|
| **独占总线** | **不是**分离事务总线的别称 |
|
|
|
|
|
|
|
|
|
|
|
|
> [!note] 分离事务总线的优势
|
|
|
|
|
|
> 传统总线在一个事务完成前一直被占用,分离事务总线在等待内存响应时释放总线,允许多个设备并发使用,显著提高总线利用率。
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
### 四、I/O 系统性能
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
#### 4.1 性能评价维度
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 维度 | 含义 | 衡量指标 |
|
|
|
|
|
|
|------|------|----------|
|
|
|
|
|
|
| **连接特性** | 设备连接能力和带宽 | 设备数量、通道数 |
|
|
|
|
|
|
| **容量** | 存储空间大小 | TB、PB |
|
|
|
|
|
|
| **响应时间** | 从请求到完成的延迟 | ms、μs |
|
|
|
|
|
|
| **吞吐率** | 单位时间处理的 I/O 量 | IOPS、MB/s |
|
|
|
|
|
|
|
|
|
|
|
|
> [!question] I/O 系统性能为什么重要?
|
|
|
|
|
|
> 随着处理器速度远超 I/O 设备速度,I/O 瓶颈日益突出。一个 I/O 操作可能耗时数毫秒,而 CPU 一个时钟周期仅数纳秒,巨大的速度差使得 I/O 系统可能成为整个系统的瓶颈。
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
#### 4.2 I/O 系统的瓶颈问题
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
CPU 速度: ~GHz (纳秒级)
|
|
|
|
|
|
内存速度: ~100ns
|
|
|
|
|
|
磁盘速度: ~10ms (毫秒级)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
速度差距达到 **5~6 个数量级**,因此:
|
|
|
|
|
|
|
|
|
|
|
|
- I/O 系统的性能对 CPU 利用率影响巨大
|
|
|
|
|
|
- I/O 和 CPU 的性能不匹配时,I/O 系统成为瓶颈
|
|
|
|
|
|
- 需要通过缓存、缓冲、异步 I/O 等技术缓解
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
#### 4.3 I/O 性能计算
|
|
|
|
|
|
|
|
|
|
|
|
> [!example] 例题:总线带宽与 I/O 吞吐量
|
|
|
|
|
|
> 某计算机系统参数如下:
|
|
|
|
|
|
>
|
|
|
|
|
|
> - 总线宽度:64 位
|
|
|
|
|
|
> - 总线频率:200 MHz
|
|
|
|
|
|
> - 每个总线周期传输 1 次数据
|
|
|
|
|
|
> - 系统通过 DMA 将磁盘数据传入内存
|
|
|
|
|
|
> - DMA 采用块传输模式,每个总线事务的开销为 2 个周期(地址+命令 1 周期,数据传输 1 周期)
|
|
|
|
|
|
>
|
|
|
|
|
|
> **问题 1**:总线的理论峰值带宽是多少?
|
|
|
|
|
|
>
|
|
|
|
|
|
> **解**:
|
|
|
|
|
|
>
|
|
|
|
|
|
> $\text{理论带宽} = 64\text{bit} \times 200\text{MHz} = 1600\text{MB/s}$
|
|
|
|
|
|
>
|
|
|
|
|
|
> **问题 2**:考虑事务开销后,实际有效带宽是多少?
|
|
|
|
|
|
>
|
|
|
|
|
|
> **解**:
|
|
|
|
|
|
>
|
|
|
|
|
|
> 每传输 64 bit(8 B)数据需要 2 个周期(1 个开销 + 1 个数据)
|
|
|
|
|
|
>
|
|
|
|
|
|
> $\text{有效带宽} = \frac{8\text{B}}{2 \times 5\text{ns}} = 800\text{MB/s}$
|
|
|
|
|
|
>
|
|
|
|
|
|
> **问题 3**:如果有 4 个磁盘控制器同时以 DMA 方式向内存写入数据,每个控制器持续传输速率为 150 MB/s,总线能否支持?
|
|
|
|
|
|
>
|
|
|
|
|
|
> **解**:
|
|
|
|
|
|
>
|
|
|
|
|
|
> 总需求带宽:$4 \times 150 = 600\text{MB/s}$
|
|
|
|
|
|
>
|
|
|
|
|
|
> 有效带宽 800 MB/s > 600 MB/s,可以支持。但总线利用率已达 $600/800 = 75\%$,余量不多。如果再增加设备或提高单设备速率,总线将成为瓶颈。
|
|
|
|
|
|
|
|
|
|
|
|
> [!question] 思考
|
|
|
|
|
|
> 为什么分离事务总线能提高 I/O 系统的有效带宽?因为它在等待内存响应期间释放总线给其他设备使用,减少了总线空闲时间。在上例中,如果采用传统总线,每个 DMA 事务期间总线被独占(即使设备在准备数据),有效带宽会进一步下降。
|
|
|
|
|
|
|
|
|
|
|
|
### 五、DMA 与中断
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.1 三种 I/O 控制方式对比
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 方式 | 原理 | CPU 参与度 | 适用场景 |
|
|
|
|
|
|
|------|------|:----------:|----------|
|
|
|
|
|
|
| 程序查询 | CPU 轮询 I/O 状态 | 高 | 简单系统 |
|
|
|
|
|
|
| 中断 | I/O 完成后通知 CPU | 中 | 低速设备 |
|
|
|
|
|
|
| **DMA** | 直接内存访问,不经过 CPU | 低 | 高速设备 |
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
#### 5.2 DMA 工作流程
|
2026-06-15 22:39:57 +08:00
|
|
|
|
|
|
|
|
|
|
1. CPU 设置 DMA 传输参数(源地址、目的地址、传输长度)
|
|
|
|
|
|
2. DMA 控制器接管总线,直接在设备和内存间传输数据
|
|
|
|
|
|
3. 传输完成后,DMA 控制器向 CPU 发中断通知
|
|
|
|
|
|
|
2026-06-15 22:55:55 +08:00
|
|
|
|
#### 5.3 DMA 的三种工作模式
|
|
|
|
|
|
|
|
|
|
|
|
DMA 控制器在传输过程中根据总线使用权的不同,分为三种工作模式:
|
|
|
|
|
|
|
|
|
|
|
|
| 模式 | 总线使用方式 | CPU 影响 | 传输效率 | 适用场景 |
|
|
|
|
|
|
|------|------------|:--------:|:--------:|----------|
|
|
|
|
|
|
| **单字传输**(Cycle Stealing) | 每传一个字就释放总线给 CPU | 每个字都要"偷"一个总线周期,CPU 频繁被打断 | 低 | CPU 对延迟敏感的场景 |
|
|
|
|
|
|
| **块传输**(Block Transfer) | 一次占用总线传完整个数据块 | CPU 长时间无法使用总线 | 高 | 大块数据连续传输 |
|
|
|
|
|
|
| **请求传输**(Demand Transfer) | DMA 检查 DREQ 信号,设备未就绪则释放总线 | 仅在设备有数据时才占用总线 | 中等 | 设备速度不确定的场景 |
|
|
|
|
|
|
|
|
|
|
|
|
> [!question] 思考
|
|
|
|
|
|
> 假设 CPU 每秒执行 1 亿条指令,DMA 以单字模式从磁盘读取数据,总线宽度 32 位,总线周期 100ns。每"偷"一个周期 CPU 损失一条指令的时间。若传输 1 MB 数据,CPU 会损失多少执行时间?答案:$1\text{MB} \div 4\text{B} = 250000$ 个周期,损失 $250000 \times 100\text{ns} = 25\text{ms}$,占 1 秒的 2.5%。这就是为什么高速传输通常选择块传输模式。
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.4 中断处理的完整流程
|
|
|
|
|
|
|
|
|
|
|
|
当 I/O 设备完成操作后,通过中断通知 CPU。CPU 响应中断的完整过程如下:
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
flowchart TD
|
|
|
|
|
|
A["中断请求"] --> B{"CPU 响应?"}
|
|
|
|
|
|
B -- "否" --> A
|
|
|
|
|
|
B -- "是" --> C["关中断"]
|
|
|
|
|
|
C --> D["保护现场: 保存 PC, PSW 等"]
|
|
|
|
|
|
D --> E["识别中断源: 确定哪个设备中断"]
|
|
|
|
|
|
E --> F["跳转中断服务程序"]
|
|
|
|
|
|
F --> G["执行中断服务: 处理 I/O 数据"]
|
|
|
|
|
|
G --> H["恢复现场: 恢复 PC, PSW 等"]
|
|
|
|
|
|
H --> I["开中断"]
|
|
|
|
|
|
I --> J["返回断点继续执行"]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
> [!important] 关键步骤说明
|
|
|
|
|
|
> - **保护现场**:必须保存程序计数器(PC)和程序状态字(PSW),确保中断返回后能正确继续执行。
|
|
|
|
|
|
> - **中断源识别**:多个设备同时中断时,需要确定优先级。硬件向量法比软件轮询法快得多。
|
|
|
|
|
|
> - **嵌套中断**:中断服务期间是否允许新的更高优先级中断嵌入?这取决于是否在服务程序中开中断。
|
|
|
|
|
|
|
|
|
|
|
|
#### 5.5 中断 vs DMA 的 CPU 占用率计算
|
|
|
|
|
|
|
|
|
|
|
|
> [!example] 例题:I/O 系统 CPU 占用率
|
|
|
|
|
|
> 一个系统中,CPU 时钟频率 500 MHz,磁盘控制器以 DMA 方式传输数据。
|
|
|
|
|
|
>
|
|
|
|
|
|
> - DMA 采用块传输模式,每次传输 4 KB 数据块
|
|
|
|
|
|
> - 传输前 CPU 需要 1000 个时钟周期设置 DMA 控制器
|
|
|
|
|
|
> - 传输完成后 DMA 中断 CPU,中断处理需要 500 个时钟周期
|
|
|
|
|
|
> - 磁盘持续数据传输速率为 40 MB/s
|
|
|
|
|
|
>
|
|
|
|
|
|
> **问题**:CPU 用于该磁盘 I/O 的时间比例是多少?
|
|
|
|
|
|
>
|
|
|
|
|
|
> **解**:
|
|
|
|
|
|
>
|
|
|
|
|
|
> 每个 4 KB 块需要 CPU 参与的周期数:$1000 + 500 = 1500$ 个周期
|
|
|
|
|
|
>
|
|
|
|
|
|
> 每秒传输的块数:$40\text{MB/s} \div 4\text{KB} = 10000$ 块/秒
|
|
|
|
|
|
>
|
|
|
|
|
|
> 每秒 CPU 花在 I/O 上的周期数:$10000 \times 1500 = 1.5 \times 10^7$ 周期/秒
|
|
|
|
|
|
>
|
|
|
|
|
|
> CPU 占用率:$1.5 \times 10^7 \div 5 \times 10^8 = 3\%$
|
|
|
|
|
|
>
|
|
|
|
|
|
> **结论**:DMA 的 CPU 占用率仅 3%。如果采用中断方式逐字传输,每次传输 1 个字(4B)都需要一次中断,CPU 占用率将大幅飙升。
|
|
|
|
|
|
|
2026-06-15 22:39:57 +08:00
|
|
|
|
## 关联笔记
|
|
|
|
|
|
- [[计算机系统结构/复习文档/计算机系统结构基础与定量原理]]
|
|
|
|
|
|
- [[计算机系统结构/复习文档/存储系统与Cache]]
|
|
|
|
|
|
- [[计算机系统结构/index|试题册索引]]
|