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
LRU LFU FIFO 转载的更多相关文章
- 操作系统 页面置换算法LRU和FIFO
LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...
- Mybatis(七)-- LRU LFU 算法
这篇博客主要介绍LRU LFU 算法,因为在Mybatis的缓存中会用到,所以放到这个系列中了.此外,这是我翻译的一篇文章,觉得原文已经写的很好了,所以就直接翻译一下,留作知识整理. 英文原文出处如下 ...
- 缓存失效策略(FIFO,LRU,LFU)
当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时 ...
- ORALCE 之LRU链与脏LRU链【转载】
今天是2013-09-09,时别n久的一篇经典文章,有被我在google发现了,再次转载一下.学习一下. 一.LRU链: 任何缓存的大小都是有限制的,并且总不如被缓存的数据多.就像Buffer cac ...
- 缓存子系统如何设计(Cachable tag, Memcache/redis support, xml config support, LRU/LFU/本地缓存命中率)
大家对这段代码肯定很熟悉吧: public List<UserInfo> SearchUsers(string userName) { string cacheKey=string.For ...
- 关于LRU算法(转载)
原文地址: http://flychao88.iteye.com/blog/1977653 http://blog.csdn.net/cjfeii/article/details/47259519 ...
- 聊聊缓存淘汰算法-LRU 实现原理
前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘 ...
- java 知识点随记
JAVA 读取配置文件: Properties props= new Properties();//文件在src目录下,编译会被加载到classpath下. Props.load(Test.class ...
- 高可用Redis(十三):Redis缓存的使用和设计
1.缓存的受益和成本 1.1 受益 1.可以加速读写:Redis是基于内存的数据源,通过缓存加速数据读取速度 2.降低后端负载:后端服务器通过前端缓存降低负载,业务端使用Redis降低后端数据源的负载 ...
随机推荐
- 《Markdown 一些基本语法》
Markdown编辑器是在上学期学习Java时写博客用来编辑文字内容以及形式的,但其实当时掌握Markdown的语法却是极少的,也仅仅是会使用几级标题这样简单的语法,就和当时学习git上传代码一样,也 ...
- Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义
回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...
- Ubuntu上基于开源代码PhoneMe的J2ME环境搭建及使用
测试环境:Ubuntu 14.04.5 LTS J2ME背景知识及PhoneME介绍 J2ME相关介绍 在正式开始介绍J2ME之前,这里我列出一些常见名词,方便与下文参照:J2ME(Java2 Pla ...
- 星云opencv总结
- iOS中富文本NSMutableAttributedString的用法
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc]initWithString:@"我是富文 ...
- Eclipse安装scala
Scala官方提供了三种插件,分别支持Eclipse.NetBeans和Intellij IDEA开发环境.要在Eclipse IDE下安装Scala插件:选择Eclipse的菜单项Help--> ...
- .net 开源组件
文章转自:http://www.cnblogs.com/asxinyu/p/dotnet_opensource_project_3.html 在前2篇文章这些.NET开源项目你知道吗?让.NET开 ...
- TypeScript 素描-基础类型
博文读自 TypeScript 官方文档而来,不具有学习性,仅是本人学习时记录以供日后翻阅 ,有学习TypeScript的朋友还请去看更为详细的官方文档 TypeScript官网文档中的基础类型, T ...
- 隐藏NavigationBar的正确方式
-(void)viewWillAppear:(BOOL)animated { [self.navigationController setNavigationBarHidden:YES animate ...
- form表单的属性标签
form表单的常用标签 表单: <form id="" name="" method="post/get" action=" ...