五、IO 与磁盘

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

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

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

本章重点:

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

一、什么是 IO(Input / Output)

IO(Input / Output):

就是:

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

例如:

输入(Input):

键盘鼠标摄像头网络数据

输出(Output):

显示器打印机磁盘网卡

例如:

Java:

java
FileInputStreamFileOutputStream

就是:

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继续执行其他程序设备完成中断CPUCPU处理结果

优点

  • 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:

CPUBuffer磁盘

CPU:

写完:

继续工作。

磁盘:

慢慢写。


Buffer作用

  • 提高速度
  • 减少IO次数
  • 平衡CPU与磁盘速度

十、缓冲池(Buffer Pool)(★★★★★)

Buffer:

只有:

一个。

效率:

不高。

于是:

多个Buffer:

组成:

Buffer Pool。

例如:

Buffer1Buffer2Buffer3Buffer4

统一管理。


数据库中的 Buffer Pool

MySQL:

InnoDB:

最重要:

就是:

Buffer Pool。

例如:

查询:

SELECT *

先查:

Buffer Pool

如果:

命中:

不用读磁盘。

速度:

提升几十倍。


优点

  • 减少磁盘IO
  • 提高缓存命中率
  • 提升数据库性能

十一、磁盘寻道(Seek)

机械硬盘:

磁头:

必须:

移动。

例如:

磁道1010035180

移动:

越多。

越慢。

这就是:

寻道时间。


为什么重要?

机械硬盘:

主要耗时:

不是读取。

而是:

移动磁头。

因此:

调度:

十分重要。


十二、磁盘调度算法(★★★★★)


① FCFS(先来先服务)

请求:

按顺序。

例如:

9818337122

依次执行。

优点:

公平。

缺点:

寻道距离大。


② SSTF(最短寻道优先)

距离:

最近。

先执行。

例如:

当前位置:

50

请求:

4590180

先:

45。

优点:

平均寻道短。

缺点:

远请求可能长期等待(饥饿)。


③ SCAN(电梯算法)(★★★★★)

磁头:

像电梯。

一直:

向一个方向。

直到:

最边缘。

再返回。

例如:

10204080到底回来

优点:

效率高。

应用:

Linux、

Windows:

都有类似思想。


④ C-SCAN(循环扫描)

一直:

向一个方向。

到头:

直接:

回起点。

例如:

102050100到头跳回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
BufferedInputStreamBufferedOutputStream

使用:

缓冲区。

减少:

磁盘IO。


Linux 查看磁盘 IO

查看:

bash
iostat

实时:

bash
iotop

磁盘:

使用率:

bash
df -h

十五、本章知识关系图(★★★★★)

程序BufferDMA磁盘

磁盘:

BlockSeek读取

大量请求:

调度算法FCFSSSTFSCAN

打印:

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
技术博客作者
2977 字 · 0 评论
2026-07-18

评论 (0)

暂无评论,来写第一条吧

登录后发表评论