虚存系统:页面置换算法

一:FIFO、LRU、OPT三种置换算法:

1. 缺页中断

  在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。 
  缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤: 
  1. 保护CPU现场 
  2. 分析中断原因 
  3. 转入缺页中断处理程序进行处理 
  4. 恢复CPU现场,继续执行 
  但是缺页中断时由于所要访问的页面不存在与内存时,有硬件所产生的一种特殊的中断,因此,与一般的中断存在区别: 
   1. 在指令执行期间产生和处理缺页中断信号 
   2. 一条指令在执行期间,可能产生多次缺页中断 
   3. 缺页中断返回时,执行产生中断的那一条指令,而一般的中断返回时,执行下一条指令

2. 页面置换算法

  进程运行过程中,如果发生缺页中断,而此时内存中有没有空闲的物理块是,为了能够把所缺的页面装入内存,系统必须从内存中选择一页调出到磁盘的对换区。但此时应该把那个页面换出,则需要根据一定的页面置换算法(Page Replacement Algorithm)来确定。

源连接:http://blog.csdn.net/u011080472/article/details/51206332

二、习题:

题一

最近在做笔试题,其中虚拟存储管理中几种缺页中断算法经常考到,虽然这类题可说非常简单,但概念上却容易混淆而且如果不掌握正确的做法很容易出错,因此觉得有必要把这三种算法的实现过程理一遍,并从源代码级别去思考它们的实现。
 首先推荐一个博客,对这两个算法给出了不易错的演算步骤,也给了我一些启示,这篇博客也给出了源代码,但我没有去验证。
 http://www.cnblogs.com/freeyiyi1993/archive/2013/05/18/3084956.html
 再给出腾讯的笔试题原题:在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的页面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为多少,采用LRU调度算法产生的缺页中断数为多少?
 FIFO算法:(First In First Out),先进先出,一般看到这类思想,首先想到的数据结构应当是队列,但是我们这里最好是用vector,因为调页过程中需要遍历队列检查该页是否已存在,当算法的存储结构是队列或栈,但实现过程中需要经常遍历全队列或全栈的内容时,最好用vector,这是《剑指Offer》面试题25给我的启发。给出一个访问序列的模拟算法到此应该非常简单了,为了节省时间,下面仅给出题目计算步骤,代码今后再补。
           访问序列:1,2,3,4,1,2,5,1,2,3,4,5
                   1,2,3先调入内存,内存结构:3      2      1    缺页次数:3  
                   4调入内存,1调出,  内存结构:4      3      2    缺页次数:4
                   1调入内存,2调出,  内存结构:1      4      3    缺页次数:5
                   2调入内存,3调出,  内存结构:2      1      4    缺页次数:6
                   5调入内存,4调出,  内存结构:5      2      1    缺页次数:7
                   1存在,内存结构不改变
                   2存在,内存结构不改变
                   3调入内存,1调出,  内存结构:3      5      2    缺页次数:8
                   4调入内存,2调出,  内存结构:4      3      5    缺页次数:9
                   5存在,内存结构不改变
            共缺页9次,缺页中断率 = 缺页中断次数 / 总访问页数 = 9 / 12    
LRU算法:最近最少使用(Least Recently Used),先看一下调页过程
           访问序列:1,2,3,4,1,2,5,1,2,3,4,5
                1,2,3先调入内存,内存结构:3      2      1    缺页次数:3  
                4调入内存,1调出,  内存结构:4      3      2    缺页次数:4
                1调入内存,2调出,  内存结构:1      4      3    缺页次数:5
                2调入内存,3调出,  内存结构:2      1      4    缺页次数:6
                5调入内存,4调出,  内存结构:5      2      1    缺页次数:7
           到这一步其实和FIFO并没有区别
              1调入内存,由于内存中存在1,故没有缺页中断,但由于1最近被访问过,所以要将其位置调换,
              使它最后一个被淘汰,内存结构:1      5      2
              2调入内存,没有缺页中断,但内存位置要变化,内存结构:2      1      5
                  3调入内存,5调出,  内存结构:3      2      1    缺页次数:8
                  4调入内存,1调出,  内存结构:4      3      2    缺页次数:9
                  5调入内存,2调出,  内存结构:5      4      3    缺页次数:10
           共缺页10次,缺页中断率:10/12
算法总结:数据结构应该还是一个队列,开始内存页面不满时按序把页面填入,之后如果调入的页不存在,则按照先进先出顺序,淘汰队头页面,如果调入的页存在,则将该页换至页尾,该页之后的元素前移,这个最好用什么数据结构?

源连接:http://blog.chinaunix.net/uid-13246637-id-5185352.html

题二:

在一个请求页式存储管理中,一个程序的页面走向为 3、4、2、1、4、5、3、4、5、1、2,并采用 LRU 算法。设分配给该程序的存储块数 S 分别为 3 和 4,在该访问中发生的缺页次数 F 是 ?

解:

以下用x表示缺页的情况
1.S=3
3,4,2,1,4,5,3,4,5,1,2
---------------------
3 4 2 1 4 5 3 4 5 1 2
  3 4 2 1 4 5 3 3 5 1
    3 4 2 1 4 5 4 3 5
x x x x   x x     x x
所以F=8
2.S=4
3,4,2,1,4,5,3,4,5,1,2
---------------------
3 4 2 1 4 5 3 4 5 1 2
  3 4 2 1 4 5 3 3 3 1
    3 4 2 1 4 5 4 5 3
      3 3 2 1 1 1 4 5
x x x x   x x       x
所以F=7

 内存结构竖着写。这种方式比较简单。

源链接:http://blog.csdn.net/hyqsong/article/details/51563327

题三:

解:

24165408_x9EQ.jpg

  1. 需要调用1号页面,此时1号页面不在内存中(缺页+1)。那么将它调入内存。

  2. 需要调用8号页面,此时8号页面不在内存中(缺页+1)。那么将它调入内存。

  3. 需要调用1号页面,此时1存在(不缺页),注意这里和8换了位置,因为我们使用了1号页面,那么8号页面就变为近期最少使用的页面。那么将它调入内存。

  4. 需要调用7号页面,此时7号页面不在内存中(缺页+1)。那么将它调入内存。

  5. 需要调用8号页面,此时8存在(不缺页),注意这里调整8到最下方。

  6. 需要调用2号页面,此时2号页面不在内存中(缺页+1)。那么将它调入内存。

  7. 需要调用7号页面,此时7存在(不缺页),注意这里7到了最下面,说明我们刚刚使用过它,而相对应的1在最上面,1为近期最少使用的页面

  8. 需要调用2号页面,此时2存在(不缺页),将2号调整到最下面

  9. 需要调用1号页面,此时1存在(不缺页),将1号调整到最下面

  10. 需要调用8号页面,此时8存在(不缺页),将8号调整到最下面

  11. 需要调用3号页面,此时3号页面不在内存中(缺页+1),将最上方的页面置换出去,然后把3号页面存放到最下方。。

  12. 缺页率 = 6 / 20 =3/ 10 = 30%

 

转载于:https://my.oschina.net/u/1389206/blog/886125

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值