首页/操作系统/05-io/缓冲区管理 🔗 在 Obsidian 中打开
操作系统 · 05-io

缓冲区管理

重要度 ⭐⭐⭐⭐⭐ 操作系统/IO管理缓冲策略单缓冲双缓冲缓冲池磁盘缓存
速查
缓冲用于缓解速度差异、实现 CPU 与 I/O 并行。单缓冲 $\approx T+M+C$(串行);双缓冲 $\max(T, C+M)$ 可缓冲对换;循环缓冲 $\max(T,C)$ 最佳;$in\neq out$ 可写、$in=out$ 满。

速查

项目
核心概念缓冲区管理
关键公式/性质$in\neq out$ 时可继续写入;$in=out$ 时缓冲区满
考试频率⭐⭐⭐⭐

缓冲区的作用

缓冲区是内存中用于临时存储 I/O 数据的区域。

为什么需要缓冲区

  1. 缓解速度差异:CPU 快、I/O 设备慢
  2. 减少中断频率:积攒一定数据再中断
  3. 实现并行:CPU 计算与 I/O 传输重叠
  4. 数据格式转换:不同单位间转换

单缓冲与双缓冲

单缓冲

用户进程         缓冲区          设备
┌──────┐     ┌────────┐     ┌──────┐
│      │ ←── │ 缓冲区  │ ←── │      │
└──────┘     └────────┘     └──────┘

工作过程:① 设备将数据传入缓冲区(T 时间);② 缓冲区数据传入用户区(M 时间);③ CPU 处理数据(C 时间)。

处理时间:CPU 和设备串行时每块耗时 $T + M + C$;CPU 和设备可重叠时,若 $T > C + M$ 耗时约 $T$,否则约 $C + M$。

特点实现简单,但 CPU 和设备不能完全并行。

双缓冲

设备 ──→ 缓冲区1 ──→ 用户进程
             缓冲区2 ←── 设备

工作过程:① 设备向缓冲区 1 传输数据;② 同时 CPU 从缓冲区 2 处理数据;③ 完成后交换角色。

处理时间:$\max(C, T) + M$(近似);当 $C\approx T$ 时 CPU 和设备完全并行

特点CPU 和设备可以并行工作,比单缓冲效率高;也称为缓冲对换(Buffer Swapping)

循环缓冲与缓冲池

循环缓冲

多个缓冲区组成环形;in 指针指向当前输入缓冲区,out 指针指向当前输出缓冲区。使用规则:in 指向下一个可写入的缓冲区,out 指向下一个可读取的缓冲区;$in \neq out$ 时可继续写入;$in = out$ 时缓冲区满。

缓冲池(Buffer Pool)

系统维护一组缓冲区,按用途分为三类队列:

┌──────────────────────────────┐
│           缓冲池              │
│  空缓冲队列: [空1][空2][空3]… │
│  输入队列:   [入1][入2]…(满)  │
│  输出队列:   [出1][出2]…(满)  │
└──────────────────────────────┘

工作过程:输入从空缓冲队列取缓冲区 → 装数据 → 放输入队列;输出从空缓冲队列取缓冲区 → 装数据 → 放输出队列;处理从输入队列取缓冲区 → 处理后放回空队列。

优点缓冲区共享,利用率高;可自适应调整输入输出比例。

磁盘缓冲与性能

磁盘缓冲(Disk Cache)

用内存缓存最近访问的磁盘数据块。置换策略:LRU(最常用)、LFU、预读(顺序访问时提前读取后续块)。

写策略说明优缺点
写穿透同时写缓存和磁盘安全但慢
写回只写缓存,延迟写磁盘快但崩溃可能丢数据

缓冲区与性能计算

设 $T=$ 设备传输时间,$M=$ 缓冲区到用户区时间,$C=$ CPU 处理时间:

方式处理一块时间并行性
单缓冲$\max(T,C)+M$有限
双缓冲$\max(T,C+M)$较好
循环缓冲$\max(T,C)$最好
典型计算磁盘读一块 $T=100\mu s$,缓冲区到用户 $M=50\mu s$,CPU 处理 $C=50\mu s$,双缓冲处理 10 块数据的时间?第一块 $T + M = 150\mu s$;后续 9 块 $\max(T, C+M)=\max(100,100)=100\mu s/块$;总时间 $= 150 + 9\times 100 = 1050\mu s$。
易错双缓冲第一块需 $\max(T, C+M)$ 的已含设备先工作($T+M$);计算时别漏掉首块特殊。

缓冲区溢出(安全)

缓冲区溢出是最常见的安全漏洞之一。

void vulnerable() {
    char buffer[64];
    gets(buffer);  // 无边界检查,可溢出
}

防护措施:① 栈金丝雀(Stack Canary);② ASLR 地址随机化;③ NX 位(数据页不可执行);④ 使用安全函数(strncpy 代替 strcpy)。

记忆卡片

单/双/循环缓冲主要区别?
单:一个缓冲、CPU 和设备串行;双:两个缓冲交替、可并行;循环:多个缓冲循环使用,适合突发流量。
缓冲池的三种队列?
空缓冲队列(未使用)、输入队列(装满输入数据)、输出队列(装满输出数据)。
写穿透和写回的策略区别?
写穿透同时写缓存和磁盘,安全但慢;写回只写缓存延迟写磁盘,快但崩溃可能丢数据。
为什么需要缓冲区?
缓解 CPU 和 I/O 设备速度差异、减少中断频率、实现 CPU 和 I/O 并行、进行数据格式转换。
$in=out$ 表示什么?
循环缓冲满;$in\neq out$ 时可继续写入。

交互动画 · 缓冲结构与缓冲池

单缓冲 / 双缓冲(缓冲对换) 设备传输 T 用户进程处理 C 缓冲区 1填充中… 缓冲区 2处理中… 空缓冲队列 输入队列 输出队列
点击缓冲策略,查看数据流动与时间公式
单缓冲:T+M+C 串行;双缓冲:max(T,C+M) 可并行

相关知识点

device-management io-control-methods

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。