📚 从图书馆借书聊内存管理:页式、段式与快表

在操作系统里,页式存储管理段式存储管理快表(TLB) 常常让人觉得抽象难懂。
今天,我们不妨用一个生活中的场景 —— 在图书馆借书 —— 来聊聊这三个概念。


1. 页式存储管理:切成小册子的书

想象一下,图书馆里的每本书都被硬生生切割成 固定大小的小册子,比如每册 50 页。
无论是小说还是字典,都要严格按照这个标准分册,然后把这些小册子随机放到不同书架。

读者如果要借 第 1 本书的第 120 页,就得这样找:

  1. 先确定这是 第几册(120 ÷ 50 = 第 2 册)。
  2. 再查“索引表”(页表),找到第 2 册存放的书架编号。
  3. 最后在小册子里定位到第 20 页(页内地址)。

📌 公式

1
物理地址 = (物理块号 × 页大小) + 页内地址

✅ 优点:管理方便,无外部碎片。
❌ 缺点:逻辑被打散,不符合程序结构。


2. 段式存储管理:按章节保存的书

另一位图书馆管理员更讲究逻辑:

  • 小说保留“引言、正文、附录”;
  • 字典按“A-C”、“D-F” 来分卷;
  • 每个部分就是一个“段”,大小不一样。

读者要借 正文里的第 30 页

  1. 先告诉管理员“正文”这个段。
  2. 管理员在“段表”里查到正文的 起始位置和长度
  3. 确认没有越界后,定位到第 30 页。

📌 公式

1
2
物理地址 = 段基址 + 段内地址
(需检查 段内地址 ≤ 段长)

✅ 优点:符合程序逻辑,支持共享与保护。
❌ 缺点:可能产生外部碎片。


3. 快表(TLB):管理员的小抄

聪明的管理员发现,有些段或小册子经常被借。
于是他在桌上放了一个“小本子”,随手记下最近常用的索引。

  • 命中:立刻找到,不必去翻大索引。
  • 未命中:只能去查完整的页表或段表,并把结果更新到本子。

📌 快表本质

  • 它不是新的管理方法
  • 它是对地址转换的 缓存加速器

4. 直观对比

![Paged vs Segmentation vs TLB](/Gallery/Vignette/Paged vs Segmentation vs TLB.jpeg)

  • Paged:把书切成小册子,方便管理。
  • Segmentation:按章节保存,更符合逻辑。
  • TLB:管理员的小抄,加快查找速度。

5. 公式对比表

管理方式 地址结构 转换公式 特点
页式存储管理 (页号 p, 页内地址 d) 物理地址 = (物理块号 × 页大小) + 页内地址 消除了外部碎片,管理方便,但内容被拆散
段式存储管理 (段号 s, 段内地址 w) 物理地址 = 段基址 + 段内地址 (需检查 w ≤ 段长) 符合逻辑结构,支持共享与保护,但可能产生外部碎片
快表(TLB) 页号/段号 + 偏移 命中:直接得到物理块号/段基址;未命中:访问完整页表/段表 缓存加速工具,不改变存储方式,只优化访问速度

6. 考点注意事项

  1. 页式 vs 段式 区别

    • 页大小固定,段大小可变。
    • 页表项只存物理块号,段表项要存基址和段长。
    • 页式只需检查“页号范围”;段式还要检查“段内地址 ≤ 段长”。
  2. 快表考点

    • 快表用于加速页表或段表查找,本质是缓存(常考“是否新的存储方式?” → 不是)。
    • 命中时减少一次内存访问,未命中时要访问快表 + 主存。
  3. 常见易错点

    • 页式没有外部碎片,但有内部碎片。
    • 段式可能产生外部碎片,但不会有内部碎片。

🎯 小练习

题目 1:
某系统采用页式存储管理,页面大小为 1KB
逻辑地址共 14 位,其中页号占 6 位
问:

  1. 页内地址占多少位?
  2. 系统最多可有多少个逻辑页?
  3. 最大逻辑地址空间是多少?

题目 2:
某进程采用段式存储管理。

  • 段表如下(基址以字节为单位):
段号 基址 段长
0 2000 600
1 4000 1000
2 8000 1200

如果逻辑地址为:

  1. (1, 700)
  2. (2, 1500)

请判断能否访问,并给出物理地址。


✅ 答案解析(点我展开)

题目 1 解答:

  1. 页面大小 = 1KB = 2^10 → 页内地址 = 10 位
  2. 页号 = 6 位 → 页数 = 2^6 = 64 页
  3. 总逻辑空间 = 页数 × 页面大小 = 64 × 1KB = 64KB

题目 2 解答:

  1. (1, 700) → 段 1 长度 = 1000,700 < 1000 ✅ 合法
    物理地址 = 基址 4000 + 700 = 4700
  2. (2, 1500) → 段 2 长度 = 1200,1500 > 1200 ❌ 越界错误