段页式虚拟存储器

段式的优点在逻辑单位(便于共享和保护),页式的优点在定长(无外部碎片、调度简单)。段页式把两者叠起来:先按逻辑分段,再在段内分页。

代价是查表次数翻倍。 这是段页式唯一的、也是必考的缺点。

机制

地址结构是三段

段号查段表段内页号查页表页内偏移原样照抄

每个段有自己的一张页表,段表项里存的不是段基址,而是该段页表的起始地址和页表长度。

转换过程

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 的段页式几乎只考三件事:地址结构分几段、访存次数、段表项里存什么。计算题极少。

对照速查

页式段式段页式
地址段数223
查表次数112
访存次数(无 TLB)223
外部碎片无有无
内部碎片有无有
共享保护不便方便方便
表项关键字段物理页号段长 + 段基址页表基址 + 页表长度

考点

  • 先分段、段内分页;地址结构 段号 | 段内页号 | 页内偏移
  • 段表项存的是该段页表的基址和长度,不是段基址
  • 无 TLB 时访存 3 次(段表 + 页表 + 取数);TLB 命中则 1 次
  • 消除了外部碎片,仍有内部碎片
  • 段号对程序员可见,段内分页透明
  • 兼具两者优点,代价是表多、访存多

链接