Skip to content

页框分配与回收

考情分析

页框分配策略与置换范围的组合是选择题常考点,工作集概念偶有考查。🔥🔥 中频。

前面讨论的都是"淘汰谁",但还有一个同样关键的问题:每个进程该分多少页框?分少了频繁缺页,分多了又挤占别人的空间。

最少页框数

每个进程都有一个最少页框数——保证进程正常运行所需的最小页框数。

这个数量取决于指令集架构

决定因素说明
指令格式一条指令可能引用多个地址,每个地址可能在不同页面
寻址方式间接寻址可能需要访问额外的页面

例如:一条指令本身占 1 页,两个操作数各占 1 页 → 最少需要 3 个页框。

页框分配策略

固定分配 vs 可变分配

策略说明
固定分配进程创建时分配固定数量的页框,运行期间不变
可变分配根据运行情况动态调整分配给进程的页框数

全局置换 vs 局部置换

策略说明
全局置换缺页时可以从所有进程的页面中选择淘汰
局部置换缺页时只能从本进程的页面中选择淘汰

三种有效组合

组合可行性说明
固定分配 + 局部置换可行页框数固定,只换自己的页面
可变分配 + 全局置换可行缺页时从空闲链表或其他进程获取页框
可变分配 + 局部置换可行根据缺页率动态调整,但只换自己的页面
固定分配 + 全局置换不存在全局置换会改变各进程的页框数,与"固定"矛盾

考试重点

"固定分配 + 全局置换"不存在——这是选择题的常见陷阱。

三种组合的特点

固定分配 + 局部置换

  • 进程页框数在创建时确定,运行中不变
  • 分配太少→频繁缺页;分配太多→浪费内存
  • 难以确定最佳页框数

可变分配 + 全局置换

  • 最容易实现,很多 OS 采用
  • 系统维护一个空闲页框链表,缺页时优先分配空闲页框
  • 空闲页框不足时,从其他进程选页面换出(可能影响其他进程)

可变分配 + 局部置换

  • 根据进程的缺页率动态调整页框数
  • 缺页率高→多分配几个页框;缺页率低→回收部分页框
  • 实现复杂但效果最好

页面调入策略

何时调入?

策略说明
预调页策略一次调入若干相邻页面(利用空间局部性)
请求调页策略缺页时才调入(按需调入)

预调页通常用于进程首次装入时;运行过程中以请求调页为主。

从哪里调入?

页面在外存上的位置分为两部分:

位置存放内容
对换区(Swap Area)进程被换出的页面,连续分配,I/O 速度快
文件区(File Area)可执行文件的代码和数据,离散分配

调入规则:

  1. 对换区足够大:全部从对换区调入(对换区 I/O 更快,连续分配)
  2. 对换区不够大:未修改的代码段从文件区调入,修改过的页面从对换区调入

工作集

工作集(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 系统调用?下篇来看内存映射文件——一种把文件直接映射到虚拟地址空间的高效方式。

真题练习

相关真题(5题)

2025Q28选择题2分

最少页框数:由指令寻址方式决定,需保证一条指令执行不缺页

2024Q30选择题2分

缺页率影响因素:页缓冲队列降低的是磁盘I/O延迟而非缺页率

2016Q29选择题2分

工作集:窗口内最近访问的不同页面集合

2015Q30选择题2分

固定分配+全局置换矛盾:全局置换会改变进程的页框数,与固定分配冲突

2012Q45综合题8分

综合题:基于扫描的局部页面置换策略的页框分配与回收分析