当前位置:   article > 正文

一文搞懂操作系统页面置换算法

操作系统页面置换算法

目录

一.为什么要引入页面置换算法

二.页面置换算法

2.1最优页面置换算法

2.2FIFO页面置换算法

2.3LRU页面置换算法

 2.4时钟置换算法(CLOCK)(NRU)

2.5改进的时钟算法

 


一.为什么要引入页面置换算法

请求分页 存储管理与 基本分页 存储管理的主要区别:
在程序执行过程中,当所 访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存 ,然
后继续执行程序。
若内存空间不够,由操作系统负责 将内存中暂时用不到的信息换出到外存
操作系统确定所需页面的在辅助存储上的位置,但是却发现空闲帧列表上没有空闲帧,所有内存都在使用。

这时,操作系统有多个选项。它可以终止用户进程。然而,请求分页是操作系统试图改善计算机系统的使用率和吞吐量的技术。用户不应该意识到,他们的进程是运行在分页系统上;对用户而言,分页应是透明的。因此,这个选择并不是最佳的。

操作系统可以改为使用标准交换和换出进程,以释放其所有帧并降低多道程度。 然而,由于在内存和交换空间之间复制整个进程的开销,大多数操作系统不再使用标准交换。 大多数操作系统现在将交换页面与页面置换(page replacement)结合在一起。在内存中找到一些页面,但没有真正使用,将其中的页面拿出。

但是我们应该换出内存中的哪个页面呢?

所以我们由此就进入页面置换算法的学习了:


二.页面置换算法

2.1最优页面置换算法

又称为OPT或MIN。置换最长时间不会使用的页面。该算法对于给定数量的页面会产生最低的可能的缺页错误率,不会遭受Belady异常。但难以实现,因为操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的

例题:

假设系统为某进程分配了三个内存块,并考虑到有一下页面号引用串(会依次访问这些页面):
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

 

选择从 0,1,7 中淘汰一 页。按最佳置换的规则, 往后寻找,最后一个出现的页号就是要淘汰的页面。(也就是7)
整个过程 缺页中断 发生了 9 页面置换 发生了 6
注意:缺页时未必发生页面置换。若还有可用的空闲内存块,就不用进行页面置换。
缺页率 = 9/20 = 45%

2.2FIFO页面置换算法

每个页面记录了调到内存的时间。当必须置换页面时,将选择最旧的页面。可以创建一个FIFO队列(队列的最大长度取决于系统为进程分配了多少个内存块),来管理所有的内存页面。置换的是队列的首个页面。当调入页面到内存时,就将它加到队列的尾部。每次选择淘汰的页面最早进入内存的页面

例题:


3个帧(内存块)开始为空。首次的3个引用(7,0,1)会引起缺页错误,并被调到这些空帧。之后将调入这些空闲帧。下一个引用(2)置换7,这是因为页面7最先调入。由于0是下一个引用并且已在内存中,所以这个引用不会有缺页错误。对3的首次引用导致页面0被替代,因为它现在是队列的第一个。因为这个置换,下一个对0的引用将有缺页错误,然后页面1被页面0置换。

Belady 异常 —— 当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有 FIFO 算法会产生 Belady 异常。 另外, FIFO 算法虽然 实现简单 ,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此, 算法性能差.

2.3LRU页面置换算法

最近最久未使用置换算法( LRU least recently used ):每次 淘汰的页面 最近最久未使用的页面
实现方法:赋予每个页面对应的页表项中,用 访问字段记录该页面自上次被访问以来所经历的时间 t
当需要淘汰一个页面时,选择现有页面中 t 值最大的,即最近最久未使用的页面

 例题:

例:假设系统为某进程分配了 四个 内存块,并考虑到有以下页面号引用串:
1, 8, 1, 7, 8, 2, 7, 2, 1, 8, 3, 8, 2, 1, 3, 1, 7, 1, 3, 7

 2.4时钟置换算法(CLOCK)(NRU)

最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT 算法性能的,但是实现起来需要专门的硬件支持,算法开销大。
时钟置换算法 是一种性能和开销较均衡的算法,又称 CLOCK 算法 ,或 最近未用算法 NRU Not
Recently Used
简单的 CLOCK 算法 实现方法:为每个页面设置一个 访问位 ,再将内存中的页面都通过链接指针 链接成 一个循环队列 。当某页被访问时,其访问位置为 1 。当需要淘汰一个页面时,只需检查页的访问位。 如果是0 ,就选择该页换出;如果是 1 ,则将它置为 0 ,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1 ,则将这些页面的访问位依次置为 0 后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0 的页面,因此 简单的 CLOCK 算法 选择一个淘汰页面 最多会经过两轮描
例:假设系统为某进程分配了 五个 内存块,并考虑到有以下页面号引用串:
1, 3, 4, 2, 5, 6, 3, 4, 7
当访问完五个内存块后,循环队列如下图:

 可以看到访问位都为1。

当要引用页面号为6时,发现五个内存块都满了,这时将五个内存块的访问位都设置为0.

 然后将页面号为6所需的内容放到1号页占据的内存块:

 然后访问3,将3的访问位设置为1。

 然后访问4,将4的访问位设置为1.

 然后访问7,首先看内存块没有7,然后开始选择替换的页面,指针经过的内存块把访问位设置为0。

找到第一个访问位为0的内存块,替换出去。

 基于此就完成了所有任务。

2.5改进的时钟算法

简单的时钟置换算法 仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O 操作写回外存。 只有被淘汰的页面被修改过时,才需要写回外存
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。 在其他条件都相同时,应优先淘汰没有修改过的页面 ,避免 I/O 操作。这就是改进型的时钟置换算法的思想。
修改位 =0 ,表示页面没有被修改过; 修改位 =1 ,表示页面被修改过。
为方便讨论,用 (访问位,修改位) 的形式表示各页面状态。如(1, 1 )表示一个页面近期被访问过, 且被修改过。
算法规则 :将所有可能被置换的页面排成一个循环队列
第一轮:从当前位置开始扫描到第一个( 0, 0 )的帧用于替换。本轮扫描不修改任何标志位
第二轮:若第一轮扫描失败,则重新扫描,查找第一个( 0, 1 )的帧用于替换。本轮将所有扫描过的帧访问位设为0
第三轮:若第二轮扫描失败,则重新扫描,查找第一个( 0, 0 )的帧用于替换。本轮扫描不修改任何标志位
第四轮:若第三轮扫描失败,则重新扫描,查找第一个( 0, 1 )的帧用于替换。
由于第二轮已将所有帧的访问位设为 0 ,因此经过第三轮、第四轮扫描一 定会有一个帧被选中,因此 改进型 CLOCK 置换算法 选择一个淘汰页面 最多会进行四轮扫描
例题1:有下列队列,现在要选择一个页面置换出去。请写出过程。

 过程:第一轮扫描,找(0,0)不改变访问位,所以找到了(0,0)然后置换

 

例题2:有下列队列,现在要选择一个页面置换出去。请写出过程。

 过程:

第一轮找(0,0)

 没有满足情况的。

第二轮扫描,尝试找到(0,1),然后修改扫描过的访问位为0

 

例题3:有下列队列,现在要选择一个页面置换出去。请写出过程。

过程:第一轮找(0,0)不修改访问位,没有发现

第二轮找(0,1)并修改扫描过的访问位为0,没有找到

 

 第三轮找(0,0)不修改访问位,成功找到。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/163519
推荐阅读
相关标签
  

闽ICP备14008679号