| 项目 | 值 |
|---|---|
| 核心概念 | 缓冲区管理 |
| 关键公式/性质 | $in\neq out$ 时可继续写入;$in=out$ 时缓冲区满 |
| 考试频率 | ⭐⭐⭐⭐ |
缓冲区是内存中用于临时存储 I/O 数据的区域。
用户进程 缓冲区 设备 ┌──────┐ ┌────────┐ ┌──────┐ │ │ ←── │ 缓冲区 │ ←── │ │ └──────┘ └────────┘ └──────┘
工作过程:① 设备将数据传入缓冲区(T 时间);② 缓冲区数据传入用户区(M 时间);③ CPU 处理数据(C 时间)。
处理时间:CPU 和设备串行时每块耗时 $T + M + C$;CPU 和设备可重叠时,若 $T > C + M$ 耗时约 $T$,否则约 $C + M$。
设备 ──→ 缓冲区1 ──→ 用户进程
缓冲区2 ←── 设备
工作过程:① 设备向缓冲区 1 传输数据;② 同时 CPU 从缓冲区 2 处理数据;③ 完成后交换角色。
处理时间:$\max(C, T) + M$(近似);当 $C\approx T$ 时 CPU 和设备完全并行。
多个缓冲区组成环形;in 指针指向当前输入缓冲区,out 指针指向当前输出缓冲区。使用规则:in 指向下一个可写入的缓冲区,out 指向下一个可读取的缓冲区;$in \neq out$ 时可继续写入;$in = out$ 时缓冲区满。
系统维护一组缓冲区,按用途分为三类队列:
┌──────────────────────────────┐ │ 缓冲池 │ │ 空缓冲队列: [空1][空2][空3]… │ │ 输入队列: [入1][入2]…(满) │ │ 输出队列: [出1][出2]…(满) │ └──────────────────────────────┘
工作过程:输入从空缓冲队列取缓冲区 → 装数据 → 放输入队列;输出从空缓冲队列取缓冲区 → 装数据 → 放输出队列;处理从输入队列取缓冲区 → 处理后放回空队列。
用内存缓存最近访问的磁盘数据块。置换策略:LRU(最常用)、LFU、预读(顺序访问时提前读取后续块)。
| 写策略 | 说明 | 优缺点 |
|---|---|---|
| 写穿透 | 同时写缓存和磁盘 | 安全但慢 |
| 写回 | 只写缓存,延迟写磁盘 | 快但崩溃可能丢数据 |
设 $T=$ 设备传输时间,$M=$ 缓冲区到用户区时间,$C=$ CPU 处理时间:
| 方式 | 处理一块时间 | 并行性 |
|---|---|---|
| 单缓冲 | $\max(T,C)+M$ | 有限 |
| 双缓冲 | $\max(T,C+M)$ | 较好 |
| 循环缓冲 | $\max(T,C)$ | 最好 |
缓冲区溢出是最常见的安全漏洞之一。
void vulnerable() {
char buffer[64];
gets(buffer); // 无边界检查,可溢出
}
防护措施:① 栈金丝雀(Stack Canary);② ASLR 地址随机化;③ NX 位(数据页不可执行);④ 使用安全函数(strncpy 代替 strcpy)。
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。