跳转至

第3章 内存管理

2027 王道 · 专题阅读 · 保留代码与校订注 · 与版本锁一致

第3章 内存管理

内存管理和进程管理是操作系统的核心,需重点复习。 本章主线:分页管理提高内存利用率 → 请求分页实现虚拟内存 → 让程序无须全部驻留即可获得逻辑扩展的地址空间。

⚠️ 校订/边界:虚拟内存并未脱离一切物理限制,仍受虚拟地址位宽、后备存储容量、页表与置换策略约束。

回源 · PDF 第 188 页 · b_188_7

【知识树】第3章骨架

  • 内存管理概念
  • 程序的链接(静态/装入时动态/运行时动态)与装入(绝对/可重定位/动态运行时)
  • 逻辑地址 vs 物理地址、内存保护、内存共享
  • 连续分配:单一连续、固定分区、动态分区(四种顺序算法 + 索引算法)
  • 基本分页:页表、地址变换、TLB、两级页表
  • 基本分段、段页式
  • 虚拟内存管理
  • 局部性原理、虚拟内存三个特征
  • 请求分页:页表项、缺页中断、地址变换
  • 页框分配:驻留集、内部/外部置换
  • 页置换算法:OPT / FIFO / LRU / CLOCK
  • 抖动与工作集、内存映射文件
回源 · PDF 第 188 页 · b_188_0;PDF 第 188 页 · b_188_2

3.1 内存管理概念

内存管理的五个功能?

  • 内存空间的分配与回收:跟踪使用状态、记录空闲区域
  • 地址转换:把逻辑地址(虚拟地址)动态转换为物理地址
  • 内存空间的扩充:靠虚拟存储技术使进程能用远大于物理内存的地址空间
  • 内存共享:多个进程安全访问同一块物理内存
  • 存储保护:确保各进程只能访问自身被授权的区域
回源 · PDF 第 188 页 · b_188_14

从源程序到可执行程序的三个步骤? ★1考

  • 编译:由编译程序把源代码翻译成若干目标模块
  • 链接:由链接程序把目标模块及所需库函数合并为一个完整的装入模块
  • 装入(加载):由装入程序把装入模块载入内存并启动执行

★ 考过 2011

回源 · PDF 第 189 页 · b_189_6

逻辑地址和物理地址的关系? ★1考

  • 逻辑地址(相对地址/虚拟地址):编译后每个目标模块从 0 号单元开始编址;链接后拼成统一的、从 0 开始的逻辑地址空间(32 位系统为 0 ~ 2³²−1)
  • 物理地址:主存中所有物理存储单元的集合,是地址转换的最终目标

⚠️ 不同进程可以拥有相同的逻辑地址 —— 因为它们各自拥有独立的逻辑地址空间,会被映射到主存的不同位置。 ⚠️ 早期:装入时把逻辑地址转成物理地址,称地址重定位;现代:由 MMU(内存管理单元)在硬件层面于运行时自动完成,对用户程序完全透明。

★ 考过 2023

回源 · PDF 第 189 页 · b_189_9

三种链接方式的区别?

  • 静态链接:运行前就链接成一个完整的可执行文件,此后不再拆分
  • 两项关键操作:地址调整(模块 B 内部地址统一加偏移量 L)、外部符号解析(把 CALL B 中的符号 B 替换为地址 L)
  • 装入时动态链接:边装入边链接 —— 遇到外部调用立即查找并装入相应模块
  • 两个优点:⚠️ 便于修改更新(只替换被改的模块,无须重建整个程序);⚠️ 便于实现目标模块共享(静态链接下每个程序都带一份完整副本,无法共享)
  • 运行时动态链接:⚠️ 仅当需要调用某个尚未装入的模块时才加载并链接;运行中未用到的模块既不装入也不链接
  • 优点:加快装入过程 + 节省内存空间

💡 记忆法:"静态一次装好,装入时随装随连,运行时用到才连"。

回源 · PDF 第 190 页 · b_190_0

三种装入方式的适用范围?

  • 绝对装入:⚠️ 仅适用于单道程序环境 —— 驻留位置编译前即可确定,逻辑地址与物理地址完全一致,无须修改
  • 可重定位装入(静态重定位):装入时一次性把所有逻辑地址改为物理地址;⚠️ 两个限制:必须在装入前一次性获得全部所需内存;装入后整个运行期间既不能移动位置,也不能动态申请额外内存
  • 动态运行时装入(动态重定位):⚠️ 装入后不立即转换地址,推迟到指令实际执行时进行;靠重定位寄存器存放起始物理地址
  • 优点:支持程序在内存中移动,便于紧凑,有效减少外部碎片;提高内存分配的灵活性

💡 记忆法:"绝对装入定死,静态重定位装入时改,动态重定位执行时算"。

回源 · PDF 第 191 页 · b_191_0

内存保护的两种硬件方法? ★1考

  • 上、下限寄存器:分别存放进程在内存中的下限和上限地址,访问时硬件自动比较判断是否越界
  • 重定位寄存器 + 界地址寄存器:重定位寄存器(基地址寄存器)存起始物理地址,界地址寄存器(限长寄存器)存地址空间的长度;先比较是否越界,未越界则加上重定位寄存器的值得到物理地址

⚠️ 两者作用不同:重定位寄存器用于"加",界地址寄存器用于"比"。 ⚠️ 两个寄存器的加载必须通过特权指令完成,仅操作系统内核有此权限 —— 保证用户程序无法篡改。

★ 考过 2009

回源 · PDF 第 191 页 · b_191_8

什么样的内存才能共享?(经典计算题)

⚠️ 若讨论“共享代码”,通常要求代码可重入且只读;每个进程仍需配备独立的私有数据区。

⚠️ 校订/边界:这不是说所有可共享内存都必须只读。可写共享内存同样可以被多个进程映射,只是必须另用信号量、互斥锁或原子操作保证同步。

教材算例:40 个用户运行同一编辑程序,代码 160KB、数据 40KB: - 不共享:(160+40)×40 = 8000KB - 共享代码:160 + 40×40 = 1760KB

两种实现: - 分页系统(页面 4KB):代码占 40 个页面、数据占 10 个页面 → 每个进程页表需 40 个页表项指向同一组共享页框 + 10 个私有数据页表项 - 分段系统:⚠️ 只需为共享代码段设置一个段表项(记录起始地址和段长 160KB)

💡 结论:分页与分段都能支持共享,区别在于共享的粒度和管理机制。

回源 · PDF 第 192 页 · b_192_2;PDF 第 192 页 · b_192_5

3.1.2 连续分配管理方式

单一连续分配的优缺点?

内存分为系统区(供操作系统用,通常位于低地址)和用户区(仅允许一道用户程序运行)。

  • 优点:结构简单、无外部碎片;⚠️ 无须内存保护机制(内存中始终只有一道程序)
  • 缺点:仅适用于单用户单任务系统、有内部碎片、内存利用率极低
回源 · PDF 第 192 页 · b_192_8;PDF 第 192 页 · b_192_11

固定分区分配的两种划分和两个问题?

两种划分方法: - 分区大小相等:⚠️ 程序过小浪费空间,过大无法装入,缺乏灵活性 - 分区大小不等:多个小分区 + 适量中等分区 + 少量大分区,提高适应性

系统维护一张分区使用表(含始址、大小、状态,通常按大小排序);⚠️ 回收时只需把状态置为"未分配"。

两个问题: - 作业大于所有分区则无法装入 - ⚠️ 作业小于分区仍占整个分区 → 内部碎片

⚠️ 固定分区无外部碎片,但每个分区只能由一个作业独占,内存利用率较低。

回源 · PDF 第 193 页 · b_193_4;PDF 第 193 页 · b_193_5

什么是外部碎片?怎么解决?

动态分区(可变分区)分配:按实际需求分配大小恰好匹配的连续空间,分区数量和大小随进程装入释放而动态变化。

⚠️ 外部碎片 = 散布在已分配分区之间、无法利用的小空闲块 —— 可用内存总量虽足,却难以满足较大进程的需求。 (对比:内部碎片是分区内部未用完的空间。)

紧凑技术:周期性移动进程,把所有空闲块合并为一个连续区域;⚠️ 要求系统支持动态重定位,且开销较大。 💡 类比:类似磁盘碎片整理,但紧凑作用于主存,碎片整理作用于外存文件系统。

回源 · PDF 第 193 页 · b_193_6;PDF 第 193 页 · b_193_7

动态分区回收内存的四种情形? ★1考

系统维护空闲分区链(表),通常按起始地址排序。回收时按相邻情况合并: - ① 与前一空闲分区相邻 → 合并,更新前一分区的大小 - ② 与后一空闲分区相邻 → 合并,更新后一分区的起始地址和大小 - ③ 与前后都相邻 → 三者合并,更新前一分区大小,删除后一分区表项 - ④ 都不相邻 → 新建一个表项插入空闲分区链

⚠️ 分配时:若空闲分区大于所需,则分割,剩余部分(不小于最小分配单位)仍留在链中。

★ 考过 2017

回源 · PDF 第 194 页 · b_194_0

四种顺序分配算法的排序方式和缺点? ★3考

算法 空闲分区排序 特点与缺点
首次适应 地址递增 优先用低地址,保留高地址大空闲区;⚠️ 低地址易积累小碎片,每次都从链首查
邻近适应 地址递增(循环) 从上次结束位置继续查;⚠️ 大空闲区分布不均,性能通常不如首次适应
最佳适应 容量递增 选最小的可用分区;⚠️ 留下大量极小的剩余块 → 外部碎片多,实际性能差
最坏适应 容量递减 选最大的可用分区;⚠️ 很快难以满足大作业需求,性能同样不佳

⚠️ 综合最好的是首次适应:查找简单高效、回收时无须重新排序、能保留高地址大空闲区。

★ 考过 2010、2019、2024

回源 · PDF 第 194 页 · b_194_6

三种索引分配算法? ★1考

思想:按空闲分区大小分类,每类建一条独立的空闲分区链,用一张索引表统一管理(适用于大中型系统,空闲分区链很长时顺序搜索效率低)。

  • 快速适应:预先划分若干固定尺寸类别;找到能容纳它的最小类别链表,取头部第一个
  • 优点查找效率高、分割操作少;⚠️ 仍可能产生类别向上取整造成的内部碎片,以及类别之间“总量够但本类不足”的空闲失衡;回收合并也较复杂
  • 伙伴系统:⚠️ 所有分区大小均为 2^k —— 需要 n(满足 2^(i−1) < n ≤ 2^i)时先查 2^i 的链,没有就往更大的链找,然后不断二分直到得到所需大小
  • ⚠️ 伙伴 = 由同一父块二分得到、大小相同且满足边界对齐的一对块;仅仅“大小相同、地址相邻”还不够
  • 回收时若伙伴也空闲则合并为 2^(k+1),并继续向上尝试合并
  • 哈希算法:以空闲分区大小为关键字建哈希表,表项记录对应链的头指针

⚠️ 校订/边界:快速适应不能保证“无碎片”;伙伴块也不是任意两个相邻同大块,必须同父、同阶并满足对齐关系。

★ 考过 2024

💡 区间追踪法:每次申请/回收都画出 [起址, 终址);回收时只沿二叉划分树向上检查同父、同阶的伙伴,可用“起址 XOR 块大小”定位候选伙伴。

回源 · PDF 第 195 页 · b_195_1

为什么要引入非连续分配?

⚠️ 连续分配的死穴:即使有超过 1GB 的空闲内存,只要没有连续的 1GB,需要该大小的作业就无法装入。

非连续分配:把进程地址空间划分为多个单元,分散装入互不相邻的区域 → 有效利用零散空闲内存;⚠️ 代价是必须额外维护逻辑单元与物理位置的映射关系。

分类: - 按单元大小是否固定:分页存储管理 / 分段存储管理 - 按是否需一次性装入全部:基本分页/基本分段(一次性装入)vs 请求分页/请求分段(按需动态装入)

回源 · PDF 第 195 页 · b_195_4

3.1.3 基本分页存储管理

分页和固定分区有什么本质不同?

  • 页框(页帧、物理块):物理内存划分出的大小相等的固定单元
  • 页面(页):进程逻辑地址空间划分出的与页框大小相同的单元

⚠️ 校订/边界:页是逻辑单位,页框/页帧/物理块才是物理内存单位;两者大小相等,但不能混用名称。

⚠️ 本质区别:固定分区按作业整体分配;分页把进程和内存都按固定大小单元划分,以页为单位分配。

⚠️ 碎片情况:分页不会产生外部碎片,但页内碎片(内部碎片)平均每个进程约半页。

回源 · PDF 第 195 页 · b_195_5

页面大小为什么要取 2 的整数次幂?大小怎么权衡?

为便于地址转换(直接按位拆分,无须做除法)。

⚠️ 过小:页面数量增多 → 页表过长,占用大量内存 + 增加地址转换开销 + 降低换入换出效率 ⚠️ 过大:页内碎片增多 → 降低内存利用率

回源 · PDF 第 195 页 · b_195_9

分页系统的逻辑地址怎么拆? ★6考

逻辑地址 = 页号 P + 页内偏移量 W。

以 32 位地址、页面大小 2¹²B(4KB) 为例: - 低 12 位(0~11)= 页内偏移量 W - 高 20 位(12~31)= 页号 P - 最多支持 2²⁰ 个页面

💡 通用公式:页面大小 2^k → 低 k 位是偏移量,其余高位是页号。

★ 考过 2009、2010、2013、2015、2017、2024

回源 · PDF 第 196 页 · b_196_2

页表的作用是什么?页表项里存页号吗?

页表的作用是实现从页号到页框号的映射。 系统为每个进程建立一张页表,每个页表项记录该页所在的物理页框号及状态信息(有效位、访问位等)。

⚠️ 高频陷阱:页表项中不存储页号! —— 页表项按页号顺序连续存放,页号作为索引是隐含的。

💡 这正是计算页表大小的关键:页表项长度只算页框号 + 标志位那几个字节。

回源 · PDF 第 196 页 · b_196_0;PDF 第 196 页 · b_196_7

基本地址变换的四个步骤? ★4考

系统设页表寄存器 PTR,存页表始址 F 和页表长度 M;⚠️ 进程未执行时,页表始址和长度保存在其 PCB 中,被调度时才装入 PTR(单 CPU 系统通常只设一个 PTR)。

设页面大小为 L,逻辑地址 A → 物理地址 E: - ① P = A / L(整除),W = A % L - ② 若 P ≥ M 则产生越界中断 - ③ ⚠️ 页表项地址 = 页表始址 F + 页号 P × 页表项长度,取出物理块号 b - ④ E = b × L + W

教材算例:L=1KB,页号 2 对应块号 b=8,A=2500 → P=2,W=452,E = 8×1024+452 = 8644。

💡 若逻辑地址以二进制给出,直接截取高位和低位即可,无须做除法。 ⚠️ 分页的逻辑地址是一维线性地址,只需一个整数即可确定位置。

★ 考过 2013、2021、2024

回源 · PDF 第 197 页 · b_197_4

页表项大小怎么定? ★1考

页表项必须能表示所有可能的物理页框号。

推导(32 位地址、按字节编址、页面 4KB): - 物理内存最多 2³²B / 4KB = 2²⁰ 个页框 - 需 log₂2²⁰ = 20 位表示页框号 - 按字节编址 → 至少 ⌈20/8⌉ = 3B - ⚠️ 但出于对齐和扩展考虑(有效位、访问位等),实际系统通常设为 4B

⚠️ 分页管理的两大挑战:每次访存都要地址转换(慢);页表本身占内存(大) —— 分别由 快表 TLB 和 多级页表 解决。

★ 考过 2024

回源 · PDF 第 197 页 · b_197_11;PDF 第 197 页 · b_197_12;PDF 第 197 页 · b_197_13

有快表时地址变换要访存几次? ★1考

⚠️ 无快表时每次访问内存至少要两次访存:第一次查页表取物理块号,第二次访问目标内容。

有 TLB(快表,具有并行查找能力的高速缓冲存储器)后: - ① CPU 给出逻辑地址,硬件提取页号,与快表中所有页号并行比较 - ② 命中 → 直接取物理块号拼接,⚠️ 仅需一次访存 - ③ 未命中 → 访问内存页表取块号,⚠️ 共需两次访存;同时把该页表项装入快表,⚠️ 快表已满则按置换算法淘汰一个旧项

⚠️ 主存中的完整页表称为慢表。 💡 效果:程序局部性良好时快表命中率通常可达 90% 以上,分页开销可控制在 10% 以内。

★ 考过 2009

回源 · PDF 第 197 页 · b_197_14;PDF 第 197 页 · b_197_15

为什么需要两级页表?(那个 1K 页的推导) ★1考

32 位逻辑地址、页面 4KB、页表项 4B: - 页内偏移 12 位,页号 20 位 → 每个进程页表最多 2²⁰ 个页表项 - ⚠️ 仅页表就要占 2²⁰ × 4B / 4KB = 1K 个页,还要求连续存放,显然不切实际

解决思路两方面: - ⚠️ 对页表采用离散分配,用一张索引表记录各页表页的位置 → 消除对连续内存的需求 - ⚠️ 仅将当前活跃的部分页表项调入内存,其余按需调入(虚拟内存的思想)

💡 本质:为已离散化的页表再建一层页表,称为外层页表(页目录)。

★ 考过 2014

回源 · PDF 第 198 页 · b_198_6

两级页表的地址结构怎么算出来的? ★7考

接上例:把原页表按 4KB 分页 → 每页可容纳 4KB/4B = 1024 个页表项;总页表项 2²⁰ → 需 2²⁰/2¹⁰ = 1024 个页表页 → 外层页表 1024 个表项,恰好占一页。

于是逻辑地址结构:| 一级页号(页目录号)10 位 | 二级页号 10 位 | 页内偏移 12 位 |

⚠️ 两级表项内容不同: - 页表项存该页对应的物理块号 - 外层页表项存某个页表分页的物理起始地址

★ 考过 2010、2013、2015、2017、2018、2019

回源 · PDF 第 198 页 · b_198_11

两级页表的地址变换要几次访存? ★4考

系统增设外层页表寄存器(页目录基址寄存器)存放外层页表起始地址。 - ① 用页目录号索引外层页表,得到内层页表的物理起始地址 - ② 用二级页号索引该页表,得到目标页面的物理块号 - ③ 物理块号 + 页内偏移拼接成物理地址访存

⚠️ 无快表时共需三次访存。

💡 算题固定链:先由页面大小切出页内偏移 → 再由“一个页表页能放多少表项”切出各级索引 → 用 PTBR 找页目录 → 目录项给二级页表物理基址 → 二级表项给页框号 → 页框号与页内偏移拼成物理地址。

💡 10/10/12 结构的无符号位运算: - 页目录号:(uLA >> 22) & 0x3FF - 二级页号:(uLA >> 12) & 0x3FF - 页内偏移:uLA & 0xFFF

⚠️ 这三个常数只适用于 32 位、4KB 页、10/10/12 划分;遇到新题必须先按题设重算字段宽度。

★ 考过 2015、2017、2018、2021

回源 · PDF 第 199 页 · b_199_4

64 位系统为什么不用 6 级页表?

若逻辑地址 64 位、页面 4KB,则页号占 52 位;每页存 1024 个页表项 → ⚠️ 约需 6 级页表才能覆盖。

⚠️ 实际系统通常把虚拟地址限制为 48 位,从而采用三级或四级页表即可,既满足需求又避免硬件过度复杂化。

💡 多级页表的根本目的:通过按需分配页表页,避免为未使用的地址空间预留大量无用的页表项。

回源 · PDF 第 199 页 · b_199_10

3.1.4 基本分段存储管理

分段和分页的出发点有什么不同?

  • 分页:⚠️ 从计算机的角度出发 —— 提高内存利用率和系统性能,地址转换由硬件自动完成,对用户完全透明
  • 分段:⚠️ 从用户和程序员的实际需求出发 —— 支持方便编程、信息保护与共享、动态增长、动态链接

分段把逻辑地址空间划分为若干大小不等的段(主程序段、子程序段、栈段、数据段…),每段内部从 0 开始编址,⚠️ 段内连续,段间不要求连续。

回源 · PDF 第 199 页 · b_199_11

分段的逻辑地址结构和二维性? ★1考

逻辑地址 = 段号 S + 段内偏移量 W。

教材例:段号 16 位、段内偏移 16 位 → 最多 2¹⁶ = 65536 个段,最大段长 64KB。

⚠️ 关键区别:页式系统中页号与页内偏移对用户透明;分段系统中段号和段内偏移必须由用户显式提供(高级语言里由编译程序自动完成)→ 所以分段地址空间是二维的。

★ 考过 2009

回源 · PDF 第 200 页 · b_200_0

段表项里存什么?怎么算段表项大小?

段表项记录段长和本段在主存的始址(基址)。⚠️ 段号也是隐含索引,无须存储(段表项连续存放且长度相同)。

教材算例:32 位系统,段号 16 位、段内偏移 16 位(最大段长 64KB),物理地址 32 位(可寻址 4GB)→ 每个段表项至少 16(段长)+ 32(基址)= 48 位 = 6B;第 K 号段的段表项位于 M + K×6。

💡 对比记忆:页表项只存块号(页长固定不用存),段表项要存"段长 + 基址"两样。

回源 · PDF 第 200 页 · b_200_5;PDF 第 200 页 · b_200_6

段式地址变换的四步?比页式多了什么检查? ★1考

系统设段表寄存器,存段表始址 F 和段表长度 M: - ① 从逻辑地址分离出段号 S 和段内偏移 W - ② 若 S ≥ M → 段号越界中断 - ③ 段表项地址 = F + S × 段表项长度,取出段长 C;⚠️ 若 W ≥ C → 段内越界中断 - ④ 取出基址 b,E = b + W

⚠️ 两处区别于分页:多了一次"段内越界"检查;物理地址是"基址 + 偏移"相加,而不是"块号 × 块大小 + 偏移"。

★ 考过 2016

回源 · PDF 第 200 页 · b_200_15

分页和分段的三点本质区别?

对比 分页 分段
单位性质 系统管理内存的物理单位 用户程序的逻辑单位
目的 提高内存利用率,系统实现、对用户透明 满足编程、共享、保护需求,由编译器按程序结构划分、对用户可见
大小 固定,由系统决定 不固定,取决于程序逻辑结构
地址空间 一维(单一线性地址) 二维(必须给段号 + 段内偏移)

💡 记忆法:"页是给机器用的,段是给人用的"。

回源 · PDF 第 201 页 · b_201_2

段共享为什么比页共享方便? ★2考

⚠️ 分页系统:一段共享代码占 N 个页框 → 每个共享进程的页表中都要建 N 个页表项。 ⚠️ 分段系统:无论该段多大,每个进程的段表中只需一个段表项。

共享段表:每个共享段一个表项,记录段号、段长、内存起始地址、存在位、外存起始地址、共享进程计数 count —— ⚠️ 进程不再使用时 count 减 1,仅当 count = 0 时才回收内存。

⚠️ 同一共享段在不同进程中可以有不同的段号。 ⚠️ 教材注:新版教材改为"在每个进程的段表中设一个段表项指向同一物理段",但 2019 年统考真题考的是"配置共享段表"这一方法。

★ 考过 2019、2023

回源 · PDF 第 201 页 · b_201_9

分段的两类保护机制?

  • 地址越界保护:段号 ≥ 段表长度 → 越界中断;段内偏移 ≥ 段长 → 越界中断
  • 存取控制保护:通过段表项中的访问权限位防止非法访问

⚠️ 共享代码必须是可重入代码(纯代码),通常置于只读段;每个进程需配备私有的局部数据区存放会变化的数据。

回源 · PDF 第 201 页 · b_201_13

3.1.5 段页式存储管理

段页式的地址结构和表的数量?

先分段、再把每段分页;内存仍按物理块管理。 逻辑地址 = 段号 S + 页号 P + 页内偏移 W。

⚠️ 每个进程只有一张段表,但可能有多张页表(每段一张)。 - 段表项记录该段的页表始址和页表长度(段号隐含) - 页表项记录对应页的物理块号(页号隐含) - 段表寄存器存当前进程段表的起始地址和段表长度,⚠️ 既用于段表寻址,也用于段号越界检查

回源 · PDF 第 202 页 · b_202_0;PDF 第 202 页 · b_202_1

段页式地址变换要几次访存?地址空间是几维?

  • ① 由段号 S 经段表寄存器查段表,得到该段页表的起始地址
  • ② 用页号 P 查该页表,得到物理块号
  • ③ 物理块号 + 页内偏移 W 拼成物理地址

⚠️ 无快表时每次访问需三次访存;引入 TLB 后表项关键字是(段号, 页号)。

⚠️ 段页式的地址空间是二维的 —— 因为对用户而言程序仍按段组织,页的划分由系统自动完成且完全透明。

回源 · PDF 第 203 页 · b_203_1

三种存储管理只需掌握哪三点?

  • ① 逻辑地址结构
  • ② 页(段)表项结构
  • ③ 寻址过程

⚠️ 教材特别提醒:注意区分"逻辑地址结构"与"表项结构" —— 前者是地址怎么拆,后者是表里存什么,两者极易混淆。

多级页表的代价:⚠️ 无快表时一次地址变换需逐级访问多级页表,导致多次内存访问,增加访存延迟。

回源 · PDF 第 203 页 · b_203_7

3.2 虚拟内存管理

传统存储管理的两个共同特征?

  • 一次性:⚠️ 作业必须一次性全部装入内存才能运行 → 过大的作业无法运行;大量作业请求时并发度下降
  • 驻留性:⚠️ 作业一旦装入就一直驻留,任何部分都不会被换出,直到运行结束 → 进程因等待 I/O 长期阻塞时仍占着内存

💡 后果:暂时不用的代码和数据占着大量内存,急需运行的作业却装不进来。

回源 · PDF 第 224 页 · b_224_4

局部性原理的两个方面? ★1考

  • 时间局部性:某条指令或数据被访问后,不久很可能再次被访问 —— ⚠️ 原因是程序中存在大量循环和重复操作
  • 空间局部性:访问某个存储单元后,其附近单元不久也很可能被访问 —— ⚠️ 原因是指令顺序存放顺序执行,数据(向量、数组、表)连续或簇聚存储

如何利用:时间局部性 → 把近期使用的内容保存在高速缓存中,用多级缓存层次结构;空间局部性 → 采用较大容量的缓存,并集成预取机制。

⚠️ 快表、页高速缓存、虚拟内存都属于缓存技术,都依赖局部性原理。

★ 考过 2012

回源 · PDF 第 224 页 · b_224_11

虚拟存储器的三个特征? ★1考

  • 多次性:⚠️ 作业无须一次性全部装入,可分多次动态调入
  • 对换性:⚠️ 运行过程中无须常驻内存,可换出到外存对换区,需要时再换入
  • 虚拟性:逻辑上扩充内存容量;⚠️ 虚拟性是本质特征和根本目标,其实现依赖于多次性与对换性

两个核心机制:请求调页(请求调段) —— 访问的信息不在内存时自动从外存调入;页面置换(段置换) —— 内存不足时把暂时不用的换出。

⚠️ 为什么叫"虚拟":它并非真实存在的物理实体,而是操作系统通过部分装入、请求调入和置换功能构造的逻辑抽象(这些对用户透明)。

★ 考过 2012

回源 · PDF 第 225 页 · b_225_2

虚拟内存为什么必须建立在离散分配上?

⚠️ 因为虚拟内存允许分多次调入;若采用连续分配,会导致相当一部分内存空间处于暂时甚至"永久"的空闲状态 —— 既浪费内存,也无法从逻辑上扩充内存容量。

三种实现方式:请求分页、请求分段、请求段页式存储管理。

四类硬件支持: - 足够容量的内存和外存 - 页表机制(或段表机制) - 中断机构 —— 访问未调入部分时触发缺页(缺段)中断 - 地址变换机构

💡 请求分页是目前最常用的方式 —— 因为换入换出的单位是长度固定的页面,比长度可变的段实现更简单、效率更高。

回源 · PDF 第 225 页 · b_225_3

请求分页的页表项多了哪四个字段?

页号 | 物理块号 | 状态位 P | 访问字段 A | 修改位 M | 外存地址 - 状态位 P(存在位):该页是否已调入内存,供地址变换时判断是否触发缺页中断 - 访问字段 A:一段时间内的访问次数,或自上次访问以来的时间间隔 —— 供页面置换算法参考 - 修改位 M:调入内存后是否被修改过 —— 决定换出时是否需写回外存 - 外存地址:该页在外存中的存放位置,供调页时读入

💡 对应四个需求:判断在不在 → 在哪找 → 换谁走 → 要不要写回。

回源 · PDF 第 225 页 · b_225_15

缺页中断的两个显著特点? ★6考

它是一种内中断,同样要保护现场 → 分析原因 → 转处理程序 → 恢复现场,但有两点不同: - ⚠️ 在指令执行期间触发,由当前指令的地址访问直接引发,而非指令执行完毕之后 - ⚠️ 一条指令执行中可能引发多次缺页中断 —— 例如 copy A to B,若指令本身及两个操作数各自跨越两个页面,最多可能引发 6 次缺页中断

处理流程按五段记: 1. 备页框:有空闲页框就分配;没有则选择牺牲页。 2. 必要时换出:牺牲页为脏页时先写回外存,干净页可直接丢弃。 3. 换入目标页:启动磁盘/DMA,把目标页读入所选页框;等待期间缺页进程阻塞,CPU 可运行其他进程。 4. 更新映射:更新被换出页与目标页的页表项,必要时同步处理 TLB。 5. 唤醒并重做:I/O 完成后进程进入就绪队列;以后重新获得 CPU 时,重执行引发缺页的那条指令。

⚠️ 最坏两次外存数据传输 = 脏牺牲页写回 + 目标页读入;牺牲页干净时只有目标页读入。

★ 考过 2011、2013、2014、2020、2022、2023

回源 · PDF 第 226 页 · b_226_3

请求分页地址变换的四步? ★4考

  • ① 先查快表;命中则取出物理块号,⚠️ 置访问位为 1;写操作还需置修改位为 1
  • ② 快表未命中则访问页表:状态位 = 1(在内存)则取块号,并把该页表项装入快表(快表满则按置换算法淘汰一项)
  • ③ 页面不在内存 → 触发缺页中断:调入(必要时先换出一页)→ 更新页表和快表 → 重新执行地址变换
  • ④ 物理块号 + 页内地址拼接成物理地址访存

★ 考过 2009、2010、2014、2024

回源 · PDF 第 227 页 · b_227_0

最小页框数由什么决定? ★1考

最小页框数 = 保证进程正常运行所需的最少页框数,⚠️ 与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。

  • 单地址指令 + 直接寻址 → 2 个(一个存指令,一个存数据)
  • 支持间接寻址 → 至少 3 个(指令、指针、数据)
  • 一条指令及其两个操作数各自跨越两个页面 → ⚠️ 最坏情况涉及 6 个页面 → 至少分配 6 个页框

★ 考过 2025

回源 · PDF 第 227 页 · b_227_7

驻留集过大或过小分别有什么问题?

  • ⚠️ 过小:内存中可容纳的进程数增多、并发度提高,但缺页率显著升高,CPU 大量时间用于处理缺页中断
  • ⚠️ 过大:超过某一阈值后继续增加页框对缺页率的改善趋于平缓 —— 浪费内存,且可用页框总量减少,降低系统整体并发能力

💡 驻留集 = 操作系统分配给该进程的页框集合;大小选择要在系统并发度与缺页开销之间权衡。

回源 · PDF 第 227 页 · b_227_9;PDF 第 227 页 · b_227_10

为什么只有三种分配置换策略? ★1考

⚠️ 理论上四种组合,但"固定分配 + 全局置换"互斥 —— 固定分配要求页框数不变,而全局置换会导致页框数变化。

  • 固定分配局部置换:页框数固定不变,缺页时只能从自身页框中换出
  • ⚠️ 难点:初始分配太少则频繁缺页,太多则浪费内存并减少并发进程数
  • 可变分配全局置换:缺页时先从空闲页框队列取一个;空闲耗尽则从内存所有页框中选一个换出,不论归属
  • ⚠️ 风险:某些活跃进程的驻留集持续膨胀,不断抢占其他进程的页框,削弱并发能力
  • 可变分配局部置换:只从自身页框中换出,同时根据缺页率动态调整驻留集 —— 缺页率过高就增加页框,过低就回收部分
  • ⚠️ 实现复杂、开销大,但相比频繁换入换出消耗的磁盘 I/O 与 CPU,这一开销是值得的

★ 考过 2015

💡 教材原话提醒:2015 年统考选择题考的正是这三种策略的名称,不少考生因当成非重点而失分。

回源 · PDF 第 227 页 · b_227_12;PDF 第 227 页 · b_227_13;PDF 第 227 页 · b_227_15;PDF 第 228 页 · b_228_2;PDF 第 228 页 · b_228_3;PDF 第 228 页 · b_228_5

三种页框调入算法?

  • 平均分配算法:所有可分配页框平均分给各进程
  • 按比例分配算法:按进程的逻辑地址空间大小按比例分配
  • 优先权分配算法:一部分按比例分配,另一部分依据优先权动态分配
回源 · PDF 第 228 页 · b_228_8

预调页和请求调页怎么选?

  • 预调页策略:一次调入若干相邻页面(基于局部性原理);⚠️ 目前预测成功率仅约 50% → 主要用于进程首次调入时,由程序员显式指定应优先加载的页面
  • 请求调页策略:缺页时才调入;优点是调入的页面必然会被访问、实现简单 → ⚠️ 当前虚拟存储器大多采用;缺点是每次仅调入一页,磁盘 I/O 开销较大

💡 一句话:预调页在运行前加载,请求调页在运行期间动态调入。

回源 · PDF 第 228 页 · b_228_11

从对换区还是文件区调入页面?

外存分文件区(存放文件,离散分配)和对换区(存放换出页面,连续分配)—— ⚠️ 对换区的磁盘 I/O 速度通常快于文件区。

三种情况: - 对换区空间充足:全部从对换区调入;⚠️ 需在进程运行前把相关文件从文件区复制到对换区 - 对换区空间不足:⚠️ 不会被修改的页面直接从文件区调入,换出时无须写回;可能被修改的页面换出时必须保存到对换区 - UNIX 方式:⚠️ 与进程相关的文件始终保留在文件区 —— 未运行过的页面从文件区调入,曾被换出的从对换区读取;多个进程共享的页面只要已在内存就可直接复用

回源 · PDF 第 229 页 · b_229_0

3.2.4 页面置换算法

OPT 算法为什么不能实现? ★1考

选择淘汰以后永不使用、或在最长时间内不再被访问的页面 → 理论上缺页率最低。

⚠️ 无法实现,因为操作系统无法预知未来的页面访问序列;但具有重要理论意义,常用于评价其他算法。

教材例(3 个物理块,序列 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1): 共 9 次缺页中断,其中 6 次触发页面置换(不算初始装入 3 页)。

★ 考过 2014

回源 · PDF 第 229 页 · b_229_7

FIFO 算法的性能和 Belady 异常? ★1考

淘汰最早进入内存的页面(按调入时间组织成队列,移除队首)。 ⚠️ 未利用局部性原理,与实际运行规律不符 —— 最早装入的页面仍可能被频繁访问,性能通常较差。

同一例子下 FIFO 共 15 次缺页中断,其中 12 次置换(对比 OPT 的 9 次)。

Belady 异常:⚠️ 物理块数增加时,缺页次数反而可能上升。 教材例(序列 3,2,1,0,3,2,4,3,2,1,0,4):3 个物理块缺页 9 次,4 个物理块反而缺页 10 次。 ⚠️ 根本原因:FIFO 仅依据调入时间决策,忽略了页面的实际使用情况。 ⚠️ 校订/边界:在本节比较的 FIFO / OPT / LRU 中,FIFO 可能出现 Belady 异常,而 OPT、LRU 作为栈算法不会;更一般地,其他不具栈包含性质的算法也可能出现,不能把“只有 FIFO”推广到所有置换算法。

★ 考过 2010

回源 · PDF 第 230 页 · b_230_5

LRU 算法怎么实现?它和 OPT 什么关系? ★4考

淘汰最近最长时间未使用的页面 —— 依据:若某页在过去一段时间未被使用,近期未来很可能也不会被访问。 实现:为每个页面维护一个访问字段记录自上次访问以来的时间,淘汰该值最大者。

⚠️ 方向性区别(高频考点):LRU 根据过去的使用情况判断,是"向前看"的;OPT 根据未来判断,是"向后看"的 —— 页面的过去与未来之间并无必然联系。 ⚠️ 教材例中 LRU 前 5 次缺页处理结果与 OPT 相同,但这仅是巧合。

四算法总评:OPT 性能最好但无法实现;FIFO 实现简单但忽略局部性、性能差;LRU 性能接近 OPT,但实现通常需要硬件支持、开销较大。

★ 考过 2009、2015、2019、2025

回源 · PDF 第 231 页 · b_231_0

简单 CLOCK 算法的规则? ★2考

为每页设访问位,首次装入或被访问时置 1;所有页框组成循环队列,维护一个替换指针: - 指针所指页面访问位为 0 → 直接淘汰 - 访问位为 1 → 置为 0,指针顺移,给它一次"宽恕"机会

⚠️ 名字来源:指针在队列中循环移动,形如时钟指针;又因仅依据"最近是否被使用"这一粗略信息决策,也称最近未用(NRU)算法。

⚠️ 关键细节:若扫描一圈所有访问位都是 1,则清零后回到最初位置,淘汰该位置的页面。

★ 考过 2010、2012

回源 · PDF 第 231 页 · b_231_12

改进型 CLOCK 的四类页面? ★3考

在访问位 A 基础上引入修改位 M(修改过的页面置换代价更高,要写回磁盘): - 1 类(A=0, M=0):⚠️ 最佳淘汰页 - 2 类(A=0, M=1):次佳淘汰页 - 3 类(A=1, M=0):最近已访问但未修改 - 4 类(A=1, M=1):最近已访问且已修改

三阶段选择规则(最坏可完整扫描四遍): - ① 找 1 类,⚠️ 此轮不修改任何访问位 A - ② 找 2 类,⚠️ 此轮把所有经过页面的 A 置为 0 - ③ 前两步都失败后,再次执行第 ① 步找 (0,0);若仍没有,再执行第 ② 步找 (0,1),此时必能找到

⚠️ 校订/边界:三“阶段”不等于只扫描三遍;最坏顺序为 (0,0) → (0,1并清A) → 再找(0,0) → 再找(0,1),即四次完整扫描。优点是优先淘汰未修改页、降低磁盘 I/O,代价是扫描开销增加。

★ 考过 2016、2018、2021

💡 总原则:尽可能保留近期访问过的页面,优先淘汰未访问过的;同为未访问,优先换出未修改的。

回源 · PDF 第 232 页 · b_232_4

抖动的根本原因是什么? ★1考

抖动(颠簸):刚换出的页面马上又要换入,刚换入的又立即被换出。

⚠️ 根本原因:分配给进程的物理块数量过少,导致频繁缺页中断 → 磁盘 I/O 频率急剧上升,进程大部分时间消耗在换入换出上 → ⚠️ CPU 利用率急剧下降,甚至趋近于零。

💡 正因抖动源于驻留集过少,才提出工作集的概念来动态指导页框分配。

★ 考过 2011

回源 · PDF 第 233 页 · b_233_0

工作集怎么算?和驻留集什么关系? ★1考

工作集 = 在某段时间间隔内,进程实际访问过的页面集合,由时间 t 和工作集窗口尺寸 Δ 共同确定。

教材例(Δ = 5):t₁ 时刻工作集 {2,3,5};t₂ 时刻工作集 {1,2,3,4}。

⚠️ 实际应用中窗口通常设得较大,局部性好的程序其工作集大小一般远小于 Δ。 ⚠️ 关键结论:驻留集的大小不应小于工作集的大小,否则进程运行中将频繁缺页。

★ 考过 2016

回源 · PDF 第 233 页 · b_233_6

影响页面换入换出效率的三个因素?

  • 页面置换算法的选择
  • ⚠️ 已修改页面写回磁盘的频率 —— "每次换出即写回"会导致频繁磁盘 I/O
  • ⚠️ 磁盘内容读入内存的频率 —— 每次缺页都从磁盘重读会增加换入开销
回源 · PDF 第 233 页 · b_233_11

页面缓冲算法的两个链表?

  • 空闲页面链表(空闲页框链表):需要读入页面时从头部取一个页框;⚠️ 未被修改的页面换出时不写回磁盘,直接把页框挂到链表末尾,页框中仍保留原有数据 —— 后续访问相同页面可直接取下复用,避免从磁盘重读
  • 修改页面链表:⚠️ 已修改的页面换出时不立即写回,挂到该链表末尾,积累足够数量的脏页后批量写回

两个优点: - 显著降低换入/换出频率,大幅减少磁盘 I/O - ⚠️ 即使采用简单的置换策略(如 FIFO)也能获得良好性能,且无须特殊硬件支持

💡 2012 年统考真题描述的"被回收的页框放入空闲页框链尾,其中内容在下一次分配之前不清空"正是这个空闲页面链表。

回源 · PDF 第 233 页 · b_233_9;PDF 第 233 页 · b_233_10

哪些页框可以回收?为什么不能等耗尽再回收?

  • ⚠️ 不可回收:内核栈、内核代码段、内核数据段等大部分内核页框
  • 可回收:进程代码段、进程数据段、进程堆栈、映射的文件页、进程间共享内存

Linux 有一个负责页面换出的守护进程 kswapd,空闲页框低于特定阈值时就主动发起回收。

⚠️ 校订/边界:Linux 守护进程名是 kswapd;这是 Linux 的实现名,不是所有操作系统通用的机制名。

⚠️ 为什么不能等完全耗尽:释放脏页需要先写回磁盘,而该 I/O 操作本身往往需要临时页框作为缓冲区 —— 若此时已无空闲页框,则既无法分配 I/O 缓冲区,也无法完成页面释放,可能导致内核陷入内存分配死锁甚至系统崩溃。

⚠️ Linux 用伙伴算法管理连续空闲页框:释放时检查是否有大小相等的伙伴空闲块,有则合并为翻倍的新块,并继续向上尝试合并。

回源 · PDF 第 234 页 · b_234_3;PDF 第 234 页 · b_234_5

内存映射文件是怎么工作的? ★1考

在磁盘文件与进程的虚拟地址空间之间建立直接映射 —— 像访问内存一样读写文件,把文件当作内存中的一个大字符数组,无须调用传统的文件 I/O 接口。

⚠️ 两个时机细节: - 映射时并不立即加载文件内容,而是首次访问某页面时才按需一页一页调入 - ⚠️ 脏页可以延迟写回,但不只在退出/解除映射时发生:后台异步回写、内存压力、周期刷新、msync()/fsync() 等都可能提前触发

用于共享内存:把同一文件映射到多个进程的虚拟地址空间 —— 各进程虚拟地址空间独立,但操作系统可让它们共享同一组物理页/页缓存,从而减少额外复制。

⚠️ 校订/边界:共享映射不等于自动同步。一方何时被另一方看见、多个写者的先后顺序仍需锁/原子操作等同步机制;数据何时持久化到存储还取决于映射类型和显式/后台回写策略。

两个好处:编程更简单(按内存方式读写);便于多个进程共享同一个磁盘文件。

★ 考过 2025

回源 · PDF 第 234 页 · b_234_10

影响虚拟存储器性能的五个因素? ★2考

核心是缺页率,它受以下因素影响: - 页面大小:⚠️ 页面较大 → 单次装入覆盖更多局部区域 → 缺页率低,但页内碎片大;页面较小 → 碎片少、利用率高,但页表过长 - 分配给进程的物理块数:⚠️ 通常越多,缺页率越低;超过阈值后改善趋于平缓 —— 因为活跃页面已基本常驻。但非栈算法可能出现 Belady 异常,不能写成无条件单调下降 - 页面置换算法:LRU、CLOCK 等优先保留可能被再次访问的页面 - 写回磁盘的频率:用已修改换出页面链表批量写回;⚠️ 尚未写回前再次访问可直接从链表复用 - 程序的局部化程度:⚠️ 典型反例 —— 数组按行存储时若按列访问,会破坏空间局部性,导致缺页率异常升高

⚠️ 校订/边界:“页框越多,缺页率越低”只是通常趋势;非栈置换算法可出现 Belady 异常。

★ 考过 2020、2022

回源 · PDF 第 235 页 · b_235_3

地址翻译综合题怎么拆地址?(TLB + 页表 + Cache)

教材条件:字节编址、虚拟地址 14 位、物理地址 12 位、页面 64B、TLB 四路组相联共 16 条目、data Cache 物理寻址直接映射、行大小 4B 共 16 组。

拆法: - 页内偏移 log₂64 = 6 位 → 虚拟页号 14−6 = 8 位,物理页号 12−6 = 6 位 - TLB:16/4 = 4 组 → 组索引 2 位(取虚拟页号低 2 位),TLB 标记 6 位(高 6 位) - Cache:行 4B → 块内偏移 2 位;16 组 → 组索引 4 位;标记 6 位

💡 通用套路:先由页面大小定偏移位数,再由 TLB 组数/Cache 组数从低位往高位切。

回源 · PDF 第 236 页 · b_236_0;PDF 第 236 页 · b_236_2

三个地址的翻译结果分别是什么?

  • 0x03d4:组索引 3、TLB 标记 0x03 → ⚠️ TLB 命中,物理页号 0x0d → 物理地址 0x354 → Cache 组索引 5、标记 0x0d → ⚠️ Cache 命中,偏移 0(块 0)→ 数据为 36H
  • 0x00f1:组索引 3、TLB 标记 0x00 → TLB 未命中 → 查页表,虚拟页号 0x03 有效位为 1 → 物理页号 0x02 → 物理地址 0x0b1 → Cache 组索引 0xc、标记 0x02 → ⚠️ 有效位为 0,Cache 未命中,需从主存读取
  • 0x0229:组索引 0、TLB 标记 0x02 → TLB 未命中 → 查页表,虚拟页号 0x08 有效位为 0 → ⚠️ 缺页中断

💡 完整流程:查 TLB → 未命中查页表 → 页表项无效则缺页中断调页 → 用物理地址访问 Cache → Cache 未命中再读主存。

回源 · PDF 第 237 页 · b_237_5;PDF 第 237 页 · b_237_6

虚拟内存空间的大小由什么决定?

⚠️ 主要由虚拟地址的位数决定。

例:虚拟地址 32 位、按字节编址 → 虚存空间最大 2³²B = 4GB;⚠️ 试图定义超过 4GB 的虚拟地址空间时,超出部分将无法被访问。

虚拟内存带来的代价:每次缺页均需访问外存,平均访存时间增加;置换算法不合适还可能引发频繁缺页,降低性能。

回源 · PDF 第 237 页 · b_237_12

【疑难点】第3章

分页和分段的四点对照(疑难点总表)?

分页 分段
目的 ⚠️ 仅是系统管理上的需要,为实现离散分配提高利用率,不是用户的需要 段是信息的逻辑单位,含一组意义相对完整的信息,为满足用户需要
长度 固定,由系统决定,由机器硬件实现 不固定,取决于用户程序,通常由编译程序按信息性质划分
地址空间 一维,一个记忆符即可表示地址 二维,既要给段名又要给段内地址
碎片 ⚠️ 有内部碎片,无外部碎片 ⚠️ 有外部碎片,无内部碎片

💡 碎片那一行是最常考的判断题。

回源 · PDF 第 262 页 · b_262_12

页面置换算法和处理机调度算法有什么共性?

⚠️ 二者都属于资源调度机制 —— 核心思想是依据某种准则,决定将有限资源分配给哪个请求者。 - 处理机调度的准则:优先级、响应比、时间片 - 页面置换的准则:页面的使用历史 —— 是否被访问过、近期是否经常使用

💡 教材建议:以"调度"为线索串联操作系统中的各类算法(进程调度、页面置换、磁盘调度、I/O 调度),有助于建立整体架构认识。

回源 · PDF 第 238 页 · b_238_0

【易混点】第3章成对概念对照

概念 A 概念 B 一句话切分
逻辑地址 物理地址 程序用的、可重复 vs 主存单元、唯一
静态链接 动态链接 运行前连成一个 vs 装入时/运行时才连,可共享
绝对装入 可重定位装入 单道程序、地址定死 vs 装入时一次性改地址
静态重定位 动态重定位 装入时改完、不能移动 vs 执行时才算、可紧凑
重定位寄存器 界地址寄存器 用于"加" vs 用于"比"
内部碎片 外部碎片 分区/页内部用不完 vs 分区之间的小空闲块
固定分区 动态分区 有内部碎片、无外部碎片 vs 有外部碎片、要紧凑
首次适应 最佳适应 地址递增、综合最好 vs 容量递增、碎片最多
邻近适应 最坏适应 从上次位置继续找 vs 总切最大块
页 / 页框 段 页是逻辑单位,页框是物理单位;二者定长、分页地址一维、对用户透明 vs 逻辑单位、变长、二维、用户可见
页表项 段表项 只存块号(页号隐含) vs 存段长 + 基址
一级页表 两级页表 要连续、可能占 1K 页 vs 离散 + 按需调入,无快表时 3 次访存
TLB(快表) 页表(慢表) 命中 1 次访存 vs 未命中 2 次访存
基本分页 请求分页 一次性装入 vs 缺页中断 + 页面置换
缺页中断 一般中断 指令执行期间触发、一条指令可多次 vs 指令执行后检测
固定分配局部置换 可变分配全局置换 驻留集恒定 vs 可抢别的进程页框
预调页 请求调页 运行前预测装入(成功率约 50%) vs 缺页才调,当前主流
文件区 对换区 离散分配、慢 vs 连续分配、快
OPT LRU 向后看(未来)、不可实现 vs 向前看(过去)、需硬件支持
FIFO LRU/OPT ⚠️ 在本节三算法中 FIFO 可能出现 Belady 异常 vs 栈算法不会
简单 CLOCK 改进型 CLOCK 只看访问位 A vs 看 (A,M),优先淘汰未修改的
抖动 工作集 频繁换入换出、CPU 利用率趋零 vs 一段时间内实际访问的页面集合

【必背数字】第3章

数字 含义
半页 分页每个进程平均产生的页内碎片
2^k 页面大小取 2 的整数次幂(低 k 位为偏移)
4KB / 20 位 / 4B 典型页面大小 / 32 位下的页号位数 / 实际页表项大小
⌈20/8⌉ = 3B 页表项理论最小值(实际取 4B 对齐)
1K 个页 32 位下单级页表本身要占的页数(2²⁰×4B/4KB)
10 + 10 + 12 两级页表的逻辑地址结构(32 位、4KB 页)
1024 一页可容纳的页表项数(4KB/4B)= 外层页表表项数
90% / 10% 快表典型命中率 / 分页带来的性能开销
1 / 2 / 3 次访存 TLB 命中 / 未命中查一级页表 / 两级页表(无快表)
48 位 → 三或四级 实际 64 位系统的虚拟地址限制与页表级数
6B 教材例中段表项大小(16 位段长 + 32 位基址)
6 次 一条指令最多可能引发的缺页中断次数
2 / 3 / 6 最小页框数:直接寻址 / 间接寻址 / 指令与两操作数各跨两页
三种策略 固定分配局部、可变分配全局、可变分配局部(固定+全局互斥)
约 50% 预调页的预测成功率
9 次 / 15 次 教材例中 OPT / FIFO 的缺页次数(3 个物理块)
9 次 vs 10 次 Belady 异常:3 个物理块 vs 4 个物理块
四类页面 改进型 CLOCK 的 (A,M) 组合,1 类 (0,0) 最佳淘汰
4GB 32 位虚拟地址按字节编址的虚存上限