一、IO系统概述
IO系统是计算机体系结构中连接 CPU、主存与外设的桥梁,其核心问题包括:
- 如何在 CPU—主存—外设 之间构建高效的数据通路
- 如何将用户的 IO 请求转换成设备的命令
- 如何对外设进行编址(CPU 怎样寻址到外设)
- 硬件和操作系统如何协调主机与外设之间的数据传输
1.1 IO性能的两个关键指标
| 指标 | 含义 | 典型场景 |
|---|---|---|
| 吞吐率(Throughput) | 单位时间传送的数据总量 | 流媒体、大文件传输 |
| 响应时间(Response Time) | 从发出请求到收到数据的时间 | 在线交易、抢课点击 |
一辆装满磁盘的卡车在公路上跑——带宽极高(几千TB一车),但响应时间极差(装车就要半天)。一根细细的网线——带宽低(可能只有10M),但响应时间很短。不同任务需要不同的 IO 特性。
二、现代计算的两堵墙
当前计算系统主要面临两堵墙——功耗墙(Power Wall)和带宽墙(Bandwidth Wall / Memory Wall)。CPU 中多放几个核,热量散发不出去,受物理定律限制;数据从 memory、硬盘、网络获取,IO 带宽始终是瓶颈。
带宽的数据来源:
- 从 memory 来
- 从硬盘来
- 从网络来
- 无论从哪来,都需要 input/output
2.1 不同应用场景的IO需求
| 应用类型 | 特点 | IO需求 |
|---|---|---|
| 视频流播放 | 先缓冲半分钟,然后逐步播放 | 吞吐率重要,响应时间可容忍 |
| 在线交易 | 一次点击可能只有1K数据 | 响应时间极为关键 |
| 高吞吐+短响应 | 两者都需要高 | 需要更好的硬件、更大的带宽 |
三、IO外设概览
3.1 常见外设类型
- 人机交互设备:键盘、鼠标、显示器、打印机
- 调制解调器(Modem):把数字信号转换成模拟信号(电话线传输),涉及 AD(模数转换)/ DA(数模转换)
- 存储设备:磁盘、SSD、磁带、光盘
- 输入设备:扫描仪、摄像头、麦克风
- 特殊设备:传真机(在政府机关仍使用,因其具有法律效力——传输即证明对方已收到)
3.2 IO接口中的信号线
IO 接口电缆中包含三类信号:
- 控制信号(Control)
- 状态信号(Status)
- 数据信号(Data)
四、磁盘存储
4.1 磁盘物理结构
磁盘由多个盘片(Platter)组成,每个盘片上有同心圆的磁道(Track),每个磁道分成多个扇区(Sector)。靠近圆心的扇区面积更小。
4.2 磁盘访问时间
总访问时间 = 平均寻道时间 + 平均旋转延迟 + 数据传输时间
- 平均寻道时间(Seek Time):磁头移动到目标磁道的时间(几毫秒至十几毫秒)
- 平均旋转延迟(Rotational Latency):等待目标扇区转到磁头下方的时间
- 5400 RPM → 约每秒90转
- 7200 RPM(服务器级别)→ 约每秒120转
- 数据传输时间:实际读/写数据的时间,通常远小于前两者(约 0.001 毫秒 vs 十几毫秒)
磁盘最慢的部分是机械运动。数据传输时间相对于寻道和旋转延迟来说几乎可以忽略。
4.3 格式化
格式化(Format):磁盘出厂时磁介质是乱序的,通过格式化用磁头将其排列成标准的01方向。
- 完全格式化:把磁盘每一位都写一遍(对于大容量磁盘非常耗时)
- 快速格式化(Quick Format):只擦除 FAT表(File Allocation Table,文件分配表),数据本身仍在磁盘上
快速格式化只删除”目录”,数据全部保留。因此快速格式化后的硬盘可以通过技术手段恢复数据。这也是重要的泄密途径——政府部门销毁涉密磁盘时,要求对每一位反复写0、写1、再写0,写多遍,确保数据无法恢复。
4.4 磁盘的串行-并行转换
磁头读出的数据是串行的,经过磁盘控制器转换为并行信号才能进入系统总线。
五、RAID技术
5.1 问题与动机
磁盘会损坏,重要数据需要保护。
朴素方案:买两个硬盘,一个做备份(RAID 1 的基本思想)。
问题升级:要在控制成本的前提下保证数据安全——这就是 RAID 的思想:用廉价的(Inexpensive)磁盘组成冗余阵列。
5.2 RAID基本概念
RAID(Redundant Array of Inexpensive Disks,冗余磁盘阵列):
- 多个独立操作的物理磁盘按某种方式组成一个阵列
- 在操作系统下展现为单个逻辑驱动器
- 增加容量、提供容错/错误恢复能力
5.3 RAID级别演进
| RAID级别 | 特点 |
|---|---|
| RAID 0 | 条带化(Striping),数据分块分布在多个盘上,提高性能,无冗余 |
| RAID 1 | 镜像(Mirroring),每份数据存两份 |
| RAID 5 | 块级条带化 + 分布式奇偶校验(一个校验块,可容忍一个盘故障) |
| RAID 6 | 双维校验(P+Q),可容忍两个盘同时故障,但控制器设计非常复杂 |
5.4 SSD+HDD混合方案
Intel 曾推出混合硬盘方案:机械硬盘 + 128GB SSD 缓存。系统启动和常用文件走 SSD,大数据文件走 HDD。这个思路与 CPU 用 cache 给 memory 做缓冲完全一致——cache 的思想在各级存储中通用。
六、总线与互连
6.1 系统总线结构
传统的南北桥架构:
- 北桥(North Bridge):连接高速设备——CPU、内存、显卡(带宽极大)
- 南桥(South Bridge):连接低速设备——磁盘、USB、网络等
- 桥接器(Bridge):高速的 CPU 和低速设备之间需要一个转换层来协调
6.2 总线的演变
- 早期:共享总线(Bus),所有设备连在一起
- 现代:点对点串行总线(如 PCIe),中间是一个 Switch,信号来了直接路由到目标设备,无需仲裁等待
6.3 并行传输 vs 串行传输
| 特性 | 并行传输 | 串行传输 |
|---|---|---|
| 每次传输 | 多根线同时传多个bit | 一根线一次传一个bit |
| 优势 | 短距离下非常快 | 长距离传输,频率可以很高 |
| 劣势 | 长距离下线间干扰严重 | 需要更高的频率来补偿 |
| 历史趋势 | 早期认为并行更快 | 现在串行更快(如 PCIe、SATA) |
时代在变化:现在串行比并行快。但并行也并未被淘汰——正如 SSD 出来后机械硬盘通过不断降价、不断扩展容量,在服务器上仍然大量使用。没有垃圾技术,只有被放错了位置的资源。
6.4 总线带宽计算
总线带宽 = 总线频率 × 总线宽度 × 每周期传输次数
厂商标称的带宽数据往往是峰值。实际使用中要握手、要仲裁、要等待响应,不可能达到峰值。
6.5 突发传输(Burst Transfer)
不需要每个数据配一个地址——给出起始地址和目标长度,后面地址自动递增,连续传送一大块数据。一次给地址,多次传数据,大幅提高效率。
七、IO编址
两种方式:
- 统一编址(Memory-Mapped IO):IO 设备的寄存器映射到内存地址空间,用 memory read/write 指令访问。硬件完全在控制之下,可直接编码。
- 独立编址(Isolated IO):IO 设备有独立的地址空间,需要专门的 IO 指令。
八、操作系统在IO中的角色
8.1 OS的核心职责
- 资源调度:多个程序共享 IO 设备,统一调度
- 权限保护:用户程序不能直接访问外设(防止误操作导致设备损坏或系统崩溃)
- 驱动封装:提供统一的接口,上层应用调用
read()/write(),下层操作具体硬件
OS 将底层复杂的东西封装好,上层只需调用文件接口,不需要直接写设备。
8.2 从 read() 到底层硬件的调用链
用户层 read() → Linux内核层 int 80(系统调用)→ 文件系统层(VFS)→ 通用块层(Generic Block Layer, make_request)→ IO调度层(排队调度)→ 块设备驱动层 → 硬件访问 → 数据层层返回
一个简单的 read 调用经历了多层抽象,这正是操作系统分层设计的体现。
九、中断系统
9.1 中断的基本概念
中断(Interrupt):程序正在执行时,被外部事件打断,转去执行一段中断服务程序(ISR, Interrupt Service Routine),完成后再回到原来的程序继续执行。
中断处理的核心步骤:
- 关中断 — 保护当前状态
- 保护断点和程序状态 — PC 压栈
- 识别中断源 — 判断谁发的中断
- 执行中断服务程序(ISR)
- 恢复现场、返回
9.2 识别中断源的方式
| 方式 | 代表 | 描述 |
|---|---|---|
| 软件识别(查询) | RISC-V | 跳转到中断入口后,读取 mcause 寄存器,获取异常状态码,用 switch/if-else 跳转到对应处理程序 |
| 硬件向量 | x86, 8086 | 中断来了直接知道中断类型号,查中断向量表(IVT)跳转到对应的 ISR |
9.3 8259A中断控制器
8259A 是 x86 系统中常用的中断控制器芯片:
- 可接收8个外部中断请求(IR0–IR7)
- 支持优先级仲裁
- 支持中断屏蔽(可设置哪些中断被屏蔽)
- 将中断请求编码成数据返回给 CPU
9.4 中断响应条件
CPU 能响应中断的条件:
- 当前允许中断(开中断)
- 当前指令执行完成
关于流水线 CPU:”指令执行完成”的含义——如果是五级流水线,指令已经执行到 Memory 阶段、就差 Write Back 了,是否需要等它完成?这涉及到系统设计时的决策问题,每个决策有不同的后果。
9.5 中断与流水线
在流水线 CPU 中处理中断更复杂:
- 乱序执行 + 顺序提交(out-of-order execution, in-order commit)
- 中断来了,是马上响应(清空流水线、PC回退),还是等流水线都跑完再处理?
- 前者快但浪费已有进度,后者慢但不浪费
十、DMA直接存储器访问
10.1 为什么需要DMA
程序直接控制方式的问题:CPU 在那等着数据传输,什么也干不了。
中断方式的问题:虽然 CPU 可以在等待时干别的事,但对 IO 请求响应慢,数据传送速度受限于 CPU。
DMA 的核心思想:CPU 将起始地址、长度等参数设置好,数据传输由 DMA 控制器独立完成,CPU 在此期间可以执行其他程序。
10.2 DMA的工作方式
DMA 的三个阶段:
- DMA传送前:CPU 设置好起始地址、长度、方向等参数
- DMA传送中:CPU 执行其他程序(可以计算,但不能访问 memory)
- DMA传送结束:DMA 发出结束中断通知 CPU
10.3 DMA与CPU的总线分配
| 方式 | 描述 | 优缺点 |
|---|---|---|
| CPU停止法 | DMA 传送期间 CPU 完全不访问总线 | 控制最简单,适合传输率很高的外设;但存储周期未被充分利用 |
| 周期挪用(Cycle Stealing) | DMA “窃取”一个总线周期,传送一个数据;CPU 让出总线 | CPU 和 DMA 交替访问,更灵活 |
| 交替访问 | 将存储周期分成时间片,CPU 和 DMA 按比例轮流使用 | 相对公平 |
10.4 DMA与中断的区别
- 中断:传送每个数据都需要 CPU 介入处理
- DMA:成批数据交换,一旦启动可以连续读写,CPU 只在启动和结束时介入
10.5 缓冲区的设计哲学
Buffer 围绕着整个计算机系统——数据来不及处理时就加个缓冲区暂存。不管做软件还是硬件,这个道理都是相通的。但加了 Buffer 就意味着变成异步——对响应时间的要求就不那么严格了。
补充讨论
区块链的核心思想可通过计算机体系结构中的基本概念理解:通过哈希链(Merkle树)保证数据不可篡改,通过分布式副本保证数据不可删除,通过激励机制(比特币)吸引节点参与。比特币本质上是”奖励的哈希值”,因稀缺性和不可伪造性而被赋予经济价值。