Appearance
缓冲区管理
考情分析
单缓冲/双缓冲的处理时间计算是计算题考点,缓冲池的概念也常作为选择题出现。🔥🔥🔥 高频。
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 双缓冲
| 比较 | 单缓冲 | 双缓冲 |
|---|---|---|
| 缓冲区数量 | 1 | 2 |
| 每块处理时间 | max(T, C) + M | max(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。
核心作用:减少系统调用次数,降低用户态与内核态切换开销。
内核缓冲区
操作系统在内核空间维护的缓冲区。读取流程:
- 用户请求读数据 → 先检查内核缓冲区是否已缓存
- 命中 → 直接复制到用户缓冲区
- 未命中 → 发起磁盘 I/O,挂起当前进程,数据读入内核缓冲区后再复制到用户缓冲区
写操作时,数据先写入内核缓冲区,等积累到一定量或满足刷新条件后才批量写入磁盘。
核心作用:提升磁盘 I/O 效率,对写操作优化效果尤为突出。
考研高频考点
- 🔥🔥🔥 单缓冲处理时间 = max(T, C) + M
- 🔥🔥🔥 双缓冲处理时间 = max(T, C+M)
- 🔥🔥 缓冲池的三个队列及四种操作
- 🔥🔥 双缓冲可以支持双向同时通信
- 🔥🔥 磁盘高速缓存 vs 缓冲区的区别
- 🔥 引入缓冲的四个目的
- 🔥 用户缓冲区减少系统调用,内核缓冲区提升磁盘 I/O 效率
缓冲解决了速度匹配问题,但多个进程都想用打印机怎么办?下一篇来看设备分配与回收机制。