缺页中断次数的计算依赖于程序执行过程中访问的页面是否已在内存中。若所需页面不在内存,则产生一次缺页中断,需从外存调入该页。
例题解析:
(1) 答案:C(4次)
执行指令 COPY A TO B 时:
- 源数据地址 A 跨越页面 2 和 3;
- 目标地址 B 跨越页面 4 和 5。
假设这四个页面(2、3、4、5)初始均不在内存中,则每个页面都需要通过缺页中断加载到内存,因此共发生 4 次缺页中断。
(2) 答案:B(3次)
若仅考虑指令本身的执行过程中的缺页情况:
COPY指令本身跨页存储(比如在页面1和2),取指令阶段需要访问这两个页面;- 假设页面1、2、3都不在内存中;
- 取指令时跨页 → 访问页面1和2 → 若未驻留则产生缺页;
- 但由于指令通常连续存放,可能只因跨页导致两次访问不同页面;
- 更合理的解释是:取指令跨越两个页面(如页面1和2),但若指令起始在页面1末尾,则访问页面1和2;操作数A位于页面2和3,访问其内容时也会触发对页面2、3的访问;
- 综合分析:取指令引起1次缺页(例如页面1未在内存),读取操作数A跨越页面2和3 → 若两者都不在内存,则新增2次缺页;
- 总计最多为3次缺页中断(例如页面1、2、3均不在内存);
- 因此答案为 3次。
页面置换算法
在请求分页系统中,当发生缺页且物理内存无空闲块时,必须选择一个已驻留页面调出,腾出空间给新页面。不同的页面置换算法决定了选择哪个页面被替换。
最佳置换算法(Optimal, OPT)
- 核心思想:淘汰在未来最长时间内不再被访问的页面,或永不使用的页面。
- 优点:理论上能实现最低的缺页率,性能最优。
- 缺点:需要预知未来的页面访问序列,无法在实际系统中实现,仅用于理论比较与模拟评估。
- 应用场景:作为衡量其他置换算法(如FIFO、LRU)性能的基准。
示例推导(基于例4.11逻辑):
假设:
- 物理块数 = 3
- 页面访问序列为:7, 0, 1, 2, 0, 3, 0, 4, 2, 3
- 初始内存为空
使用最佳置换算法逐步分析:
| 访问 | 内存状态 | 是否缺页 | 置换决策(未来最久不用) |
|---|---|---|---|
| 7 | {7} | 是 | 加载 |
| 0 | {7,0} | 是 | 加载 |
| 1 | {7,0,1} | 是 | 加载 |
| 2 | {0,1,2} | 是 | 替换7(7下次出现在∞远) |
| 0 | {0,1,2} | 否 | - |
| 3 | {0,2,3} | 是 | 替换1(1不再出现) |
| 0 | {0,2,3} | 否 | - |
| 4 | {2,3,4} | 是 | 替换0(0下次在很久后) |
| 2 | {2,3,4} | 否 | - |
| 3 | {2,3,4} | 否 | - |
→ 共 6次缺页中断,优于FIFO或LRU。
计算一个多步指令在跨页情况下产生的缺页中断次数,需综合考虑指令获取、操作数读取、结果写入等各阶段所涉及的页面是否已在内存中。若所需页面未驻留,则会产生一次缺页中断。
✅ 计算步骤如下:
-
分析指令的执行过程
- 取指令(Instruction Fetch)
- 取源操作数(Operand Fetch)
- 存目标操作数(Store Result)
- 每个步骤可能访问不同的虚拟页面
-
确定每个访问地址所在的页面
- 将逻辑地址转换为页号(通常通过页大小进行除法运算)
- 例如:页大小为 4KB → 地址 / 4096 = 页号
-
判断各相关页面是否已在主存中
- 初始状态已知(如全不在内存或部分在)
- 按照执行顺序逐次检查每一页是否命中
-
统计缺页次数
- 每个首次访问且不在内存中的页面都会引发一次缺页中断
- 注意:同一页面多次访问只算一次缺页(首次)
🔍 示例说明:
假设执行指令 COPY A TO B,其中:
- 指令本身位于页面 0 和 1(跨页)
- 源地址 A 跨越页面 2 和 3
- 目标地址 B 跨越页面 4 和 5
- 所有页面初始均不在内存中
分阶段分析:
| 阶段 | 访问页面 | 是否缺页 | 原因 |
|---|---|---|---|
| 取指令 | 页面0 → 缺页;页面1 → 缺页 | 是(2次) | 指令跨页,两个页面都未加载 |
| 读取A | 页面2、3 | 是(2次) | A的数据分布在两个新页面 |
| 写入B | 页面4、5 | 是(2次) | B的目标页面也都不在内存 |
→ 总共产生 6次缺页中断
⚠️ 若题目限定“仅因取指令和取操作数”,不包括写回,则只计指令+源操作数部分。
📝 特殊情况处理:
- 指令不跨页:只需加载一个页面 → 1次缺页(若不在内存)
- 操作数连续但跨页:如数组拷贝跨越两个页面 → 每个未驻留页各一次
- 已有部分页面在内存:仅对缺失页面计数
💡 实用技巧:
- 画表格法:列出每个访问地址及其页号,标记是否缺页
- 按执行流顺序处理,不能并行忽略先后
- 关注题干条件:“所有页面都不在内存” 或 “某些页面已在内存”
✅ 总结公式(理想条件下):
总缺页次数 =
(指令占用的新页面数) +
(源操作数涉及的新页面数) +
(目标操作数涉及的新页面数)
前提是这些页面初始都不在内存,且无重复页。


1172

被折叠的 条评论
为什么被折叠?



