段页式虚拟存储器
段式的优点在逻辑单位(便于共享和保护),页式的优点在定长(无外部碎片、调度简单)。段页式把两者叠起来:先按逻辑分段,再在段内分页。
代价是查表次数翻倍。 这是段页式唯一的、也是必考的缺点。
机制
地址结构是三段
每个段有自己的一张页表,段表项里存的不是段基址,而是该段页表的起始地址和页表长度。
转换过程
flowchart LR VA["段号 | 段内页号 | 页内偏移"] --> ST["段表<br/>(段表基址寄存器定位)"] ST -->|"取出该段的页表基址"| PT["该段的页表"] PT -->|"取出物理页号"| PA["物理页号 | 页内偏移"] PA --> MEM["访问主存取数"] classDef t fill:#fdebd0,stroke:#e67e22 class ST,PT t
访存次数:查段表 1 次 + 查页表 1 次 + 取数 1 次 = 3 次。
加上 TLB 后,若 TLB 命中则只需 1 次访存——TLB 缓存的是”段号+页号 → 物理页号”的最终结果,把前两次查表一并省掉。
每一半各自贡献什么
| 来自 | 贡献 |
|---|---|
| 分段 | 便于共享与保护(按段设权限、按段共享)、支持动态增长、逻辑清晰 |
| 分页 | 消除外部碎片、调入调出单位固定、内存分配简单 |
段内仍有内部碎片(最后一页可能装不满),但没有外部碎片——这是段页式相对纯段式最重要的改进。
边界
段表项存的是页表基址,不是段基址。 这是段页式与纯段式在数据结构上唯一的形式差别,也是最常被考的一处。
段页式的段长以页为单位。 段的长度必须向上取整到页的整数倍,因此段内会有内部碎片。
访存次数是 3 次(无 TLB),不是 2 次。 别忘了最后那一次取数据。多级页表时还要继续加:段页式 + 两级页表 = 4 次。
段页式对程序员的可见性与段式相同:段号可见,段内的分页透明。
408 的段页式几乎只考三件事:地址结构分几段、访存次数、段表项里存什么。计算题极少。
对照速查
| 页式 | 段式 | 段页式 | |
|---|---|---|---|
| 地址段数 | 2 | 2 | 3 |
| 查表次数 | 1 | 1 | 2 |
| 访存次数(无 TLB) | 2 | 2 | 3 |
| 外部碎片 | 无 | 有 | 无 |
| 内部碎片 | 有 | 无 | 有 |
| 共享保护 | 不便 | 方便 | 方便 |
| 表项关键字段 | 物理页号 | 段长 + 段基址 | 页表基址 + 页表长度 |
考点
- 先分段、段内分页;地址结构 段号 | 段内页号 | 页内偏移
- 段表项存的是该段页表的基址和长度,不是段基址
- 无 TLB 时访存 3 次(段表 + 页表 + 取数);TLB 命中则 1 次
- 消除了外部碎片,仍有内部碎片
- 段号对程序员可见,段内分页透明
- 兼具两者优点,代价是表多、访存多
链接
- 🏠 返回总览:计算机组成原理第 3 章:存储系统总览
- ⬅️ 上一节:3.6.3 段式虚拟存储器
- ➡️ 下一节:3.6.5 虚拟存储器与 Cache 的比较
- 🌐 跨科:OS 3.1.5 段页式存储管理
- 📖 名词库:第 3 章名词库