Appearance
页框分配与回收
考情分析
页框分配策略与置换范围的组合是选择题常考点,工作集概念偶有考查。🔥🔥 中频。
前面讨论的都是"淘汰谁",但还有一个同样关键的问题:每个进程该分多少页框?分少了频繁缺页,分多了又挤占别人的空间。
最少页框数
每个进程都有一个最少页框数——保证进程正常运行所需的最小页框数。
这个数量取决于指令集架构:
| 决定因素 | 说明 |
|---|---|
| 指令格式 | 一条指令可能引用多个地址,每个地址可能在不同页面 |
| 寻址方式 | 间接寻址可能需要访问额外的页面 |
例如:一条指令本身占 1 页,两个操作数各占 1 页 → 最少需要 3 个页框。
页框分配策略
固定分配 vs 可变分配
| 策略 | 说明 |
|---|---|
| 固定分配 | 进程创建时分配固定数量的页框,运行期间不变 |
| 可变分配 | 根据运行情况动态调整分配给进程的页框数 |
全局置换 vs 局部置换
| 策略 | 说明 |
|---|---|
| 全局置换 | 缺页时可以从所有进程的页面中选择淘汰 |
| 局部置换 | 缺页时只能从本进程的页面中选择淘汰 |
三种有效组合
| 组合 | 可行性 | 说明 |
|---|---|---|
| 固定分配 + 局部置换 | 可行 | 页框数固定,只换自己的页面 |
| 可变分配 + 全局置换 | 可行 | 缺页时从空闲链表或其他进程获取页框 |
| 可变分配 + 局部置换 | 可行 | 根据缺页率动态调整,但只换自己的页面 |
| 不存在 | 全局置换会改变各进程的页框数,与"固定"矛盾 |
考试重点
"固定分配 + 全局置换"不存在——这是选择题的常见陷阱。
三种组合的特点
固定分配 + 局部置换:
- 进程页框数在创建时确定,运行中不变
- 分配太少→频繁缺页;分配太多→浪费内存
- 难以确定最佳页框数
可变分配 + 全局置换:
- 最容易实现,很多 OS 采用
- 系统维护一个空闲页框链表,缺页时优先分配空闲页框
- 空闲页框不足时,从其他进程选页面换出(可能影响其他进程)
可变分配 + 局部置换:
- 根据进程的缺页率动态调整页框数
- 缺页率高→多分配几个页框;缺页率低→回收部分页框
- 实现复杂但效果最好
页面调入策略
何时调入?
| 策略 | 说明 |
|---|---|
| 预调页策略 | 一次调入若干相邻页面(利用空间局部性) |
| 请求调页策略 | 缺页时才调入(按需调入) |
预调页通常用于进程首次装入时;运行过程中以请求调页为主。
从哪里调入?
页面在外存上的位置分为两部分:
| 位置 | 存放内容 |
|---|---|
| 对换区(Swap Area) | 进程被换出的页面,连续分配,I/O 速度快 |
| 文件区(File Area) | 可执行文件的代码和数据,离散分配 |
调入规则:
- 对换区足够大:全部从对换区调入(对换区 I/O 更快,连续分配)
- 对换区不够大:未修改的代码段从文件区调入,修改过的页面从对换区调入
工作集
工作集(Working Set):在某段时间间隔内,进程实际访问的页面集合。可以类比成你桌面上正在翻阅的那几本书——虽然书架上有几百本,但这段时间你真正在用的就这几本。
设窗口大小为 Δ,在时刻 t,工作集 W(t, Δ) 是过去 Δ 次访问中涉及的页面集合。
示例
访问序列:... 2, 6, 1, 5, 7, 7, 7, 7, 5, 1 ...,窗口 Δ=5
在最后一个位置,过去 5 次访问为 7, 7, 7, 5, 1
工作集 = {1, 5, 7},工作集大小 = 3
工作集的意义
- 分配给进程的页框数不应小于工作集大小
- 若页框数 < 工作集大小 → 频繁缺页(抖动)
- 操作系统通过监控工作集来调整页框分配
页面缓冲算法
2025 年大纲新增考点
页框回收与页面缓冲算法是 2025 年新增考点,2012 年真题已涉及。
页面换入/换出的磁盘 I/O 开销是影响虚存性能的关键因素。页面缓冲算法通过在内存中维护两个链表,延迟实际 I/O 操作,从而大幅降低换入/换出频率。
空闲页面链表
当一个未修改的页面需要被换出时,系统不将其写回磁盘,而是直接将该页框挂到空闲页面链表的末尾,但页框中的数据仍然保留。
- 需要新页框时 → 从链表头部取一个空闲页框
- 如果后续有进程再次访问该页面 → 直接从链表中取下复用,无需从磁盘读入
修改页面链表
当一个**已修改(脏页)**的页面需要被换出时,系统不立即写回磁盘,而是将其页框挂到修改页面链表的末尾。
- 等链表中脏页积累到一定数量后 → 批量写回磁盘
- 减少了磁盘写操作次数,降低 I/O 开销
缺页时:空闲页面链表头 ──取页框──► 装入新页面
未修改页换出:页框 ──► 空闲页面链表尾(数据保留)
已修改页换出:页框 ──► 修改页面链表尾(攒批写盘)页面缓冲算法的优点
- 显著降低页面换入/换出频率,减少磁盘 I/O
- 即使采用简单的 FIFO 置换策略也能获得良好性能
- 不需要特殊硬件支持,实现简单高效
页框回收
当系统可分配内存不足时,需要主动回收页框。
| 类别 | 能否回收 |
|---|---|
| 内核页框(内核代码/数据/栈) | 不可回收 |
| 进程页框(代码段/数据段/堆栈/文件映射页/共享内存) | 可以回收 |
Linux 中由守护进程 kswapd 定期检查空闲页框数量,当低于阈值时主动发起回收。不能等到完全耗尽才回收——因为释放脏页需要写盘,而写盘本身需要临时页框作为 I/O 缓冲区,否则会陷入内存分配死锁。
考研高频考点
- 🔥🔥🔥 三种有效组合(固定+局部 / 可变+全局 / 可变+局部),排除固定+全局
- 🔥🔥 工作集的定义与计算
- 🔥🔥 预调页 vs 请求调页
- 🔥🔥 页面缓冲算法的两个链表(空闲页面链表 + 修改页面链表)
- 🔥 最少页框数由指令集决定
- 🔥 页面调入时从文件区还是对换区调入
- 🔥 页框回收由 kswapd 守护进程触发,不能等到完全耗尽
页框分配和置换解决了"内存里放什么"的问题。但文件读写是否一定要经过 read/write 系统调用?下篇来看内存映射文件——一种把文件直接映射到虚拟地址空间的高效方式。