--------------------------------------》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

LRU LFU FIFO 转载的更多相关文章

  1. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  2. Mybatis(七)-- LRU LFU 算法

    这篇博客主要介绍LRU LFU 算法,因为在Mybatis的缓存中会用到,所以放到这个系列中了.此外,这是我翻译的一篇文章,觉得原文已经写的很好了,所以就直接翻译一下,留作知识整理. 英文原文出处如下 ...

  3. 缓存失效策略(FIFO,LRU,LFU)

    当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时 ...

  4. ORALCE 之LRU链与脏LRU链【转载】

    今天是2013-09-09,时别n久的一篇经典文章,有被我在google发现了,再次转载一下.学习一下. 一.LRU链: 任何缓存的大小都是有限制的,并且总不如被缓存的数据多.就像Buffer cac ...

  5. 缓存子系统如何设计(Cachable tag, Memcache/redis support, xml config support, LRU/LFU/本地缓存命中率)

    大家对这段代码肯定很熟悉吧: public List<UserInfo> SearchUsers(string userName) { string cacheKey=string.For ...

  6. 关于LRU算法(转载)

      原文地址: http://flychao88.iteye.com/blog/1977653 http://blog.csdn.net/cjfeii/article/details/47259519 ...

  7. 聊聊缓存淘汰算法-LRU 实现原理

    前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘 ...

  8. java 知识点随记

    JAVA 读取配置文件: Properties props= new Properties();//文件在src目录下,编译会被加载到classpath下. Props.load(Test.class ...

  9. 高可用Redis(十三):Redis缓存的使用和设计

    1.缓存的受益和成本 1.1 受益 1.可以加速读写:Redis是基于内存的数据源,通过缓存加速数据读取速度 2.降低后端负载:后端服务器通过前端缓存降低负载,业务端使用Redis降低后端数据源的负载 ...

随机推荐

  1. [LeetCode] Basic Calculator II 基本计算器之二

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  2. JavaScript简单对象的定义方法

    工厂模式: 初级开发者可能会这样定义对象: var obj = new Object(); obj.name = "hero"; obj.showName=function (){ ...

  3. C++ 数组array与vector的比较

    转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...

  4. ECharts学习(4)--仪表盘

    1. ECharts中的仪表盘,要使用这个图表时把series中的type属性修改成'gauge',然后在detail中设置仪表盘详情,用于显示数据.最常用的是formatter(格式化函数或者字符串 ...

  5. tensorflow 一些好的blog链接和tensorflow gpu版本安装

    pading :SAME,VALID 区别  http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...

  6. 版本管理工具svn简介

    svn简介 SVN是一种C/S架构的版本管理软件 , 能够帮助我们保存开发过程中各个文件的所有历史版本, 你因此可以方便的找回软件的任何一个历史状态., 日常开发中经常用到. 安装使用 1.  在 u ...

  7. Your app declares support for audio in the UIBackgroundModes key in your Info.plist 错误

    提交AppStore时候被拒绝 拒绝原因:Your app declares support for audio in the UIBackgroundModes key in your Info.p ...

  8. vue-validator(vue验证器)

    官方文档:http://vuejs.github.io/vue-validator/zh-cn/index.html github项目地址:https://github.com/vuejs/vue-v ...

  9. 架构师养成记--6.单例和多线程、ThreadLocal

    一.ThreadLocal 使用wait/notify方式实现的线程安全,性能将受到很大影响.解决方案是用空间换时间,不用锁也能实现线程安全. 来看一个小例子,在线程内的set.get就是thread ...

  10. 企业站SEO记录

    半个多月前给接了一个企业站,赚点小钱,客户也没什么要求,所以就找了模板修改了一下就上线了,然后又做了微信网站.搭了微信公众号,也都没什么技术含量,最伤脑筋的就是做关键词排名了,虽然做的几个词竞争也不是 ...