五、IO 与磁盘(慢查询、磁盘负载排查)
⭐⭐⭐⭐⭐ Java 后端、Linux 运维、数据库、校招面试高频章节
本章重点:
- IO(输入/输出)
- 四种 IO 控制方式
- DMA(重点)
- 缓冲区(Buffer)
- 缓冲池(Buffer Pool)
- 磁盘寻道调度算法
- SPOOLing(假脱机技术)
一、什么是 IO(Input / Output)
IO(Input / Output):
就是:
计算机与外部设备之间的数据交换。
例如:
输入(Input):
键盘 鼠标 摄像头 网络数据
输出(Output):
显示器 打印机 磁盘 网卡
例如:
Java:
javaFileInputStream FileOutputStream
就是:
IO。
二、为什么 IO 慢?
CPU:
速度:
GHz
内存:
几十GB/s
磁盘:
SSD: 几百MB/s 机械硬盘: 几十MB/s
因此:
程序:
经常:
不是CPU慢。
而是:
IO太慢。
例如:
数据库:
SELECT * ↓ 扫描磁盘 ↓ 几十毫秒
CPU:
真正计算:
只有:
几微秒。
三、IO 控制方式(★★★★★)
操作系统:
如何管理:
CPU 与 IO 设备?
主要:
四种方式。
四、① 程序查询(轮询,Polling)
最早:
CPU:
不停询问设备。
例如:
CPU: 好了没? ↓ 没有 ↓ 好了没? ↓ 没有 ↓ 好了没? ↓ 完成
CPU:
一直等待。
特点
优点:
实现简单。
缺点:
浪费CPU。
CPU:
什么都不能做。
应用
很少使用。
仅适合:
简单设备。
五、② 中断方式(Interrupt IO)(★★★★★)
设备:
完成工作。
主动:
通知CPU。
例如:
CPU: 运行程序 ↓ 磁盘完成 ↓ 发送中断 ↓ CPU处理
CPU:
无需:
一直等待。
工作流程
CPU发起IO ↓ 继续执行其他程序 ↓ 设备完成 ↓ 中断CPU ↓ CPU处理结果
优点
- CPU利用率高
- 不浪费时间
- 应用广泛
例如:
键盘 鼠标 网卡
都采用:
中断。
六、③ DMA(Direct Memory Access)(★★★★★)
DMA:
直接内存访问。
这是:
面试最高频。
为什么需要 DMA?
如果:
磁盘:
读取:
1GB
数据。
CPU:
一字节一字节搬。
效率:
极低。
于是:
增加:
DMA控制器。
工作流程
CPU ↓ 告诉DMA: 读数据 ↓ DMA ↓ 磁盘 ↓ RAM ↓ 完成 ↓ 通知CPU
CPU:
不用:
参与:
数据搬运。
DMA特点
优点:
- CPU利用率高
- 大数据传输速度快
- 减少CPU负担
应用:
- SSD
- 网卡
- 显卡
- 数据库
- 文件系统
总结
| 控制方式 | CPU参与程度 |
|---|---|
| 轮询 | 全程参与 |
| 中断 | 部分参与 |
| DMA | 几乎不参与搬运 |
口诀:
CPU下命令,DMA搬数据。
七、④ 通道(Channel IO)(了解)
大型机:
使用:
IO通道。
实际上:
IO处理器。
CPU:
告诉:
通道:
去完成: 打印 磁盘 网络
通道:
自己完成。
最后:
通知CPU。
现代PC:
较少直接涉及。
了解即可。
八、四种 IO 控制方式总结(★★★★★)
| 控制方式 | CPU利用率 | 特点 |
|---|---|---|
| 程序查询(Polling) | 最低 | CPU一直等待 |
| 中断 IO | 较高 | 设备主动通知 |
| DMA | 很高 | DMA负责搬运数据 |
| 通道 IO | 最高 | IO处理器负责整个过程 |
口诀:
轮询 → 中断 → DMA → 通道,CPU越来越轻松。
九、缓冲区(Buffer)(★★★★★)
什么是缓冲区?
就是:
临时存放数据的内存区域。
例如:
程序:
写文件。
不是:
直接:
写磁盘。
而是:
程序 ↓ Buffer ↓ 磁盘
为什么需要 Buffer?
原因:
CPU:
很快。
磁盘:
很慢。
Buffer:
负责:
协调速度。
举例
没有Buffer:
CPU ↓ 磁盘
CPU:
一直等待。
有Buffer:
CPU ↓ Buffer ↓ 磁盘
CPU:
写完:
继续工作。
磁盘:
慢慢写。
Buffer作用
- 提高速度
- 减少IO次数
- 平衡CPU与磁盘速度
十、缓冲池(Buffer Pool)(★★★★★)
Buffer:
只有:
一个。
效率:
不高。
于是:
多个Buffer:
组成:
Buffer Pool。
例如:
Buffer1 Buffer2 Buffer3 Buffer4
统一管理。
数据库中的 Buffer Pool
MySQL:
InnoDB:
最重要:
就是:
Buffer Pool。
例如:
查询:
SELECT *
先查:
Buffer Pool
如果:
命中:
不用读磁盘。
速度:
提升几十倍。
优点
- 减少磁盘IO
- 提高缓存命中率
- 提升数据库性能
十一、磁盘寻道(Seek)
机械硬盘:
磁头:
必须:
移动。
例如:
磁道 10 ↓ 100 ↓ 35 ↓ 180
移动:
越多。
越慢。
这就是:
寻道时间。
为什么重要?
机械硬盘:
主要耗时:
不是读取。
而是:
移动磁头。
因此:
调度:
十分重要。
十二、磁盘调度算法(★★★★★)
① FCFS(先来先服务)
请求:
按顺序。
例如:
98 ↓ 183 ↓ 37 ↓ 122
依次执行。
优点:
公平。
缺点:
寻道距离大。
② SSTF(最短寻道优先)
距离:
最近。
先执行。
例如:
当前位置:
50
请求:
45 90 180
先:
45。
优点:
平均寻道短。
缺点:
远请求可能长期等待(饥饿)。
③ SCAN(电梯算法)(★★★★★)
磁头:
像电梯。
一直:
向一个方向。
直到:
最边缘。
再返回。
例如:
↓ 10 20 40 80 ↓ 到底 ↑ 回来
优点:
效率高。
应用:
Linux、
Windows:
都有类似思想。
④ C-SCAN(循环扫描)
一直:
向一个方向。
到头:
直接:
回起点。
例如:
↓ 10 20 50 100 ↓ 到头 ↓ 跳回0 ↓ 继续
等待:
更加均匀。
调度算法比较
| 算法 | 特点 |
|---|---|
| FCFS | 简单公平 |
| SSTF | 平均寻道最短 |
| SCAN | 电梯算法,最常见 |
| C-SCAN | 循环扫描,等待更均匀 |
十三、SPOOLing(★★★★★)
中文:
假脱机技术(Simultaneous Peripheral Operations On-Line)。
为什么需要?
例如:
打印机:
一次:
只能打印:
一个任务。
如果:
十个人:
同时打印。
怎么办?
答案:
SPOOLing。
工作流程
用户A ↓ 打印请求 ↓ 磁盘缓冲区 ↓ 打印队列 ↓ 打印机
用户:
不用:
一直等待。
打印:
后台:
慢慢完成。
为什么叫"虚拟设备"?
用户感觉:
自己:
独占:
打印机。
实际上:
所有人:
共享:
同一个打印机。
操作系统:
把:
一台打印机:
"虚拟"成:
多台。
所以:
称:
虚拟设备。
SPOOLing组成
包括:
- 输入井(Input Spool)
- 输出井(Output Spool)
- 输入缓冲区
- 输出缓冲区
- 调度程序
优点
- 提高设备利用率
- 支持共享设备
- 用户无需等待
- 提高系统并发能力
十四、IO 在实际开发中的应用
数据库慢查询
例如:
SQL:
sqlSELECT * FROM user;
问题:
磁盘:
读取:
大量数据。
优化:
- 建索引
- Buffer Pool
- SSD
Java 文件读写
javaBufferedInputStream BufferedOutputStream
使用:
缓冲区。
减少:
磁盘IO。
Linux 查看磁盘 IO
查看:
bashiostat
实时:
bashiotop
磁盘:
使用率:
bashdf -h
十五、本章知识关系图(★★★★★)
程序 ↓ Buffer ↓ DMA ↓ 磁盘
磁盘:
Block ↓ Seek ↓ 读取
大量请求:
↓ 调度算法 ↓ FCFS SSTF SCAN
打印:
↓ SPOOLing ↓ 打印队列 ↓ 打印机
十六、本章重点总结(必背)
四种 IO 控制方式
| 控制方式 | 特点 |
|---|---|
| 轮询 | CPU一直等待 |
| 中断 | 设备主动通知 |
| DMA | DMA搬运数据 |
| 通道 | IO处理器完成全部工作 |
口诀:
轮询→中断→DMA→通道,CPU参与越来越少。
Buffer
作用:
- 缓存数据
- 提高IO速度
- 减少磁盘访问
Buffer Pool
数据库:
例如:
MySQL InnoDB:
最重要:
就是:
Buffer Pool。
磁盘调度
| 算法 | 特点 |
|---|---|
| FCFS | 公平 |
| SSTF | 最近优先 |
| SCAN | 电梯算法(最常见) |
| C-SCAN | 循环扫描 |
SPOOLing
作用:
- 打印共享
- 虚拟设备
- 后台排队
- 提高设备利用率
面试/考试高频问题
Q1:四种 IO 控制方式有什么区别?
答: 轮询由 CPU 不断检查设备状态,效率最低;中断方式由设备完成后主动通知 CPU;DMA 通过 DMA 控制器直接完成设备与内存之间的数据传输,CPU 只负责发起和结束;通道方式则由专门的 IO 处理器完成整个 IO 过程,CPU 参与最少。
Q2:DMA 为什么比中断 IO 更高效?
答: 中断 IO 在数据传输过程中仍需要 CPU 参与搬运数据,而 DMA 由 DMA 控制器直接完成设备与内存之间的数据复制,CPU 无需逐字节处理,因此特别适合大文件、网络和数据库等大量数据传输场景。
Q3:Buffer 和 Buffer Pool 有什么区别?
答: Buffer 是单个缓冲区,用于临时存放数据;Buffer Pool 是多个 Buffer 组成的缓冲池,由系统统一管理,能够缓存更多数据,提高命中率,MySQL InnoDB 就使用 Buffer Pool 来减少磁盘 IO。
Q4:为什么 SCAN(电梯算法)比 FCFS 更高效?
答: FCFS 按请求到达顺序处理,磁头可能频繁来回移动;SCAN 算法让磁头始终朝一个方向移动,到边界后再返回,大幅减少寻道距离,提高磁盘访问效率,因此现代操作系统广泛采用类似思想。
Q5:什么是 SPOOLing(假脱机技术)?
答: SPOOLing 是利用磁盘缓冲区和队列,将独占设备(如打印机)虚拟为多个可共享设备的技术。用户的请求先进入队列,再由操作系统按顺序处理,从而提高设备利用率和系统并发能力。

