zoukankan      html  css  js  c++  java
  • LRU LFU FIFO 转载

    --------------------------------------》href--------------------------》

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

     最近在做笔试题,其中虚拟存储管理中几种缺页中断算法经常考到,虽然这类题可说非常简单,但概念上却容易混淆而且如果不掌握正确的做法很容易出错,因此觉得有必要把这三种算法的实现过程理一遍,并从源代码级别去思考它们的实现。
     首先推荐一个博客,对这两个算法给出了不易错的演算步骤,也给了我一些启示,这篇博客也给出了源代码,但我没有去验证。
     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
    算法总结:数据结构应该还是一个队列,开始内存页面不满时按序把页面填入,之后如果调入的页不存在,则按照先进先出顺序,淘汰队头页面,如果调入的页存在,则将该页换至页尾,该页之后的元素前移,这个最好用什么数据结构?
    其实觉得腾讯这道题的序列没有代表性,要真正理解LRU过程中内存存储页面结构的变化情况,还是推荐看一下上面的博客。
    LFU算法:最近最不经常使用(Least Frequently Used),相比于前两个,LFU算法的资料要少得多,因为它的实现更加复杂,在网上搜到这个博客,http://www.cnblogs.com/tingyuxuan007/p/3823537.html,这个博客有这三个算法思想的讨论及图解,有利于初学者去彻底弄懂这个问题,现摘录一些它的语句来说清楚这个算法的思想:
    “这是一个基于访问频率的算法.与LRU不同,LRU是基于时间的,会将时间上最不常访问的数据淘汰;LFU为将频率上最不常访问的数据淘汰.既然是基于频率的,就需要有存储每个数据访问的次数.从存储空间上,较LRU会多出一些持有计数的空间.”,它描述这个算法的图也很经典

    我想有这幅图就已经不需要再多说什么了,如果还有不明白的,去原博客看一下叙述就行了。
    还是把腾讯这道题用LFU算法再做一遍:
       访问序列:1,2,3,4,1,2,5,1,2,3,4,5  
         最初:                3(1)      2(1)      1(1)       缺页次数:3      括号中是其访问次数   
            调入4                 4(1)       3(1)      2(1)       淘汰1,缺页次数:4 
            调入1                 1(1)       4(1)      3(1)       淘汰2,缺页次数:5 
            调入2                 2(1)       1(1)      4(1)       淘汰3,缺页次数:6 
            调入5                 5(1)       2(1)      1(1)       淘汰4,缺页次数:7
            调入1                 1(2)       5(1)      2(1)
            调入2                 2(2)       1(2)      5(1)
            调入3                 2(2)       1(2)      3(1)       淘汰5,缺页次数:8 
            调入4                 2(2)       1(2)      4(1)       淘汰3,缺页次数:9
            调入5                 2(2)       1(2)      5(1)       淘汰4,缺页次数:10
        共缺页10次,缺页中断率:10/12

  • 相关阅读:
    搭建LAMP环境部署discuz论坛
    25. SpringBoot 嵌入式Servlet容器配置修改
    7. mybatis sql 语句的抽取
    6. 动态 SQL 之<foreach>
    58. VUE 路径别名
    57. VUE TabBar 开发
    24. SpringBoot 自定义异常信息
    5. MyBatis 动态SQl语句 的使用
    4. Dao层 代理开发方式
    56. VUE keep-alive 组件视图缓存
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6202883.html
Copyright © 2011-2022 走看看