页框分配
上一节解决了”缺页了怎么办”,但回避了一个前置问题:每个进程到底该分几个页框?
这个数字影响巨大:给少了缺页频繁,给多了又挤占别人。本节讲的就是分多少和在哪个范围里换。
机制
驻留集
驻留集指请求分页存储管理中,给进程分配的物理页框的集合(即该进程在内存中的页面集合)。
驻留集大小的影响非常直接:
- 驻留集太小 → 缺页频繁,进程大部分时间在等待调页,执行效率骤降,严重时导致抖动。
- 驻留集太大 → 单个进程的缺页率确实降低了,但内存中能容纳的进程数减少,多道程序度下降,CPU 可能因为无进程可调度而空闲,系统整体吞吐量反而下降。
这是一个典型的”局部最优 vs 全局最优”的矛盾:对单个进程好的,未必对系统整体好。
而且驻留集与缺页率的关系不是线性的——增大到一定程度后,继续增加页框对降低缺页率的效果会急剧减弱(因为该进程当前活跃的那部分页已经全在内存里了)。这个”够用的大小”就是工作集要回答的问题。
两组正交的策略
页框分配涉及两个互相独立的决定,务必分开理解:
第一个决定:分配策略——驻留集大小是否可变?
- 固定分配:进程运行期间驻留集大小保持不变。
- 可变分配:驻留集大小可以动态调整。
第二个决定:置换策略——换出的页从哪个范围里选?
- 局部置换:只能从该进程自己的页面中选择淘汰对象。
- 全局置换:可以从内存中所有可换出的页面里选(包括别的进程的)。
两两组合本应有四种,但其中一种在逻辑上不成立:
| 局部置换 | 全局置换 | |
|---|---|---|
| 固定分配 | ✅ 固定分配局部置换 | ❌ 不存在 |
| 可变分配 | ✅ 可变分配局部置换 | ✅ 可变分配全局置换 |
为什么”固定分配全局置换”不存在:
全局置换意味着可以抢占别的进程的页框。一旦发生抢占,被抢者的驻留集就变小了,抢占者的驻留集就变大了——这直接违背了”固定分配”(大小不变)的定义。
两者在定义上互相矛盾,所以这个组合不可能成立。 这是本节最常考的一个点。
三种可行策略的对比
① 固定分配局部置换
进程一开始分到固定数目的页框,缺页时只能淘汰自己的页。
- 优点:实现简单,各进程互不干扰。
- 缺点:难以在一开始就确定合适的数目。给少了这个进程一直缺页,给多了浪费——而且无法根据运行情况调整。
② 可变分配全局置换
系统维护一个空闲页框队列。进程缺页时先从空闲队列取;队列空了,就从内存中任选一页换出(可能属于别的进程)。
- 优点:实现简单,缺页的进程总能立刻得到页框。
- 缺点:盲目性大。被抢走页框的那个进程完全无辜,它的驻留集莫名其妙变小了,缺页率随之上升。一个进程的缺页可能引发另一个进程的缺页,容易连锁。
③ 可变分配局部置换
进程缺页时只能淘汰自己的页;但系统会根据缺页率动态调整它的驻留集大小:
-
缺页率过高 → 说明页框不够 → 多分配几个
-
缺页率过低 → 说明分多了 → 适当收回几个
-
优点:既避免了抖动,又保持了较高的多道程序度,是三者中最合理的。
-
缺点:实现复杂,开销较大(要持续统计各进程的缺页率)。
物理页框的分配算法
在多个进程之间分配总页框数,有三种做法:
平均分配:所有进程平分。问题是没考虑进程大小差异——一个 10 页的小进程和一个 200 页的大进程分到同样多页框,对大进程极不公平。
按比例分配:按各进程的页面数(大小)比例分配。比平均分配合理。
优先权分配:按优先级分配,重要进程多分。实际系统常用折中方案——一部分按比例分,一部分按优先级分。
边界
分配策略与置换策略是两个维度
初学时最容易把”固定/可变”和”局部/全局”混为一谈。它们回答的是完全不同的两个问题:
- 固定 / 可变问的是:驻留集的大小会不会变?
- 局部 / 全局问的是:淘汰对象从哪个集合里选?
只有认清这是两个正交维度,才能理解为什么”固定分配 + 全局置换”是自相矛盾的——全局置换必然改变驻留集大小,而固定分配禁止改变。
全局置换必然导致驻留集变化
这条是上一条的推论,但值得单独记:
只要采用全局置换,驻留集大小就一定会变。 抢别人的页框,自己的驻留集变大;被别人抢,自己的驻留集变小。
因此全局置换只能配可变分配。
驻留集大小与系统吞吐量不成正比
这是个反直觉点。给每个进程更多页框,单个进程的缺页率下降,但系统吞吐量可能反而下降——因为内存中放得下的进程变少了,CPU 更容易无事可做。
系统追求的是全局最优:找到那个让”缺页开销”和”多道程序度”取得平衡的驻留集大小。这正是工作集模型要解决的问题。
可变分配局部置换 vs 可变分配全局置换
两者都会调整驻留集,但调整的时机和方式完全不同:
- 可变分配局部置换:主动调整。系统持续监测缺页率,有依据地增减页框。
- 可变分配全局置换:被动变化。谁缺页谁抢,没有任何评估,被抢的那个只能自认倒霉。
一句话:前者是”按需调控”,后者是”先到先得”。 所以前者效果好但复杂,后者简单但盲目。
对照速查
| 分配策略 | 置换策略 | |
|---|---|---|
| 回答的问题 | 驻留集大小变不变 | 从哪个范围选淘汰页 |
| 两个取值 | 固定 / 可变 | 局部 / 全局 |
| 组合 | 是否成立 | 特点 |
|---|---|---|
| 固定分配 + 局部置换 | ✅ | 简单;初始数目难确定,无法调整 |
| 固定分配 + 全局置换 | ❌ 不存在 | 全局置换必然改变驻留集,与固定矛盾 |
| 可变分配 + 全局置换 | ✅ | 简单;盲目,易连锁引发他人缺页 |
| 可变分配 + 局部置换 | ✅ | 最合理;按缺页率调控,实现复杂 |
| 分配算法 | 依据 | 问题 |
|---|---|---|
| 平均分配 | 进程数 | 未考虑进程大小差异 |
| 按比例分配 | 进程页面数 | 较合理 |
| 优先权分配 | 优先级 | 常与按比例折中使用 |
考点
- 驻留集的定义,以及太大太小各自的后果
- “固定分配全局置换”不存在及其原因(定义互相矛盾)
- 三种可行组合的优缺点,可变分配局部置换最合理
- 可变分配局部置换按缺页率调控(主动),全局置换是先到先得(被动)
- 三种分配算法,平均分配未考虑进程大小
链接
- 🏠 返回总览:操作系统第 3 章:内存管理总览
- ⬅️ 上一节:3.2.2 请求分页管理方式
- ➡️ 下一节:3.2.4 页面置换算法
- 🔗 驻留集该多大,见 3.2.5 抖动和工作集
- 📖 名词库:第 3 章名词库