首页/操作系统/03-memory/页式存储和段式存储 🔗 在 Obsidian 中打开
操作系统 · 03-memory

页式存储和段式存储

重要度 ⭐⭐ 难度 ⭐⭐⭐考查频率 低 操作系统/内存管理分页分段地址转换页表
速查
页大小为 $2^n$ B 时,逻辑地址低 $n$ 位为页内偏移、高位为页号:$\text{逻辑地址} = \text{页号} + \text{页内偏移}$。分页产生内部碎片、地址一维;分段产生外部碎片、地址二维。

速查

项目
核心概念页大小为 $2^n$ B 时,逻辑地址低 n 位为页内偏移,高位为页号
关键公式 / 性质$\text{逻辑地址} = \text{页号} + \text{页内偏移}$
考试频率⭐⭐⭐⭐

核心概念

页式存储管理:将进程的逻辑地址空间划分为大小相等的页(Page),内存划分为同样大小的页框 / 页帧(Frame)。页和页框从 0 开始编号。进程的最后一页可能产生页内碎片(内部碎片)。

地址转换

  • $\text{逻辑地址} = \text{页号} + \text{页内偏移}$
  • $\text{页号} = \text{逻辑地址} / \text{页大小}$(整除)
  • $\text{页内偏移} = \text{逻辑地址} \bmod \text{页大小}$(取余)
  • $\text{物理地址} = \text{页框号} \times \text{页大小} + \text{页内偏移}$
  • 通过页表查页号 → 页框号的映射

页表:每个进程一张,记录页号到页框号的映射。页表基址寄存器(PTBR)存放页表起始地址。页表项包含:页框号、有效位(在 / 不在内存)、访问位、修改位、保护位。

快表(TLB):联想存储器,按内容查找,速度极快。TLB 命中则直接得到页框号,未命中则查页表并更新 TLB。有效访问时间计算需考虑 TLB 命中率。

两级 / 多级页表:解决页表过大问题。将页表再分页,外层页表常驻内存,内层页表按需调入。地址结构变为:一级页号 | 二级页号 | 页内偏移

段式存储管理:按程序逻辑结构划分为若干段(代码段、数据段等),每段长度不等,有段名和段号。段表记录:段长 + 基址

段页式存储管理:先分段,再在每段内分页。地址结构:段号 | 页号 | 页内偏移。需要三次访存(查段表 → 查页表 → 访目标数据)。

分页:一维地址(硬件自动切分) 页号 P(高位) 页内偏移 W(低 n 位) 分段:二维地址(程序员显式给出段号) 段号 S 段内偏移 W(须与段长比较)
图:分页地址可由硬件按位切分(一维);分段各段长度不等,段内偏移必须与段长做越界检查(二维)。

关键定义

概念定义
页面进程逻辑地址空间划分的等大小单位
页框(帧)物理内存划分的与页面等大小的单位
页表实现页号到页框号映射的数据结构
TLB(快表)高速缓存,存储最近使用的页表项,加速地址转换
页内偏移逻辑地址中页内部分,页式管理中逻辑地址和物理地址的偏移相同
按逻辑意义划分的地址空间单位,各段长度不等
段表记录每段在内存中的起始地址和段长
内部碎片分配单元内未被利用的空间(页式管理产生)
外部碎片内存中无法利用的小空闲分区(段式管理产生)

常见考法

考点说明
逻辑地址 → 物理地址转换给定页表或 TLB,计算物理地址
页表大小计算页表项数 $\times$ 每项大小,注意对齐
有效访问时间计算$EAT = \alpha \times (\text{TLB时间} + \text{内存时间}) + (1-\alpha) \times (\text{TLB时间} + 2 \times \text{内存时间})$,$\alpha$ 为 TLB 命中率
多级页表访存次数k 级页表需 k+1 次访存,有 TLB 则命中只需 1 次
分页 vs 分段对比页大小固定 vs 段长可变、一维 vs 二维地址空间、内部 vs 外部碎片

易错点

注意
  • 页号从 0 开始编号,页大小为 $2^n$ 时,页内偏移占低 n 位,页号占高位。
  • 逻辑地址和物理地址的页内偏移相同(页面和页框等大)。
  • 两级页表中,每个内层页表恰好占一个页面(这是分页的目的)。
  • TLB 和 Cache 是不同概念:TLB 缓存页表项,Cache 缓存数据 / 指令
  • 分段的地址是二维的(段号 + 段内偏移),分页是一维的(线性地址自动算出页号)。
  • 段页式需要 3 次访存:段表 → 页表 → 数据(无 TLB 时)。
  • 注意页面大小的单位换算:$4\text{KB} = 2^{12}\text{B}$,偏移占 12 位。

核心结论

必背
  1. 页大小为 $2^n$ B 时,逻辑地址低 n 位为页内偏移,高位为页号。
  2. n 位页内偏移可寻址 $2^n$ B 的页面,m 位页号可表示 $2^m$ 个页面。
  3. $\text{页表大小} = \dfrac{\text{地址空间}}{\text{页大小}} \times \text{页表项大小}$;若页表超过一页,需多级页表。
  4. 两级页表将页表分为外层和内层,外层页表常驻内存,内层页表可不在内存。
  5. 段式管理便于信息共享和保护(整段共享),页式管理不便于(共享信息可能跨页)。
  6. 有效访问时间(考虑 TLB):$EAT = \alpha\times(t+T) + (1-\alpha)\times(t+2T)$,$t$ 为 TLB 访问时间,$T$ 为内存访问时间。

记忆卡片

页式管理中如何从逻辑地址得到页号和页内偏移?
页号 = 逻辑地址 / 页大小(整除),页内偏移 = 逻辑地址 % 页大小;页大小为 $2^{n}$ 时,低 n 位为偏移,高位为页号。
分页和分段各产生什么类型的碎片?
分页产生内部碎片(页内未利用空间),分段产生外部碎片(内存中的小空闲分区)。
两级页表需要几次访存(无 TLB 时)?
3 次(外层页表 → 内层页表 → 目标数据);k 级页表需要 k+1 次访存。
有效访问时间 EAT 的计算公式(考虑 TLB)?
$EAT = \alpha\times(t+T) + (1-\alpha)\times(t+2T)$,$\alpha$ 为 TLB 命中率,$t$ 为 TLB 访问时间,$T$ 为内存访问时间。
分页的地址空间是几维的?分段呢?
分页是一维的(线性地址自动算出页号),分段是二维的(需要段号 + 段内偏移)。

交互动画 · 三种存储管理的地址变换

第 0 步
逻辑地址结构 页号 P高位 页内偏移 W低 n 位 PTBR页表基址 页表[P]→ 页框号 F 拼接 F ∥ W偏移原样保留 段号 S程序员可见 段内偏移 W须 < 段长 STBR段表基址 段表[S]段长 C | 基址 B 越界检查 W < C ?否则产生越界中断 段号 S先分段 页号 P段内再分页 页内偏移 W低 n 位 段表[S]→ 页表基址 页表[P]→ 页框号 F 拼接 F ∥ W最后一次访存取数
逻辑地址 → 拆字段 → 查表 → 拼物理地址,逐步演示
点击「播放」或「下一步」:分页 / 分段 / 段页式的地址变换逐步演示
第 1~4 步分页查页表;第 5~7 步分段查段表;第 8 步段页式对比。
地址字段 表项 变换结果 访存次数
示意图:三种管理方式的差别只在"中间查几张表"——分页查页表、分段查段表并做越界检查、段页式先段表再页表。

相关知识点

virtual-memory virtual-memory-management

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