五、IO 与磁盘

2026-07-18wei👁 15 阅读8 分钟阅读📝 3539 字💬 0 评论
五、IO 与磁盘

五、IO 与磁盘(慢查询、磁盘负载排查)

⭐⭐⭐⭐⭐ Java 后端、Linux 运维、数据库、校招面试高频章节

本章重点:

  • IO(输入/输出)
  • 四种 IO 控制方式
  • DMA(重点)
  • 缓冲区(Buffer)
  • 缓冲池(Buffer Pool)
  • 磁盘寻道调度算法
  • SPOOLing(假脱机技术)

一、什么是 IO(Input / Output)

IO(Input / Output):

就是:

计算机与外部设备之间的数据交换。

例如:

输入(Input):

键盘 鼠标 摄像头 网络数据 

输出(Output):

显示器 打印机 磁盘 网卡 

例如:

Java:

java
FileInputStream 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:

sql
SELECT * FROM user; 

问题:

磁盘:

读取:

大量数据。

优化:

  • 建索引
  • Buffer Pool
  • SSD

Java 文件读写

java
BufferedInputStream BufferedOutputStream 

使用:

缓冲区。

减少:

磁盘IO。


Linux 查看磁盘 IO

查看:

bash
iostat 

实时:

bash
iotop 

磁盘:

使用率:

bash
df -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 是利用磁盘缓冲区和队列,将独占设备(如打印机)虚拟为多个可共享设备的技术。用户的请求先进入队列,再由操作系统按顺序处理,从而提高设备利用率和系统并发能力。

wei
技术博客作者
3539 字 · 0 评论
2026-07-18

评论 (0)

暂无评论,来写第一条吧

登录后发表评论

分类

友链

关于本站

用 SpringBoot + Nuxt3 搭建的个人技术博客,记录编程之路的思考与收获。

© 2026 好啵博客 · Built with ❤️ & SpringBoot + Nuxt3