- 操作系统教程
- 操作系统 - 首页
- 操作系统 - 需求
- 操作系统 - 概述
- 操作系统 - 历史
- 操作系统 - 组件
- 操作系统 - 结构
- 操作系统 - 架构
- 操作系统 - TAT & WAT
- 操作系统 - 类型
- 操作系统 - 服务
- 操作系统 - 属性
- 操作系统 - 进程
- 操作系统 - 进程调度
- 操作系统 - 调度算法
- 操作系统 - 多线程
- 操作系统 - 内存管理
- 操作系统 - 虚拟内存
- 操作系统 - I/O 硬件
- 操作系统 - I/O 软件
- 操作系统 - 文件系统
- 操作系统 - 安全性
- 操作系统 - Linux
- 操作系统 - 考试试题及答案
- 操作系统 - 考试试题及答案
- 操作系统有用资源
- 操作系统 - 快速指南
- 操作系统 - 有用资源
- 操作系统 - 讨论
操作系统内存分配问答 #3
问题:页面错误何时发生?解释各种页面置换策略/算法。
答案:在按需分页内存管理技术中,如果需要执行的页面不在主存中,则会发生页面错误。为了将按需加载的页面加载到主存中,会在主存中搜索一个空闲页面帧并分配。如果没有空闲页面帧,内存管理器必须通过将内容交换到辅助存储器来释放一个帧,从而为所需页面腾出空间。为了交换页面,使用了许多方案或策略。
各种页面置换策略/算法
最佳页面置换算法 − 该算法替换最长时间内不会被使用的页面。页面错误发生时,内存中会有一组页面。其中一个页面将在下一条指令中被引用。其他页面可能要到 10、100 或甚至 1000 条指令后才会被引用。此信息可以与 PMT(页面映射表)中的每个页面一起存储。
P# 基地址 偏移量 其他信息 1 10 2 空 3 1000 ... 10 100 最佳页面算法简单地删除指令数最多的页面,这意味着它将在最远的将来被需要。该算法很久以前就被提出,并且难以实现,因为它需要对程序行为的未来知识。但是,可以通过使用在第一次运行时收集的页面引用信息,在第二次运行时实现最佳页面替换。
NRU(最近未使用)页面置换算法 - 该算法要求每个页面有两个额外的状态位 'R' 和 'M',分别称为引用位和修改位。每当引用页面时,引用位 (R) 会自动设置为 1。每当修改页面时,修改位 (M) 会设置为 1。这些位存储在 PMT 中,并在每次内存引用时更新。当发生页面错误时,内存管理器会检查所有页面,并根据 R 和 M 位将它们划分为 4 类。
类 1:(0,0) − 最近未使用且未修改 - 最佳替换页面。
类 2:(0,1) − 最近未使用但已修改 - 替换前需要将页面写出。
类 3:(1,0) − 最近使用但干净 - 可能很快会被再次使用。
类 4:(1,1) − 最近使用且已修改 - 可能很快会被再次使用,并且替换前需要写出。
该算法从编号最低的非空类中随机删除一个页面。
优点
易于理解。
易于实现。
FIFO(先进先出)页面置换算法 − 这是最简单的页面置换算法之一。选择并替换内存中停留时间最长的最旧页面。该算法借助 FIFO 队列来保存内存中的页面。页面插入到队列的后端,并在队列的前端替换。
在图中,引用字符串为 5、4、3、2、5、4、6、5、4、3、2、6,并且有 3 个空闲帧。前 3 次引用(5、4、3)导致页面错误,并被带入空闲帧。下一次引用(2)替换页面 5,因为页面 5 是最先加载的,依此类推。在 7 次页面错误后,下一次引用是 5,而 5 已经在内存中,因此这次引用没有页面错误。类似地,对于下一次引用 4 也是如此。+ 标记表示页面的传入,而圆圈表示选择的要删除的页面。
优点
FIFO 易于理解。
易于实现。
缺点
性能并不总是很好。它可能会替换一个活动页面以引入一个新页面,从而可能立即导致该页面的页面错误。
另一个意想不到的副作用是 FIFO 异常或 Belady 异常。这种异常表明,随着分配的页面帧数的增加,页面错误率可能会增加。
例如,下图显示了相同的页面跟踪,但内存更大。这里页面帧数为 4。
这里的页面错误是 10 而不是 9。
LRU(最近最少使用)算法 − 最近最少使用 (LRU) 算法替换最长时间未使用过的页面。它基于这样的观察结果:长时间未使用过的页面可能在最长时间内保持未使用,并且应该被替换。
最初,3 个页面帧是空的。前 3 次引用(7、0、1)导致页面错误,并被带入这些空闲帧。下一次引用(2)替换页面 7。由于下一次页面引用(0)已经在内存中,因此没有页面错误。现在,对于下一次引用(3),LRU 替换发现,在内存中的三个帧中,页面 1 最近最少使用,因此被替换。依此类推。
优点
LRU 页面置换算法非常有效。
它不受 Belady 异常的影响。
缺点
它的实现并不容易。
它的实现可能需要大量的硬件辅助。