IO系统与中断

从IO性能指标到磁盘RAID、总线互连与DMA直接存储器访问

Posted by CloudingYu on June 8, 2026

一、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),完成后再回到原来的程序继续执行。

中断处理的核心步骤:

  1. 关中断 — 保护当前状态
  2. 保护断点和程序状态 — PC 压栈
  3. 识别中断源 — 判断谁发的中断
  4. 执行中断服务程序(ISR)
  5. 恢复现场、返回

9.2 识别中断源的方式

方式 代表 描述
软件识别(查询) RISC-V 跳转到中断入口后,读取 mcause 寄存器,获取异常状态码,用 switch/if-else 跳转到对应处理程序
硬件向量 x86, 8086 中断来了直接知道中断类型号,查中断向量表(IVT)跳转到对应的 ISR

9.3 8259A中断控制器

8259A 是 x86 系统中常用的中断控制器芯片:

  • 可接收8个外部中断请求(IR0–IR7)
  • 支持优先级仲裁
  • 支持中断屏蔽(可设置哪些中断被屏蔽)
  • 将中断请求编码成数据返回给 CPU

9.4 中断响应条件

CPU 能响应中断的条件:

  1. 当前允许中断(开中断)
  2. 当前指令执行完成

关于流水线 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 的三个阶段:

  1. DMA传送前:CPU 设置好起始地址、长度、方向等参数
  2. DMA传送中:CPU 执行其他程序(可以计算,但不能访问 memory)
  3. 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树)保证数据不可篡改,通过分布式副本保证数据不可删除,通过激励机制(比特币)吸引节点参与。比特币本质上是”奖励的哈希值”,因稀缺性和不可伪造性而被赋予经济价值。