第3章 内存管理
第3章 内存管理¶
内存管理和进程管理是操作系统的核心,需重点复习。 本章主线:分页管理提高内存利用率 → 请求分页实现虚拟内存 → 让程序无须全部驻留即可获得逻辑扩展的地址空间。
⚠️ 校订/边界:虚拟内存并未脱离一切物理限制,仍受虚拟地址位宽、后备存储容量、页表与置换策略约束。
b_188_7【知识树】第3章骨架¶
- 内存管理概念
- 程序的链接(静态/装入时动态/运行时动态)与装入(绝对/可重定位/动态运行时)
- 逻辑地址 vs 物理地址、内存保护、内存共享
- 连续分配:单一连续、固定分区、动态分区(四种顺序算法 + 索引算法)
- 基本分页:页表、地址变换、TLB、两级页表
- 基本分段、段页式
- 虚拟内存管理
- 局部性原理、虚拟内存三个特征
- 请求分页:页表项、缺页中断、地址变换
- 页框分配:驻留集、内部/外部置换
- 页置换算法:OPT / FIFO / LRU / CLOCK
- 抖动与工作集、内存映射文件
b_188_0;PDF 第 188 页 · b_188_23.1 内存管理概念¶
内存管理的五个功能?¶
- 内存空间的分配与回收:跟踪使用状态、记录空闲区域
- 地址转换:把逻辑地址(虚拟地址)动态转换为物理地址
- 内存空间的扩充:靠虚拟存储技术使进程能用远大于物理内存的地址空间
- 内存共享:多个进程安全访问同一块物理内存
- 存储保护:确保各进程只能访问自身被授权的区域
b_188_14从源程序到可执行程序的三个步骤? ★1考¶
- 编译:由编译程序把源代码翻译成若干目标模块
- 链接:由链接程序把目标模块及所需库函数合并为一个完整的装入模块
- 装入(加载):由装入程序把装入模块载入内存并启动执行
★ 考过 2011
b_189_6逻辑地址和物理地址的关系? ★1考¶
- 逻辑地址(相对地址/虚拟地址):编译后每个目标模块从 0 号单元开始编址;链接后拼成统一的、从 0 开始的逻辑地址空间(32 位系统为 0 ~ 2³²−1)
- 物理地址:主存中所有物理存储单元的集合,是地址转换的最终目标
⚠️ 不同进程可以拥有相同的逻辑地址 —— 因为它们各自拥有独立的逻辑地址空间,会被映射到主存的不同位置。 ⚠️ 早期:装入时把逻辑地址转成物理地址,称地址重定位;现代:由 MMU(内存管理单元)在硬件层面于运行时自动完成,对用户程序完全透明。
★ 考过 2023
b_189_9三种链接方式的区别?¶
- 静态链接:运行前就链接成一个完整的可执行文件,此后不再拆分
- 两项关键操作:地址调整(模块 B 内部地址统一加偏移量 L)、外部符号解析(把 CALL B 中的符号 B 替换为地址 L)
- 装入时动态链接:边装入边链接 —— 遇到外部调用立即查找并装入相应模块
- 两个优点:⚠️ 便于修改更新(只替换被改的模块,无须重建整个程序);⚠️ 便于实现目标模块共享(静态链接下每个程序都带一份完整副本,无法共享)
- 运行时动态链接:⚠️ 仅当需要调用某个尚未装入的模块时才加载并链接;运行中未用到的模块既不装入也不链接
- 优点:加快装入过程 + 节省内存空间
💡 记忆法:"静态一次装好,装入时随装随连,运行时用到才连"。
b_190_0三种装入方式的适用范围?¶
- 绝对装入:⚠️ 仅适用于单道程序环境 —— 驻留位置编译前即可确定,逻辑地址与物理地址完全一致,无须修改
- 可重定位装入(静态重定位):装入时一次性把所有逻辑地址改为物理地址;⚠️ 两个限制:必须在装入前一次性获得全部所需内存;装入后整个运行期间既不能移动位置,也不能动态申请额外内存
- 动态运行时装入(动态重定位):⚠️ 装入后不立即转换地址,推迟到指令实际执行时进行;靠重定位寄存器存放起始物理地址
- 优点:支持程序在内存中移动,便于紧凑,有效减少外部碎片;提高内存分配的灵活性
💡 记忆法:"绝对装入定死,静态重定位装入时改,动态重定位执行时算"。
b_191_0内存保护的两种硬件方法? ★1考¶
- 上、下限寄存器:分别存放进程在内存中的下限和上限地址,访问时硬件自动比较判断是否越界
- 重定位寄存器 + 界地址寄存器:重定位寄存器(基地址寄存器)存起始物理地址,界地址寄存器(限长寄存器)存地址空间的长度;先比较是否越界,未越界则加上重定位寄存器的值得到物理地址
⚠️ 两者作用不同:重定位寄存器用于"加",界地址寄存器用于"比"。 ⚠️ 两个寄存器的加载必须通过特权指令完成,仅操作系统内核有此权限 —— 保证用户程序无法篡改。
★ 考过 2009
b_191_8什么样的内存才能共享?(经典计算题)¶
⚠️ 若讨论“共享代码”,通常要求代码可重入且只读;每个进程仍需配备独立的私有数据区。
⚠️ 校订/边界:这不是说所有可共享内存都必须只读。可写共享内存同样可以被多个进程映射,只是必须另用信号量、互斥锁或原子操作保证同步。
教材算例:40 个用户运行同一编辑程序,代码 160KB、数据 40KB: - 不共享:(160+40)×40 = 8000KB - 共享代码:160 + 40×40 = 1760KB
两种实现: - 分页系统(页面 4KB):代码占 40 个页面、数据占 10 个页面 → 每个进程页表需 40 个页表项指向同一组共享页框 + 10 个私有数据页表项 - 分段系统:⚠️ 只需为共享代码段设置一个段表项(记录起始地址和段长 160KB)
💡 结论:分页与分段都能支持共享,区别在于共享的粒度和管理机制。
b_192_2;PDF 第 192 页 · b_192_53.1.2 连续分配管理方式¶
单一连续分配的优缺点?¶
内存分为系统区(供操作系统用,通常位于低地址)和用户区(仅允许一道用户程序运行)。
- 优点:结构简单、无外部碎片;⚠️ 无须内存保护机制(内存中始终只有一道程序)
- 缺点:仅适用于单用户单任务系统、有内部碎片、内存利用率极低
b_192_8;PDF 第 192 页 · b_192_11固定分区分配的两种划分和两个问题?¶
两种划分方法: - 分区大小相等:⚠️ 程序过小浪费空间,过大无法装入,缺乏灵活性 - 分区大小不等:多个小分区 + 适量中等分区 + 少量大分区,提高适应性
系统维护一张分区使用表(含始址、大小、状态,通常按大小排序);⚠️ 回收时只需把状态置为"未分配"。
两个问题: - 作业大于所有分区则无法装入 - ⚠️ 作业小于分区仍占整个分区 → 内部碎片
⚠️ 固定分区无外部碎片,但每个分区只能由一个作业独占,内存利用率较低。
b_193_4;PDF 第 193 页 · b_193_5什么是外部碎片?怎么解决?¶
动态分区(可变分区)分配:按实际需求分配大小恰好匹配的连续空间,分区数量和大小随进程装入释放而动态变化。
⚠️ 外部碎片 = 散布在已分配分区之间、无法利用的小空闲块 —— 可用内存总量虽足,却难以满足较大进程的需求。 (对比:内部碎片是分区内部未用完的空间。)
紧凑技术:周期性移动进程,把所有空闲块合并为一个连续区域;⚠️ 要求系统支持动态重定位,且开销较大。 💡 类比:类似磁盘碎片整理,但紧凑作用于主存,碎片整理作用于外存文件系统。
b_193_6;PDF 第 193 页 · b_193_7动态分区回收内存的四种情形? ★1考¶
系统维护空闲分区链(表),通常按起始地址排序。回收时按相邻情况合并: - ① 与前一空闲分区相邻 → 合并,更新前一分区的大小 - ② 与后一空闲分区相邻 → 合并,更新后一分区的起始地址和大小 - ③ 与前后都相邻 → 三者合并,更新前一分区大小,删除后一分区表项 - ④ 都不相邻 → 新建一个表项插入空闲分区链
⚠️ 分配时:若空闲分区大于所需,则分割,剩余部分(不小于最小分配单位)仍留在链中。
★ 考过 2017
b_194_0四种顺序分配算法的排序方式和缺点? ★3考¶
| 算法 | 空闲分区排序 | 特点与缺点 |
|---|---|---|
| 首次适应 | 地址递增 | 优先用低地址,保留高地址大空闲区;⚠️ 低地址易积累小碎片,每次都从链首查 |
| 邻近适应 | 地址递增(循环) | 从上次结束位置继续查;⚠️ 大空闲区分布不均,性能通常不如首次适应 |
| 最佳适应 | 容量递增 | 选最小的可用分区;⚠️ 留下大量极小的剩余块 → 外部碎片多,实际性能差 |
| 最坏适应 | 容量递减 | 选最大的可用分区;⚠️ 很快难以满足大作业需求,性能同样不佳 |
⚠️ 综合最好的是首次适应:查找简单高效、回收时无须重新排序、能保留高地址大空闲区。
★ 考过 2010、2019、2024
b_194_6三种索引分配算法? ★1考¶
思想:按空闲分区大小分类,每类建一条独立的空闲分区链,用一张索引表统一管理(适用于大中型系统,空闲分区链很长时顺序搜索效率低)。
- 快速适应:预先划分若干固定尺寸类别;找到能容纳它的最小类别链表,取头部第一个
- 优点查找效率高、分割操作少;⚠️ 仍可能产生类别向上取整造成的内部碎片,以及类别之间“总量够但本类不足”的空闲失衡;回收合并也较复杂
- 伙伴系统:⚠️ 所有分区大小均为 2^k —— 需要 n(满足 2^(i−1) < n ≤ 2^i)时先查 2^i 的链,没有就往更大的链找,然后不断二分直到得到所需大小
- ⚠️ 伙伴 = 由同一父块二分得到、大小相同且满足边界对齐的一对块;仅仅“大小相同、地址相邻”还不够
- 回收时若伙伴也空闲则合并为 2^(k+1),并继续向上尝试合并
- 哈希算法:以空闲分区大小为关键字建哈希表,表项记录对应链的头指针
⚠️ 校订/边界:快速适应不能保证“无碎片”;伙伴块也不是任意两个相邻同大块,必须同父、同阶并满足对齐关系。
★ 考过 2024
💡 区间追踪法:每次申请/回收都画出 [起址, 终址);回收时只沿二叉划分树向上检查同父、同阶的伙伴,可用“起址 XOR 块大小”定位候选伙伴。
b_195_1为什么要引入非连续分配?¶
⚠️ 连续分配的死穴:即使有超过 1GB 的空闲内存,只要没有连续的 1GB,需要该大小的作业就无法装入。
非连续分配:把进程地址空间划分为多个单元,分散装入互不相邻的区域 → 有效利用零散空闲内存;⚠️ 代价是必须额外维护逻辑单元与物理位置的映射关系。
分类: - 按单元大小是否固定:分页存储管理 / 分段存储管理 - 按是否需一次性装入全部:基本分页/基本分段(一次性装入)vs 请求分页/请求分段(按需动态装入)
b_195_43.1.3 基本分页存储管理¶
分页和固定分区有什么本质不同?¶
- 页框(页帧、物理块):物理内存划分出的大小相等的固定单元
- 页面(页):进程逻辑地址空间划分出的与页框大小相同的单元
⚠️ 校订/边界:页是逻辑单位,页框/页帧/物理块才是物理内存单位;两者大小相等,但不能混用名称。
⚠️ 本质区别:固定分区按作业整体分配;分页把进程和内存都按固定大小单元划分,以页为单位分配。
⚠️ 碎片情况:分页不会产生外部碎片,但页内碎片(内部碎片)平均每个进程约半页。
b_195_5页面大小为什么要取 2 的整数次幂?大小怎么权衡?¶
为便于地址转换(直接按位拆分,无须做除法)。
⚠️ 过小:页面数量增多 → 页表过长,占用大量内存 + 增加地址转换开销 + 降低换入换出效率 ⚠️ 过大:页内碎片增多 → 降低内存利用率
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
b_196_2页表的作用是什么?页表项里存页号吗?¶
页表的作用是实现从页号到页框号的映射。 系统为每个进程建立一张页表,每个页表项记录该页所在的物理页框号及状态信息(有效位、访问位等)。
⚠️ 高频陷阱:页表项中不存储页号! —— 页表项按页号顺序连续存放,页号作为索引是隐含的。
💡 这正是计算页表大小的关键:页表项长度只算页框号 + 标志位那几个字节。
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
b_197_4页表项大小怎么定? ★1考¶
页表项必须能表示所有可能的物理页框号。
推导(32 位地址、按字节编址、页面 4KB): - 物理内存最多 2³²B / 4KB = 2²⁰ 个页框 - 需 log₂2²⁰ = 20 位表示页框号 - 按字节编址 → 至少 ⌈20/8⌉ = 3B - ⚠️ 但出于对齐和扩展考虑(有效位、访问位等),实际系统通常设为 4B
⚠️ 分页管理的两大挑战:每次访存都要地址转换(慢);页表本身占内存(大) —— 分别由 快表 TLB 和 多级页表 解决。
★ 考过 2024
b_197_11;PDF 第 197 页 · b_197_12;PDF 第 197 页 · b_197_13有快表时地址变换要访存几次? ★1考¶
⚠️ 无快表时每次访问内存至少要两次访存:第一次查页表取物理块号,第二次访问目标内容。
有 TLB(快表,具有并行查找能力的高速缓冲存储器)后: - ① CPU 给出逻辑地址,硬件提取页号,与快表中所有页号并行比较 - ② 命中 → 直接取物理块号拼接,⚠️ 仅需一次访存 - ③ 未命中 → 访问内存页表取块号,⚠️ 共需两次访存;同时把该页表项装入快表,⚠️ 快表已满则按置换算法淘汰一个旧项
⚠️ 主存中的完整页表称为慢表。 💡 效果:程序局部性良好时快表命中率通常可达 90% 以上,分页开销可控制在 10% 以内。
★ 考过 2009
b_197_14;PDF 第 197 页 · b_197_15为什么需要两级页表?(那个 1K 页的推导) ★1考¶
32 位逻辑地址、页面 4KB、页表项 4B: - 页内偏移 12 位,页号 20 位 → 每个进程页表最多 2²⁰ 个页表项 - ⚠️ 仅页表就要占 2²⁰ × 4B / 4KB = 1K 个页,还要求连续存放,显然不切实际
解决思路两方面: - ⚠️ 对页表采用离散分配,用一张索引表记录各页表页的位置 → 消除对连续内存的需求 - ⚠️ 仅将当前活跃的部分页表项调入内存,其余按需调入(虚拟内存的思想)
💡 本质:为已离散化的页表再建一层页表,称为外层页表(页目录)。
★ 考过 2014
b_198_6两级页表的地址结构怎么算出来的? ★7考¶
接上例:把原页表按 4KB 分页 → 每页可容纳 4KB/4B = 1024 个页表项;总页表项 2²⁰ → 需 2²⁰/2¹⁰ = 1024 个页表页 → 外层页表 1024 个表项,恰好占一页。
于是逻辑地址结构:| 一级页号(页目录号)10 位 | 二级页号 10 位 | 页内偏移 12 位 |
⚠️ 两级表项内容不同: - 页表项存该页对应的物理块号 - 外层页表项存某个页表分页的物理起始地址
★ 考过 2010、2013、2015、2017、2018、2019
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
b_199_464 位系统为什么不用 6 级页表?¶
若逻辑地址 64 位、页面 4KB,则页号占 52 位;每页存 1024 个页表项 → ⚠️ 约需 6 级页表才能覆盖。
⚠️ 实际系统通常把虚拟地址限制为 48 位,从而采用三级或四级页表即可,既满足需求又避免硬件过度复杂化。
💡 多级页表的根本目的:通过按需分配页表页,避免为未使用的地址空间预留大量无用的页表项。
b_199_103.1.4 基本分段存储管理¶
分段和分页的出发点有什么不同?¶
- 分页:⚠️ 从计算机的角度出发 —— 提高内存利用率和系统性能,地址转换由硬件自动完成,对用户完全透明
- 分段:⚠️ 从用户和程序员的实际需求出发 —— 支持方便编程、信息保护与共享、动态增长、动态链接
分段把逻辑地址空间划分为若干大小不等的段(主程序段、子程序段、栈段、数据段…),每段内部从 0 开始编址,⚠️ 段内连续,段间不要求连续。
b_199_11分段的逻辑地址结构和二维性? ★1考¶
逻辑地址 = 段号 S + 段内偏移量 W。
教材例:段号 16 位、段内偏移 16 位 → 最多 2¹⁶ = 65536 个段,最大段长 64KB。
⚠️ 关键区别:页式系统中页号与页内偏移对用户透明;分段系统中段号和段内偏移必须由用户显式提供(高级语言里由编译程序自动完成)→ 所以分段地址空间是二维的。
★ 考过 2009
b_200_0段表项里存什么?怎么算段表项大小?¶
段表项记录段长和本段在主存的始址(基址)。⚠️ 段号也是隐含索引,无须存储(段表项连续存放且长度相同)。
教材算例:32 位系统,段号 16 位、段内偏移 16 位(最大段长 64KB),物理地址 32 位(可寻址 4GB)→ 每个段表项至少 16(段长)+ 32(基址)= 48 位 = 6B;第 K 号段的段表项位于 M + K×6。
💡 对比记忆:页表项只存块号(页长固定不用存),段表项要存"段长 + 基址"两样。
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
b_200_15分页和分段的三点本质区别?¶
| 对比 | 分页 | 分段 |
|---|---|---|
| 单位性质 | 系统管理内存的物理单位 | 用户程序的逻辑单位 |
| 目的 | 提高内存利用率,系统实现、对用户透明 | 满足编程、共享、保护需求,由编译器按程序结构划分、对用户可见 |
| 大小 | 固定,由系统决定 | 不固定,取决于程序逻辑结构 |
| 地址空间 | 一维(单一线性地址) | 二维(必须给段号 + 段内偏移) |
💡 记忆法:"页是给机器用的,段是给人用的"。
b_201_2段共享为什么比页共享方便? ★2考¶
⚠️ 分页系统:一段共享代码占 N 个页框 → 每个共享进程的页表中都要建 N 个页表项。 ⚠️ 分段系统:无论该段多大,每个进程的段表中只需一个段表项。
共享段表:每个共享段一个表项,记录段号、段长、内存起始地址、存在位、外存起始地址、共享进程计数 count —— ⚠️ 进程不再使用时 count 减 1,仅当 count = 0 时才回收内存。
⚠️ 同一共享段在不同进程中可以有不同的段号。 ⚠️ 教材注:新版教材改为"在每个进程的段表中设一个段表项指向同一物理段",但 2019 年统考真题考的是"配置共享段表"这一方法。
★ 考过 2019、2023
b_201_9分段的两类保护机制?¶
- 地址越界保护:段号 ≥ 段表长度 → 越界中断;段内偏移 ≥ 段长 → 越界中断
- 存取控制保护:通过段表项中的访问权限位防止非法访问
⚠️ 共享代码必须是可重入代码(纯代码),通常置于只读段;每个进程需配备私有的局部数据区存放会变化的数据。
b_201_133.1.5 段页式存储管理¶
段页式的地址结构和表的数量?¶
先分段、再把每段分页;内存仍按物理块管理。 逻辑地址 = 段号 S + 页号 P + 页内偏移 W。
⚠️ 每个进程只有一张段表,但可能有多张页表(每段一张)。 - 段表项记录该段的页表始址和页表长度(段号隐含) - 页表项记录对应页的物理块号(页号隐含) - 段表寄存器存当前进程段表的起始地址和段表长度,⚠️ 既用于段表寻址,也用于段号越界检查
b_202_0;PDF 第 202 页 · b_202_1段页式地址变换要几次访存?地址空间是几维?¶
- ① 由段号 S 经段表寄存器查段表,得到该段页表的起始地址
- ② 用页号 P 查该页表,得到物理块号
- ③ 物理块号 + 页内偏移 W 拼成物理地址
⚠️ 无快表时每次访问需三次访存;引入 TLB 后表项关键字是(段号, 页号)。
⚠️ 段页式的地址空间是二维的 —— 因为对用户而言程序仍按段组织,页的划分由系统自动完成且完全透明。
b_203_1三种存储管理只需掌握哪三点?¶
- ① 逻辑地址结构
- ② 页(段)表项结构
- ③ 寻址过程
⚠️ 教材特别提醒:注意区分"逻辑地址结构"与"表项结构" —— 前者是地址怎么拆,后者是表里存什么,两者极易混淆。
多级页表的代价:⚠️ 无快表时一次地址变换需逐级访问多级页表,导致多次内存访问,增加访存延迟。
b_203_73.2 虚拟内存管理¶
传统存储管理的两个共同特征?¶
- 一次性:⚠️ 作业必须一次性全部装入内存才能运行 → 过大的作业无法运行;大量作业请求时并发度下降
- 驻留性:⚠️ 作业一旦装入就一直驻留,任何部分都不会被换出,直到运行结束 → 进程因等待 I/O 长期阻塞时仍占着内存
💡 后果:暂时不用的代码和数据占着大量内存,急需运行的作业却装不进来。
b_224_4局部性原理的两个方面? ★1考¶
- 时间局部性:某条指令或数据被访问后,不久很可能再次被访问 —— ⚠️ 原因是程序中存在大量循环和重复操作
- 空间局部性:访问某个存储单元后,其附近单元不久也很可能被访问 —— ⚠️ 原因是指令顺序存放顺序执行,数据(向量、数组、表)连续或簇聚存储
如何利用:时间局部性 → 把近期使用的内容保存在高速缓存中,用多级缓存层次结构;空间局部性 → 采用较大容量的缓存,并集成预取机制。
⚠️ 快表、页高速缓存、虚拟内存都属于缓存技术,都依赖局部性原理。
★ 考过 2012
b_224_11虚拟存储器的三个特征? ★1考¶
- 多次性:⚠️ 作业无须一次性全部装入,可分多次动态调入
- 对换性:⚠️ 运行过程中无须常驻内存,可换出到外存对换区,需要时再换入
- 虚拟性:逻辑上扩充内存容量;⚠️ 虚拟性是本质特征和根本目标,其实现依赖于多次性与对换性
两个核心机制:请求调页(请求调段) —— 访问的信息不在内存时自动从外存调入;页面置换(段置换) —— 内存不足时把暂时不用的换出。
⚠️ 为什么叫"虚拟":它并非真实存在的物理实体,而是操作系统通过部分装入、请求调入和置换功能构造的逻辑抽象(这些对用户透明)。
★ 考过 2012
b_225_2虚拟内存为什么必须建立在离散分配上?¶
⚠️ 因为虚拟内存允许分多次调入;若采用连续分配,会导致相当一部分内存空间处于暂时甚至"永久"的空闲状态 —— 既浪费内存,也无法从逻辑上扩充内存容量。
三种实现方式:请求分页、请求分段、请求段页式存储管理。
四类硬件支持: - 足够容量的内存和外存 - 页表机制(或段表机制) - 中断机构 —— 访问未调入部分时触发缺页(缺段)中断 - 地址变换机构
💡 请求分页是目前最常用的方式 —— 因为换入换出的单位是长度固定的页面,比长度可变的段实现更简单、效率更高。
b_225_3请求分页的页表项多了哪四个字段?¶
页号 | 物理块号 | 状态位 P | 访问字段 A | 修改位 M | 外存地址 - 状态位 P(存在位):该页是否已调入内存,供地址变换时判断是否触发缺页中断 - 访问字段 A:一段时间内的访问次数,或自上次访问以来的时间间隔 —— 供页面置换算法参考 - 修改位 M:调入内存后是否被修改过 —— 决定换出时是否需写回外存 - 外存地址:该页在外存中的存放位置,供调页时读入
💡 对应四个需求:判断在不在 → 在哪找 → 换谁走 → 要不要写回。
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
b_226_3请求分页地址变换的四步? ★4考¶
- ① 先查快表;命中则取出物理块号,⚠️ 置访问位为 1;写操作还需置修改位为 1
- ② 快表未命中则访问页表:状态位 = 1(在内存)则取块号,并把该页表项装入快表(快表满则按置换算法淘汰一项)
- ③ 页面不在内存 → 触发缺页中断:调入(必要时先换出一页)→ 更新页表和快表 → 重新执行地址变换
- ④ 物理块号 + 页内地址拼接成物理地址访存
★ 考过 2009、2010、2014、2024
b_227_0最小页框数由什么决定? ★1考¶
最小页框数 = 保证进程正常运行所需的最少页框数,⚠️ 与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
- 单地址指令 + 直接寻址 → 2 个(一个存指令,一个存数据)
- 支持间接寻址 → 至少 3 个(指令、指针、数据)
- 一条指令及其两个操作数各自跨越两个页面 → ⚠️ 最坏情况涉及 6 个页面 → 至少分配 6 个页框
★ 考过 2025
b_227_7驻留集过大或过小分别有什么问题?¶
- ⚠️ 过小:内存中可容纳的进程数增多、并发度提高,但缺页率显著升高,CPU 大量时间用于处理缺页中断
- ⚠️ 过大:超过某一阈值后继续增加页框对缺页率的改善趋于平缓 —— 浪费内存,且可用页框总量减少,降低系统整体并发能力
💡 驻留集 = 操作系统分配给该进程的页框集合;大小选择要在系统并发度与缺页开销之间权衡。
b_227_9;PDF 第 227 页 · b_227_10为什么只有三种分配置换策略? ★1考¶
⚠️ 理论上四种组合,但"固定分配 + 全局置换"互斥 —— 固定分配要求页框数不变,而全局置换会导致页框数变化。
- 固定分配局部置换:页框数固定不变,缺页时只能从自身页框中换出
- ⚠️ 难点:初始分配太少则频繁缺页,太多则浪费内存并减少并发进程数
- 可变分配全局置换:缺页时先从空闲页框队列取一个;空闲耗尽则从内存所有页框中选一个换出,不论归属
- ⚠️ 风险:某些活跃进程的驻留集持续膨胀,不断抢占其他进程的页框,削弱并发能力
- 可变分配局部置换:只从自身页框中换出,同时根据缺页率动态调整驻留集 —— 缺页率过高就增加页框,过低就回收部分
- ⚠️ 实现复杂、开销大,但相比频繁换入换出消耗的磁盘 I/O 与 CPU,这一开销是值得的
★ 考过 2015
💡 教材原话提醒:2015 年统考选择题考的正是这三种策略的名称,不少考生因当成非重点而失分。
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三种页框调入算法?¶
- 平均分配算法:所有可分配页框平均分给各进程
- 按比例分配算法:按进程的逻辑地址空间大小按比例分配
- 优先权分配算法:一部分按比例分配,另一部分依据优先权动态分配
b_228_8预调页和请求调页怎么选?¶
- 预调页策略:一次调入若干相邻页面(基于局部性原理);⚠️ 目前预测成功率仅约 50% → 主要用于进程首次调入时,由程序员显式指定应优先加载的页面
- 请求调页策略:缺页时才调入;优点是调入的页面必然会被访问、实现简单 → ⚠️ 当前虚拟存储器大多采用;缺点是每次仅调入一页,磁盘 I/O 开销较大
💡 一句话:预调页在运行前加载,请求调页在运行期间动态调入。
b_228_11从对换区还是文件区调入页面?¶
外存分文件区(存放文件,离散分配)和对换区(存放换出页面,连续分配)—— ⚠️ 对换区的磁盘 I/O 速度通常快于文件区。
三种情况: - 对换区空间充足:全部从对换区调入;⚠️ 需在进程运行前把相关文件从文件区复制到对换区 - 对换区空间不足:⚠️ 不会被修改的页面直接从文件区调入,换出时无须写回;可能被修改的页面换出时必须保存到对换区 - UNIX 方式:⚠️ 与进程相关的文件始终保留在文件区 —— 未运行过的页面从文件区调入,曾被换出的从对换区读取;多个进程共享的页面只要已在内存就可直接复用
b_229_03.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
b_229_7FIFO 算法的性能和 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
b_230_5LRU 算法怎么实现?它和 OPT 什么关系? ★4考¶
淘汰最近最长时间未使用的页面 —— 依据:若某页在过去一段时间未被使用,近期未来很可能也不会被访问。 实现:为每个页面维护一个访问字段记录自上次访问以来的时间,淘汰该值最大者。
⚠️ 方向性区别(高频考点):LRU 根据过去的使用情况判断,是"向前看"的;OPT 根据未来判断,是"向后看"的 —— 页面的过去与未来之间并无必然联系。 ⚠️ 教材例中 LRU 前 5 次缺页处理结果与 OPT 相同,但这仅是巧合。
四算法总评:OPT 性能最好但无法实现;FIFO 实现简单但忽略局部性、性能差;LRU 性能接近 OPT,但实现通常需要硬件支持、开销较大。
★ 考过 2009、2015、2019、2025
b_231_0简单 CLOCK 算法的规则? ★2考¶
为每页设访问位,首次装入或被访问时置 1;所有页框组成循环队列,维护一个替换指针: - 指针所指页面访问位为 0 → 直接淘汰 - 访问位为 1 → 置为 0,指针顺移,给它一次"宽恕"机会
⚠️ 名字来源:指针在队列中循环移动,形如时钟指针;又因仅依据"最近是否被使用"这一粗略信息决策,也称最近未用(NRU)算法。
⚠️ 关键细节:若扫描一圈所有访问位都是 1,则清零后回到最初位置,淘汰该位置的页面。
★ 考过 2010、2012
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
💡 总原则:尽可能保留近期访问过的页面,优先淘汰未访问过的;同为未访问,优先换出未修改的。
b_232_4抖动的根本原因是什么? ★1考¶
抖动(颠簸):刚换出的页面马上又要换入,刚换入的又立即被换出。
⚠️ 根本原因:分配给进程的物理块数量过少,导致频繁缺页中断 → 磁盘 I/O 频率急剧上升,进程大部分时间消耗在换入换出上 → ⚠️ CPU 利用率急剧下降,甚至趋近于零。
💡 正因抖动源于驻留集过少,才提出工作集的概念来动态指导页框分配。
★ 考过 2011
b_233_0工作集怎么算?和驻留集什么关系? ★1考¶
工作集 = 在某段时间间隔内,进程实际访问过的页面集合,由时间 t 和工作集窗口尺寸 Δ 共同确定。
教材例(Δ = 5):t₁ 时刻工作集 {2,3,5};t₂ 时刻工作集 {1,2,3,4}。
⚠️ 实际应用中窗口通常设得较大,局部性好的程序其工作集大小一般远小于 Δ。 ⚠️ 关键结论:驻留集的大小不应小于工作集的大小,否则进程运行中将频繁缺页。
★ 考过 2016
b_233_6影响页面换入换出效率的三个因素?¶
- 页面置换算法的选择
- ⚠️ 已修改页面写回磁盘的频率 —— "每次换出即写回"会导致频繁磁盘 I/O
- ⚠️ 磁盘内容读入内存的频率 —— 每次缺页都从磁盘重读会增加换入开销
b_233_11页面缓冲算法的两个链表?¶
- 空闲页面链表(空闲页框链表):需要读入页面时从头部取一个页框;⚠️ 未被修改的页面换出时不写回磁盘,直接把页框挂到链表末尾,页框中仍保留原有数据 —— 后续访问相同页面可直接取下复用,避免从磁盘重读
- 修改页面链表:⚠️ 已修改的页面换出时不立即写回,挂到该链表末尾,积累足够数量的脏页后批量写回
两个优点: - 显著降低换入/换出频率,大幅减少磁盘 I/O - ⚠️ 即使采用简单的置换策略(如 FIFO)也能获得良好性能,且无须特殊硬件支持
💡 2012 年统考真题描述的"被回收的页框放入空闲页框链尾,其中内容在下一次分配之前不清空"正是这个空闲页面链表。
b_233_9;PDF 第 233 页 · b_233_10哪些页框可以回收?为什么不能等耗尽再回收?¶
- ⚠️ 不可回收:内核栈、内核代码段、内核数据段等大部分内核页框
- 可回收:进程代码段、进程数据段、进程堆栈、映射的文件页、进程间共享内存
Linux 有一个负责页面换出的守护进程 kswapd,空闲页框低于特定阈值时就主动发起回收。
⚠️ 校订/边界:Linux 守护进程名是 kswapd;这是 Linux 的实现名,不是所有操作系统通用的机制名。
⚠️ 为什么不能等完全耗尽:释放脏页需要先写回磁盘,而该 I/O 操作本身往往需要临时页框作为缓冲区 —— 若此时已无空闲页框,则既无法分配 I/O 缓冲区,也无法完成页面释放,可能导致内核陷入内存分配死锁甚至系统崩溃。
⚠️ Linux 用伙伴算法管理连续空闲页框:释放时检查是否有大小相等的伙伴空闲块,有则合并为翻倍的新块,并继续向上尝试合并。
b_234_3;PDF 第 234 页 · b_234_5内存映射文件是怎么工作的? ★1考¶
在磁盘文件与进程的虚拟地址空间之间建立直接映射 —— 像访问内存一样读写文件,把文件当作内存中的一个大字符数组,无须调用传统的文件 I/O 接口。
⚠️ 两个时机细节:
- 映射时并不立即加载文件内容,而是首次访问某页面时才按需一页一页调入
- ⚠️ 脏页可以延迟写回,但不只在退出/解除映射时发生:后台异步回写、内存压力、周期刷新、msync()/fsync() 等都可能提前触发
用于共享内存:把同一文件映射到多个进程的虚拟地址空间 —— 各进程虚拟地址空间独立,但操作系统可让它们共享同一组物理页/页缓存,从而减少额外复制。
⚠️ 校订/边界:共享映射不等于自动同步。一方何时被另一方看见、多个写者的先后顺序仍需锁/原子操作等同步机制;数据何时持久化到存储还取决于映射类型和显式/后台回写策略。
两个好处:编程更简单(按内存方式读写);便于多个进程共享同一个磁盘文件。
★ 考过 2025
b_234_10影响虚拟存储器性能的五个因素? ★2考¶
核心是缺页率,它受以下因素影响: - 页面大小:⚠️ 页面较大 → 单次装入覆盖更多局部区域 → 缺页率低,但页内碎片大;页面较小 → 碎片少、利用率高,但页表过长 - 分配给进程的物理块数:⚠️ 通常越多,缺页率越低;超过阈值后改善趋于平缓 —— 因为活跃页面已基本常驻。但非栈算法可能出现 Belady 异常,不能写成无条件单调下降 - 页面置换算法:LRU、CLOCK 等优先保留可能被再次访问的页面 - 写回磁盘的频率:用已修改换出页面链表批量写回;⚠️ 尚未写回前再次访问可直接从链表复用 - 程序的局部化程度:⚠️ 典型反例 —— 数组按行存储时若按列访问,会破坏空间局部性,导致缺页率异常升高
⚠️ 校订/边界:“页框越多,缺页率越低”只是通常趋势;非栈置换算法可出现 Belady 异常。
★ 考过 2020、2022
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 组数从低位往高位切。
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 未命中再读主存。
b_237_5;PDF 第 237 页 · b_237_6虚拟内存空间的大小由什么决定?¶
⚠️ 主要由虚拟地址的位数决定。
例:虚拟地址 32 位、按字节编址 → 虚存空间最大 2³²B = 4GB;⚠️ 试图定义超过 4GB 的虚拟地址空间时,超出部分将无法被访问。
虚拟内存带来的代价:每次缺页均需访问外存,平均访存时间增加;置换算法不合适还可能引发频繁缺页,降低性能。
b_237_12【疑难点】第3章¶
分页和分段的四点对照(疑难点总表)?¶
| 分页 | 分段 | |
|---|---|---|
| 目的 | ⚠️ 仅是系统管理上的需要,为实现离散分配提高利用率,不是用户的需要 | 段是信息的逻辑单位,含一组意义相对完整的信息,为满足用户需要 |
| 长度 | 固定,由系统决定,由机器硬件实现 | 不固定,取决于用户程序,通常由编译程序按信息性质划分 |
| 地址空间 | 一维,一个记忆符即可表示地址 | 二维,既要给段名又要给段内地址 |
| 碎片 | ⚠️ 有内部碎片,无外部碎片 | ⚠️ 有外部碎片,无内部碎片 |
💡 碎片那一行是最常考的判断题。
b_262_12页面置换算法和处理机调度算法有什么共性?¶
⚠️ 二者都属于资源调度机制 —— 核心思想是依据某种准则,决定将有限资源分配给哪个请求者。 - 处理机调度的准则:优先级、响应比、时间片 - 页面置换的准则:页面的使用历史 —— 是否被访问过、近期是否经常使用
💡 教材建议:以"调度"为线索串联操作系统中的各类算法(进程调度、页面置换、磁盘调度、I/O 调度),有助于建立整体架构认识。
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 位虚拟地址按字节编址的虚存上限 |