Skip to content

缓冲区管理

考情分析

单缓冲/双缓冲的处理时间计算是计算题考点,缓冲池的概念也常作为选择题出现。🔥🔥🔥 高频。

CPU 处理一个字只要几纳秒,磁盘读一个块却要几毫秒——差了近百万倍。没有缓冲区兜底,CPU 要么饿着等数据,要么数据来了没地方放。

磁盘高速缓存(Disk Cache)

磁盘高速缓存是指利用内存中的存储空间暂存从磁盘读取的数据。它不是 CPU 与主存之间的硬件 Cache,而是操作系统在内存中维护的磁盘数据副本。

两种组织形式

形式说明
固定专用缓存区在内存中开辟固定大小的区域,专门缓存磁盘数据
动态缓冲池利用系统空闲内存作为缓冲池,供请求分页和磁盘 I/O 共享使用

高速缓存 vs 缓冲区

比较磁盘高速缓存缓冲区
目的存放近期访问的磁盘数据副本,加速重复访问暂存正在传输的数据,协调速度差异
数据去向数据可能被多次读取,长期驻留数据被取走后缓冲区即释放
管理者操作系统透明管理操作系统分配,配合 I/O 操作使用

缓冲的目的

目的说明
缓和 CPU 与 I/O 速度矛盾CPU 速度远快于 I/O 设备
减少 CPU 中断次数攒够一批数据再中断
解决数据粒度不匹配设备以块为单位,应用以记录为单位
提高并行性CPU 计算和 I/O 传输可以并行

单缓冲

在内存中设置一个缓冲区。设备将数据写入缓冲区,CPU 从缓冲区取出数据处理。缓冲区就像快递柜——快递员(设备)放进去,你(CPU)有空了再取,双方不用面对面等。

处理一块数据的时间

设:

  • T = 设备将数据传入缓冲区的时间
  • M = 将数据从缓冲区传到用户工作区的时间
  • C = CPU 处理数据的时间
时间线(单缓冲):
设备:  |--T--|      |--T--|
CPU:         |M|--C--|    |M|--C--|

规则:T 和 C 可以并行,但 M 期间缓冲区被占用,设备不能写入。

每处理一块数据的时间 = max(T, C) + M

做题关键

单缓冲中,传入缓冲区(T)和处理数据(C)可以并行,但传出缓冲区(M)不能与 T 并行(因为共用同一个缓冲区)。

双缓冲

设置两个缓冲区,设备写一个缓冲区的同时,CPU 从另一个缓冲区读。

时间线(双缓冲):
设备:  |--T--|--T--|--T--|
CPU:   |M|--C--|M|--C--|

每处理一块数据的时间 = max(T, C+M)

双缓冲比单缓冲快,因为设备和 CPU 可以真正并行工作。

单缓冲 vs 双缓冲

比较单缓冲双缓冲
缓冲区数量12
每块处理时间max(T, C) + Mmax(T, C+M)
并行度T 和 C 可并行T 和 C+M 可并行
双向通信不支持同时收发支持同时收发

计算示例

T=100μs,M=1μs,C=50μs:

  • 单缓冲:max(100, 50) + 1 = 101μs
  • 双缓冲:max(100, 50+1) = 100μs

T=10μs,M=1μs,C=50μs:

  • 单缓冲:max(10, 50) + 1 = 51μs
  • 双缓冲:max(10, 50+1) = 51μs

循环缓冲

将多个缓冲区组成环形队列,设备和 CPU 各有一个指针在环上追赶。

适用于 I/O 速度与处理速度差距较大的场景,提供更多的缓冲空间来平滑速度差异。

缓冲池

系统中设置一个公共缓冲区池,由多个缓冲区组成,按需分配给不同的 I/O 请求。

缓冲池的组成

队列说明
空缓冲队列空闲的缓冲区
输入队列已装满输入数据、等待 CPU 取走的缓冲区
输出队列已装满输出数据、等待设备取走的缓冲区

缓冲池的工作方式

操作取缓冲区放缓冲区
收容输入从空缓冲队列取 → 装入数据挂到输入队列
提取输入从输入队列取 → CPU 处理挂回空缓冲队列
收容输出从空缓冲队列取 → 装入数据挂到输出队列
提取输出从输出队列取 → 输出到设备挂回空缓冲队列

用户缓冲区与内核缓冲区

用户缓冲区

用户进程在读取文件时,预先申请一块内存区域(如一个数组)作为缓冲区。每次 read 系统调用将数据填充到该缓冲区,处理完后再发起下一次 read

核心作用:减少系统调用次数,降低用户态与内核态切换开销。

内核缓冲区

操作系统在内核空间维护的缓冲区。读取流程:

  1. 用户请求读数据 → 先检查内核缓冲区是否已缓存
  2. 命中 → 直接复制到用户缓冲区
  3. 未命中 → 发起磁盘 I/O,挂起当前进程,数据读入内核缓冲区后再复制到用户缓冲区

写操作时,数据先写入内核缓冲区,等积累到一定量或满足刷新条件后才批量写入磁盘。

核心作用:提升磁盘 I/O 效率,对写操作优化效果尤为突出。

考研高频考点

  • 🔥🔥🔥 单缓冲处理时间 = max(T, C) + M
  • 🔥🔥🔥 双缓冲处理时间 = max(T, C+M)
  • 🔥🔥 缓冲池的三个队列及四种操作
  • 🔥🔥 双缓冲可以支持双向同时通信
  • 🔥🔥 磁盘高速缓存 vs 缓冲区的区别
  • 🔥 引入缓冲的四个目的
  • 🔥 用户缓冲区减少系统调用,内核缓冲区提升磁盘 I/O 效率

缓冲解决了速度匹配问题,但多个进程都想用打印机怎么办?下一篇来看设备分配与回收机制。

真题练习

相关真题(6题)

2022Q31选择题2分

中断处理:中断服务程序将数据送入内核缓冲区

2018Q31选择题2分

文件访问优化:提前读、连续簇、延迟写、磁盘缓存都可加速

2015Q28选择题2分

磁盘缓冲:减少磁盘I/O次数,提高访问效率

2013Q27选择题2分

单缓冲:两块数据的处理需要max(T,C)+M+max(T,C)+M+C的时间

2012Q32选择题2分

磁盘I/O优化:设置多个分区不能改善I/O性能

2011Q31选择题2分

单/双缓冲:单缓冲10×max(100,50)+50=1550μs,双缓冲10×100+100=1100μs