本文章适用于本科院校学生期末速成操作系统中存储管理的全局页面替换策略的相关算法,也适用于计算机学院老师教学板书参考使用。
在多道程序正常运行的过程中,属于不同进程的页面被分散存放在内存页框中,当发生缺页异常时,如果已无空闲页框,系统要选择一个驻留页面进行淘汰。在此讨论的是所有驻留页面都可作为置换对象的情况,而不管页面所属进程的全局页面置换算法。
本文以一道例题讲解三种算法:
在一个请求分页虚存管理系统中,一个程序运行的页面走向是:
1,2,3,4,2,1,5,6,2,1,2,3,7,6,3
分别用OPT、FIFO、LRU算法,对于分配给程序4个页框的情况,求出缺页异常次数和缺页中断率。
首先,我们可以画出这样的一个框,上面是程序运行的页面走向,下面是四行即四个页框,最下面一行是是否缺页,缺页即打√,不缺页就打×。
什么是缺页?
页框里没这个数字就是缺页,有这个数字就是不缺页
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 |
页框 2 | 2 | 2 | 2 |
页框3 | 3 | 3 |
页框4 | 4 |
是否缺页 | √ | √ | √ | √ |
然后我们可以看到接下来的两个数字2和1都是在页框里有的数字,也就是说不缺页,就不需要替换(因为已经有了,如果没有,就需要替换),所以直接照着写就可以了:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 |
是否缺页 | √ | √ | √ | √ | × | × |
(↑↑↑后两种算法直接跳至此阶段↑↑↑)
重点来了,这时候出现了一个5!那这个5应该怎么进入页框里呢?也就是该把已经在页框里的1,2,3,4哪个替换掉呢?这时候就需要看看我们OPT算法的核心思想了:当要调入新的一页而淘汰旧的一页时,选择淘汰未来不再使用的页,或距现在最长时间后才访问的页。所以我们看上面的运行的页面走向,发现4这个数字在后面都没有出现过,那我们就可以把4这个数字替换成5。如图所示:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 | 5 |
是否缺页 | √ | √ | √ | √ | × | × | √ |
好家伙,又出现了一个6,这个时候要把页框里的1,2,3,5哪个替换掉呢?还是看上面的运行的页面走向,看一下哪个数字是距现在最长时间后才访问的!2,1,2,3,7,6,3,发现1,2,3在后面都有访问,5没有,所以又要把5给替换掉(5太惨了,刚来了又要走了),如图:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框 3 | 3 | 3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 | 5 | 6 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ |
后面的2,1,2,3都是页框里有的数字,所以我们照填就可以了,如图:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 | 5 | 6 | 6 | 6 | 6 | 6 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ | × | × | × | × |
然后OPT算法中最大的问题来了,出现了个7,那把谁替换成7呢?我们先看最上面,有6和3,没有1和2,那是把1替换成7还是把2替换成7呢?我也不知道,因为程序页面引用串是无法预知的,不可能对程序的运行过程做出精准断言,也就是说后面的运行页面是随机的,谁也不知道哪个页面是距现在最长时间后才访问的页,所以不知道用哪个去替换。
OPT算法的缺点如上所说,计算机没有预知未来的能力,而OPT想要通过预知未来回天改命是不行的。OPT算法也只能作为一个理论算法。
那下面我们来看看先进先出页面替换算法(FIFO)
二、先进先出页面替换算法
核心思想:基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入内存的页面,即淘汰在内存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性较大。
简单来说就是谁先进入页框,然后遇到缺页的情况了,就把先进入页框的数字给替换掉。
表格的情况如下:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 |
是否缺页 | √ | √ | √ | √ | × | × |
这个时候,5出现了,那么应该把谁替换成5呢?因为是1先进来的,所以把1给替换掉。如图:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 5 | 5 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 6 |
页框3 | 3 | 3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 | 4 | 4 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ |
后面的2又回来了(刚走又叫我回来),这个时候看表格发现是3最先进入页框里的,就把3替换成2,如图:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 5 | 5 | 5 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 6 | 6 |
页框3 | 3 | 3 | 3 | 3 | 3 | 3 | 2 |
页框4 | 4 | 4 | 4 | 4 | 4 | 4 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ | √ |
以此类推,最后的结果如图所示:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 5 | 5 | 5 | 5 | 5 | 3 | 3 | 3 | 3 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 6 | 6 | 6 | 6 | 6 | 7 | 7 | 7 |
页框3 | 3 | 3 | 3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 6 | 6 |
页框4 | 4 | 4 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 1 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ | √ | √ | × | √ | √ | √ | × |
三、最近最少使用页面替换算法
核心思想:最近最少使用页面替换算法淘汰的页面在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还要被立即使用,而那些在较长时间内未被使用的页面可能不会立即使用。
前面两种算法在运行页面走向中是从左往右看的,这个算法是从右往左看的,简单来说,就是从右往左看,哪个在页框里的数字距当前要替换的数字越远,就替换掉它,如图所示:
当前表格的情况如下:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 |
是否缺页 | √ | √ | √ | √ | × | × |
当5出现了,就在最上面的运行页面走向从右往左看,分别是1,2,4,3,2,1,可见在页框里的1,2,3,4中3离5最远,所以就把3给替换掉,此时的表格如下:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 5 |
页框4 | 4 | 4 | 4 | 4 |
是否缺页 | √ | √ | √ | √ | × | × | √ |
那现在6呢?还是老方法,从右往左看,页框中1,2,5,4谁离6最远?6前面是5,1,2,4,看样子是4离的最远,那就把4替换掉!如表格所示:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 5 | 5 |
页框4 | 4 | 4 | 4 | 4 | 6 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ |
后面2,1,2都是在页框里的,那我们就照着写:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 5 | 5 | 5 | 5 | 5 |
页框4 | 4 | 4 | 4 | 4 | 6 | 6 | 6 | 6 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ | × | × | × |
这个时候出现了3,从右往左看,3的前面是2,1,2,6,5,怎么有两个2?出现两个2怎么算?只算第一个出现的,也就是2,1,6,5,所以我们把5给替换掉。
注意重点:
当出现多个相同的数字在前面的时候,只看第一个
如表格所示:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 5 | 5 | 5 | 5 | 5 | 3 |
页框4 | 4 | 4 | 4 | 4 | 6 | 6 | 6 | 6 | 6 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ | × | × | × | √ |
以此类推。
最终的结果如表格所示:
页面走向 | 1 | 2 | 3 | 4 | 2 | 1 | 5 | 6 | 2 | 1 | 2 | 3 | 7 | 6 | 3 |
页框1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 6 | 6 |
页框2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
页框3 | 3 | 3 | 3 | 3 | 5 | 5 | 5 | 5 | 5 | 3 | 3 | 3 | 3 |
页框4 | 4 | 4 | 4 | 4 | 6 | 6 | 6 | 6 | 6 | 7 | 7 | 7 |
是否缺页 | √ | √ | √ | √ | × | × | √ | √ | × | × | × | √ | √ | √ | × |
缺页异常次数
缺页异常次数就是看下面有多少是缺页的,也就是看多少个√,例如上面这个表格(LRU算法),出现的√有9个,那就是缺页异常9次
缺页中断率
缺页中断率=缺页异常次数/总次数
总次数就是一共有多少个页面走向,还是看上面的这个表格(LRU算法)
一共有15个页面走向,所以缺页中断率等于=9/15=3/5
本例题来自书
操作系统教程(第5版)费翔林 骆斌 编著
P248页 应用题第1题
感谢大家浏览,谢谢