文章目录
- 计算机虚拟存储管理与页面置换算法详解
-
- [一、虚拟存储管理(Virtual Memory Management)](#一、虚拟存储管理(Virtual Memory Management))
-
- [1.1 基本概念](#1.1 基本概念)
- [1.2 核心特征](#1.2 核心特征)
- [1.3 实现方式](#1.3 实现方式)
- [1.4 页表结构](#1.4 页表结构)
- [二、页面置换算法(Page Replacement Algorithms)](#二、页面置换算法(Page Replacement Algorithms))
-
- [2.1 最优页面置换算法(OPT, Optimal)](#2.1 最优页面置换算法(OPT, Optimal))
- [2.2 最近最久未使用置换算法(LRU, Least Recently Used)](#2.2 最近最久未使用置换算法(LRU, Least Recently Used))
- [2.3 最不常用算法(LFU, Least Frequently Used)](#2.3 最不常用算法(LFU, Least Frequently Used))
- [2.4 时钟页面置换算法(Clock / 最近未用算法 NRU)](#2.4 时钟页面置换算法(Clock / 最近未用算法 NRU))
- [2.5 先进先出算法(FIFO, First In First Out)](#2.5 先进先出算法(FIFO, First In First Out))
- 三、页面置换的抖动现象(Thrashing)
-
- [3.1 定义](#3.1 定义)
- [3.2 产生原因](#3.2 产生原因)
- [3.3 解决方法](#3.3 解决方法)
- 四、页表关键字段详解
-
- [4.1 页号(Page Number)](#4.1 页号(Page Number))
- [4.2 页帧号(Frame Number)](#4.2 页帧号(Frame Number))
- [4.3 状态位(存在位 / Present Bit)](#4.3 状态位(存在位 / Present Bit))
- [4.4 访问位(Access Bit / Reference Bit)](#4.4 访问位(Access Bit / Reference Bit))
- [4.5 修改位(脏位 / Dirty Bit)](#4.5 修改位(脏位 / Dirty Bit))
- 五、图片题目解析
计算机虚拟存储管理与页面置换算法详解
一、虚拟存储管理(Virtual Memory Management)
1.1 基本概念
虚拟存储器 是一种内存管理技术,它使得应用程序认为自己拥有连续且足够大的内存空间,而实际上物理内存(RAM)可能远小于程序所需的地址空间。虚拟内存通过请求调页(Demand Paging)和页面置换 机制,将暂时不用的页面换出到外存(磁盘交换区),从而从逻辑上扩充内存容量。
1.2 核心特征
| 特征 | 说明 |
|---|---|
| 离散性 | 程序在内存中分散存放,无需连续 |
| 多次性 | 程序可分多次调入内存运行 |
| 对换性 | 程序在运行过程中可与外存交换 |
| 虚拟性 | 逻辑上扩充内存,用户感知到的内存远大于物理内存 |
1.3 实现方式
- 请求分页(Demand Paging):最常用的方式,仅当页面被访问时才调入内存
- 请求分段(Demand Segmentation):按逻辑段进行调度和置换
- 段页式:结合分段和分页的优点
1.4 页表结构
在请求分页系统中,页表除了记录页帧号映射外,还增加了若干状态位用于支持虚拟存储管理:
| 字段 | 作用 |
|---|---|
| 页帧号 | 物理内存块号 |
| 状态位(存在位) | 标识该页是否在物理内存中 |
| 访问位 | 记录该页近期是否被访问过 |
| 修改位(脏位) | 记录该页调入内存后是否被修改过 |
| 外存地址 | 该页在磁盘上的存放位置 |
二、页面置换算法(Page Replacement Algorithms)
当程序访问的页面不在内存(缺页中断 )且物理内存已满时,系统必须选择一个已在内存中的页面将其换出,以腾出空间。选择哪个页面淘汰,就是页面置换算法要解决的问题。
2.1 最优页面置换算法(OPT, Optimal)
思想 :淘汰将来最长时间内不会被访问的页面。
特点:
- 理论上性能最好,缺页率最低
- 无法实现,因为无法预知未来的页面访问序列
- 通常作为评价其他算法性能的上限基准
示例 :访问序列 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5,内存3块
- 当需要调入4时,1和2近期还会用到,3最久不用,故淘汰3
2.2 最近最久未使用置换算法(LRU, Least Recently Used)
思想 :淘汰最近一段时间内最久没有被访问的页面。基于"局部性原理",认为最近被访问的页面将来也更可能被访问。
实现方式:
- 计数器法:每个页面记录上次访问时间,淘汰时间最久的
- 栈法:维护一个页面栈,访问时移到栈顶,淘汰栈底
特点:
- 性能接近OPT,是实际应用中较好的算法
- 开销较大,需要硬件支持(如移位寄存器)或软件维护访问时间
2.3 最不常用算法(LFU, Least Frequently Used)
思想 :淘汰访问次数最少的页面。
实现方式:
- 每个页面设置访问计数器,每次访问时加1
- 需要置换时选择计数器值最小的页面淘汰
特点:
- 与LRU不同:LRU看"时间远近",LFU看"频率高低"
- 问题:可能淘汰早期频繁使用但近期不再用的页面(可通过"老化"机制改进,即定期将计数器右移)
2.4 时钟页面置换算法(Clock / 最近未用算法 NRU)
思想 :将内存中的页面组织成循环队列(像时钟一样),每个页面有一个访问位。当页面被访问时,访问位置1。
置换过程:
- 指针顺时针扫描页面
- 若遇到访问位为1的页面,将其置0,继续扫描
- 若遇到访问位为0的页面,将其淘汰
- 若一轮扫描全是1,则全部清0,第二轮一定能找到淘汰页
特点:
- 近似LRU的实现,性能较好
- 开销小,只需维护一个访问位和循环指针
- 是Linux等操作系统实际采用的算法基础
2.5 先进先出算法(FIFO, First In First Out)
思想 :淘汰最先进入内存的页面。
实现方式:
- 维护一个先进先出队列
- 新页面加入队尾,淘汰队首
特点:
- 实现最简单,开销最小
- 性能较差,可能淘汰经常使用的页面
- Belady异常:对于FIFO,增加物理块数反而可能导致缺页次数增加(其他算法如LRU、OPT不会出现)
三、页面置换的抖动现象(Thrashing)
3.1 定义
抖动(Thrashing) 是指系统频繁发生页面换入换出,导致大部分时间都花在页面置换上,而实际执行计算的时间极少,系统吞吐量急剧下降的现象。
3.2 产生原因
根本原因是:进程分配的物理块数过少,导致其工作集(Working Set,即某段时间内频繁访问的页面集合)无法全部驻留内存。
具体过程:
- 进程缺页率升高 → 频繁请求调页
- CPU利用率下降 → 系统认为需要加载更多进程
- 新进程抢占内存 → 原进程物理块更少
- 缺页率进一步恶化 → 恶性循环
3.3 解决方法
| 方法 | 说明 |
|---|---|
| 工作集模型 | 为每个进程分配足够容纳其工作集的物理块 |
| L=S准则 | 调整多道程序度,使缺页间隔时间等于页面处理时间 |
| 挂起进程 | 暂时将部分进程换出到外存,释放内存 |
| 局部置换策略 | 进程缺页时只从自己的物理块中选择淘汰,不影响其他进程 |
四、页表关键字段详解
结合题目中的页表结构,详细解释各字段含义:
4.1 页号(Page Number)
- 逻辑地址的高位部分
- 标识程序虚拟地址空间中的第几个页面
- 本题中进程有4个页面,页号为 0、1、2、3
4.2 页帧号(Frame Number)
- 物理内存中的块号(页框号)
- 页号通过页表映射到页帧号,从而定位物理地址
- 若页面不在内存,页帧号为空(如本题页号1显示为
---)
4.3 状态位(存在位 / Present Bit)
| 值 | 含义 |
|---|---|
| 0 | 该页面不在物理内存中(在外存磁盘上) |
| 1 | 该页面已在物理内存中 |
- 访问页面时先查状态位,若为0则触发缺页中断
- 本题中页号1的状态位为0,说明它不在内存
4.4 访问位(Access Bit / Reference Bit)
| 值 | 含义 |
|---|---|
| 0 | 该页面近期未被访问过 |
| 1 | 该页面近期被访问过 |
- 用于时钟算法 和LRU近似算法判断页面活跃程度
- 系统会定期将所有访问位清0
4.5 修改位(脏位 / Dirty Bit)
| 值 | 含义 |
|---|---|
| 0 | 页面调入内存后未被修改过(与磁盘内容一致) |
| 1 | 页面调入内存后已被修改过(与磁盘内容不一致) |
- 淘汰代价的关键指标 :
- 修改位=0:页面与磁盘一致,淘汰时直接丢弃 ,无需写回磁盘,代价小
- 修改位=1:页面已被修改,淘汰时必须写回磁盘 才能保存修改内容,代价大(需要磁盘I/O)
五、图片题目解析
5.1 题目信息整理
已知条件:
- 进程有4个页面,页号 0~3
- 系统分配了 3个存储块(即物理内存只能同时存放3个页面)
- 当前各页面状态如下表:
| 页号 | 页帧号 | 状态位 | 访问位 | 修改位 |
|---|---|---|---|---|
| 0 | 6 | 1 | 1 | 1 |
| 1 | --- | 0 | 0 | 0 |
| 2 | 3 | 1 | 1 | 1 |
| 3 | 2 | 1 | 1 | 0 |
位含义:
- 状态位:0=不在内存,1=在内存
- 访问位:0=未访问过,1=访问过
- 修改位:0=未修改过,1=修改过
问题:
当访问的页面1不在内存时,淘汰表中页号为( )的页面代价最小。
选项:A. 0 B. 1 C. 2 D. 3
5.2 解题步骤
第一步:确定哪些页面在内存中
根据状态位判断:
- 页号0:状态位=1 → 在内存
- 页号1:状态位=0 → 不在内存(这正是要访问的缺页)
- 页号2:状态位=1 → 在内存
- 页号3:状态位=1 → 在内存
因此,已在内存中的页面是:0、2、3。淘汰只能在这三个中选择。
第二步:分析淘汰代价
页面淘汰的"代价"主要指I/O开销:
- 若页面被修改过(修改位=1),淘汰时必须写回磁盘 ,产生一次磁盘I/O,代价大
- 若页面未被修改(修改位=0),淘汰时直接丢弃 ,无需写回磁盘,代价小
检查三个候选页面的修改位:
- 页号0:修改位=1 → 已修改,淘汰需写回磁盘 ❌
- 页号2:修改位=1 → 已修改,淘汰需写回磁盘 ❌
- 页号3:修改位=0 → 未修改,淘汰可直接丢弃 ✅
第三步:结论
页号3的修改位为0,表示该页面自调入内存以来未被修改 ,与磁盘上的副本完全一致。淘汰页号3时无需执行磁盘写操作 ,因此代价最小。
答案:D. 3
5.3 类似题目讲解
【练习题】
某进程有5个页面,页号为0~4,系统为其分配了3个物理块。当前各页面在页表中的状态如下:
| 页号 | 页帧号 | 状态位 | 访问位 | 修改位 |
|---|---|---|---|---|
| 0 | 5 | 1 | 1 | 1 |
| 1 | --- | 0 | 0 | 0 |
| 2 | 8 | 1 | 0 | 1 |
| 3 | 2 | 1 | 1 | 0 |
| 4 | --- | 0 | 0 | 0 |
现程序试图访问页号1,发生缺页中断。请问:
- 需要从哪些页号中选择淘汰页面?
- 若按照"淘汰代价最小"原则,应该淘汰哪个页面?为什么?
- 若系统采用时钟(Clock)算法,指针当前指向页号2,应该淘汰哪个页面?请描述扫描过程。
【答案与解析】
第1问:候选淘汰页面
根据状态位=1(在内存)的页面:页号 0、2、3。
页号1和4本身就不在内存,无需淘汰。
第2问:按代价最小原则
比较三个候选页面的修改位:
| 页号 | 修改位 | 淘汰代价 |
|---|---|---|
| 0 | 1 | 需写回磁盘,代价大 |
| 2 | 1 | 需写回磁盘,代价大 |
| 3 | 0 | 无需写回磁盘,代价小 |
应淘汰页号3,因为修改位为0,淘汰时直接丢弃即可,不产生磁盘I/O。
第3问:时钟算法扫描过程
时钟算法只看访问位,规则:访问位为1则清0并跳过,访问位为0则淘汰。
当前指针指向页号2,各在内存页面的访问位:
- 页号0:访问位=1
- 页号2:访问位=0
- 页号3:访问位=1
扫描过程:
- 指针指向页号2,访问位=0 → 直接淘汰页号2
因此时钟算法会选择淘汰页号2。
对比总结:同一场景下,"代价最小"原则选页号3(省磁盘I/O),而时钟算法选页号2(最近未被访问)。这体现了不同置换策略的侧重点不同。