Appearance
408
计算机组成原理
CO-03-11 虚拟存储器(页式/段式/段页式)
一、定位信息
| 项目 | 内容 |
|---|---|
| 所属圈层 | 核心层 |
| 前置知识回顾 | 需了解主存和辅存(磁盘)的层次关系,了解地址的概念(程序中的逻辑地址 vs 物理内存中的物理地址),了解页表的基本作用(地址映射) |
| 知识网络定位 | 本单元是存储器层次结构的最高级抽象——虚拟存储器将主存和辅存统一管理,为每个程序提供一个远大于实际物理内存的虚拟地址空间。虚拟存储器是Cache思想在主存-辅存层次的延伸,TLB(CO-03-12)是其加速机制 |
| 考点热度等级 | H级 — 虚拟存储器的地址转换过程是高频综合题考点,近5年出现≥4次,分值5–10分 |
二、知识点讲解
2.1 虚拟存储器的基本概念
虚拟存储器(Virtual Memory) 是一种通过硬件和操作系统配合,将主存和辅存统一管理的技术。它为每个程序提供一个虚拟地址空间(通常远大于物理内存容量),程序使用虚拟地址访问数据,硬件和操作系统自动将虚拟地址转换为物理地址。
核心思想:
- 程序运行时,不需要将全部内容放入主存
- 只将当前需要的部分(活跃页面/段)放在主存
- 其余部分放在辅存(磁盘),需要时再调入
- 程序员看到的是一个连续的、大的虚拟地址空间,无需关心物理内存的分配
与Cache的类比:
- Cache:CPU和主存之间,块(Block)为单位
- 虚拟存储器:主存和辅存之间,页(Page)或段(Segment)为单位
2.2 页式虚拟存储器
基本概念
- 虚拟地址空间:程序使用的地址空间,分为固定大小的页(Page)
- 物理地址空间:实际主存的地址空间,分为同样大小的页框(Page Frame/物理块)
- 页表(Page Table):记录虚拟页号到物理页框号的映射关系
- 页大小:通常为4KB( 字节),也有2MB、4MB等大页
虚拟地址到物理地址的转换
虚拟地址 = 虚拟页号 + 页内偏移
物理地址 = 物理页框号 + 页内偏移
转换过程:
- 从虚拟地址中提取虚拟页号和页内偏移
- 用虚拟页号查页表,得到物理页框号
- 物理页框号拼接页内偏移,得到物理地址
注意:页内偏移在转换前后不变(因为页和页框大小相同)。
页表项(PTE)的内容
每个页表项包含:
- 物理页框号:该虚拟页对应的物理页框
- 有效位(Valid/Present):该页是否在主存中(1=在主存,0=不在主存/在磁盘)
- 访问位(Reference):该页是否被访问过(用于替换算法)
- 修改位(Dirty):该页是否被修改过(用于写回策略)
- 保护位:读/写/执行权限
缺页中断
当访问的虚拟页不在主存中(有效位=0)时,发生缺页中断(Page Fault):
- 操作系统从磁盘将该页调入主存
- 如果主存已满,需要选择一页替换出去(页面替换算法,如LRU、FIFO、Clock等)
- 如果被替换的页被修改过(脏位=1),需要写回磁盘
- 更新页表
- 重新执行引发缺页的指令
2.3 段式虚拟存储器
基本概念
- 段(Segment):按照程序的逻辑结构划分,每个段有独立的意义(如代码段、数据段、堆栈段)
- 每个段的长度可以不同
- 段表(Segment Table):记录每个段的基址(起始物理地址)和段长
虚拟地址到物理地址的转换
虚拟地址 = 段号 + 段内偏移
转换过程:
- 从虚拟地址中提取段号和段内偏移
- 用段号查段表,得到段基址和段长
- 检查:段内偏移 < 段长(否则越界中断)
- 物理地址 = 段基址 + 段内偏移
2.4 段页式虚拟存储器
基本概念
段页式结合了段式和页式的优点:
- 先分段(按逻辑结构),再将每段分页(固定大小)
- 每个段有自己的页表
虚拟地址到物理地址的转换
虚拟地址 = 段号 + 段内页号 + 页内偏移
转换过程:
- 用段号查段表,得到该段的页表起始地址
- 用段内页号查该段的页表,得到物理页框号
- 物理页框号拼接页内偏移,得到物理地址
需要两次查表(第一次查段表,第二次查页表),速度较慢,通常用TLB加速。
2.5 三种方式的对比
| 对比项 | 页式 | 段式 | 段页式 |
|---|---|---|---|
| 划分单位 | 固定大小的页 | 可变长度的段 | 先分段,再分页 |
| 虚拟地址 | 页号+页内偏移 | 段号+段内偏移 | 段号+页号+页内偏移 |
| 地址转换 | 查页表,1次 | 查段表,1次 | 查段表+页表,2次 |
| 物理地址 | 页框号+偏移 | 基址+偏移 | 页框号+偏移 |
| 内部碎片 | 有(页内) | 无 | 有(页内) |
| 外部碎片 | 无 | 有 | 无 |
| 共享与保护 | 不方便 | 方便(按段共享) | 方便 |
| 硬件支持 | 页表基址寄存器 | 段表基址寄存器 | 段表+页表基址寄存器 |
三、记忆与理解辅助
3.1 口诀记忆
页式口诀:"固定分页查页表,偏移不变框号找"
- 页大小固定,通过查页表将虚拟页号转为物理页框号,页内偏移不变
段式口诀:"逻辑分段查段表,基址加偏移要对"
- 段按逻辑划分,查段表得到基址,物理地址 = 基址 + 段内偏移
段页式口诀:"先查段表找页表,再查页表找框号"
- 两次查表:先段表后页表
3.2 对比表:页式 vs 段式 vs 段页式(重点对比表)
| 特性 | 页式 | 段式 | 段页式 |
|---|---|---|---|
| 划分依据 | 物理(固定大小) | 逻辑(程序结构) | 先逻辑后物理 |
| 页/段大小 | 固定 | 可变 | 页固定,段可变 |
| 地址结构 | 页号+偏移 | 段号+偏移 | 段号+页号+偏移 |
| 查表次数 | 1次 | 1次 | 2次 |
| 内部碎片 | 有 | 无 | 有 |
| 外部碎片 | 无 | 有 | 无 |
| 共享方便性 | 差 | 好 | 好 |
| 实际应用 | Linux、Windows | 较少单独使用 | x86架构 |
3.3 地址转换流程图示
页式地址转换流程(文字描述):
虚拟地址 → [提取页号] → 查页表 → [有效位=1?]
→ 是:取出物理页框号 → 拼接偏移 → 物理地址
→ 否:缺页中断 → 从磁盘调入 → 更新页表 → 重新执行段页式地址转换流程(文字描述):
虚拟地址 → [提取段号] → 查段表 → [越界检查]
→ 未越界:取出页表基址 → [提取页号] → 查页表 → [有效位=1?]
→ 是:取出物理页框号 → 拼接偏移 → 物理地址
→ 否:缺页中断四、例题与精解
例题1(基础)
题目:某计算机采用页式虚拟存储器,虚拟地址32位,物理地址24位,页大小4KB。问: (1)虚拟地址和物理地址如何划分? (2)页表至少有多少个页表项? (3)每个页表项至少需要多少位来存放物理页框号?
命题意图:考查页式虚拟存储器的地址划分基本计算。
审题分析:虚拟地址32位,物理地址24位,页大小4KB = 字节。
解题思路:页内偏移由页大小决定,虚拟页号和物理页框号由剩余位决定。
完整步骤:
(1)地址划分:
- 页内偏移位数 = 位
- 虚拟页号位数 = 位
- 物理页框号位数 = 位
(2)页表项数:
虚拟页号有20位,可表示 个虚拟页。
页表至少有 个页表项(每个虚拟页对应一个页表项)。
(3)物理页框号位数:
物理页框号需要12位(因为物理地址24位 - 偏移12位 = 12位)。
方法反思:
- 页大小决定了偏移位数,页和页框的偏移位数相同。
- 虚拟地址空间越大,页表项越多(页表越大)。
- 物理内存越大,每个页表项中物理页框号的位数越多。
例题2(中等)
题目:某系统采用页式虚拟存储器,页大小为4KB,页表如下(部分):
| 虚拟页号 | 物理页框号 | 有效位 |
|---|---|---|
| 0 | 3 | 1 |
| 1 | — | 0 |
| 2 | 1 | 1 |
| 3 | 0 | 1 |
| 4 | — | 0 |
问: (1)虚拟地址 00003H 对应的物理地址是什么? (2)虚拟地址 01001H 对应的物理地址是什么? (3)访问虚拟地址 02000H 会发生什么?
命题意图:考查页式虚拟存储器的地址转换过程。
审题分析:页大小4KB,偏移12位。虚拟地址用16进制表示。
解题思路:提取虚拟页号和页内偏移,查表转换。
完整步骤:
页大小4KB = 4096 = 1000H,所以页内偏移为地址的低12位(低3位十六进制数)。
(1)虚拟地址 00003H:
- 虚拟页号 = 00003H / 1000H = 0
- 页内偏移 = 00003H mod 1000H = 003H
- 查页表:虚拟页0 → 物理页框3,有效位=1
- 物理地址 = 3 × 1000H + 003H = 3000H + 003H = 3003H
(2)虚拟地址 01001H:
- 虚拟页号 = 01001H / 1000H = 1
- 页内偏移 = 01001H mod 1000H = 001H
- 查页表:虚拟页1 → 有效位=0,该页不在主存中
- 发生缺页中断,操作系统需要从磁盘将该页调入主存
(3)虚拟地址 02000H:
- 虚拟页号 = 02000H / 1000H = 2
- 页内偏移 = 02000H mod 1000H = 000H
- 查页表:虚拟页2 → 物理页框1,有效位=1
- 物理地址 = 1 × 1000H + 000H = 1000H
方法反思:
- 页内偏移 = 虚拟地址 mod 页大小,这个值在转换前后不变。
- 有效位=0表示缺页,需要缺页中断处理。
- 页大小为4KB时,低12位(3位十六进制)是偏移,高位是页号。
五、考情分析
| 项目 | 内容 |
|---|---|
| 近5年考查频次 | ≥4次 |
| 常见题型 | 选择题(三种虚拟存储方式对比)、综合题(地址转换过程、页表计算) |
| 分值占比 | 选择题2分,综合题5–10分 |
| 命题趋势 | 虚拟存储器地址转换是高频大题。近年趋势是将页式虚拟存储器与TLB、Cache结合,出完整的多级地址转换综合题 |
六、易错点提醒
易错点1
- 错误表现:页式虚拟存储器中,认为虚拟页号和物理页框号的位数一定相同
- 错误原因:虚拟地址空间和物理地址空间大小通常不同
- 正确做法:虚拟页号位数 = 虚拟地址位数 - 偏移位数,物理页框号位数 = 物理地址位数 - 偏移位数。两者一般不等
易错点2
- 错误表现:段页式地址转换时,只查一次表就得到物理地址
- 错误原因:忽略了段页式需要两次查表
- 正确做法:段页式先查段表得到页表基址,再查页表得到物理页框号,共两次查表
易错点3
- 错误表现:计算页内偏移时,用虚拟地址除以页大小取余,但计算页号时忘记用除法
- 错误原因:混淆除法和取余的用途
- 正确做法:页号 = 地址 ÷ 页大小(整除),偏移 = 地址 mod 页大小。或者直接按位划分:低 位是偏移,高位是页号
易错点4
- 错误表现:认为页式虚拟存储器没有内部碎片
- 错误原因:混淆了内部碎片和外部碎片
- 正确做法:页式有内部碎片(最后一页可能未填满),但没有外部碎片(页大小固定,不存在"小空闲块无法利用"的问题)。段式相反:无内部碎片,有外部碎片
七、来源标注
- 依据2026考研统考大纲(408-计算机组成原理-第三章"存储器层次结构")
- 依据大学本科经典教材共识:唐朔飞《计算机组成原理》、白中英《计算机组成原理》、Patterson & Hennessy《计算机组成与设计》