热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

页面置换算法LRULFU算法

为什么80%的码农都做不了架构师?页面置换算法介绍评价一个页面替换算法好坏的标准主要有两个,一是命中率要高,二是算法要容易实现。要提

为什么80%的码农都做不了架构师?>>>   hot3.png

页面置换算法介绍

评价一个页面替换算法好坏的标准主要有两个,一是命中率要高,二是算法要容易实现。要提高一个页面替换算法的命中率,首先要使这种算法能正确反映程序的局部性,其次是这种算法要能够充分利用主存中页面调度情况的历史信息,或者能够预测主存中将要发生的页面调度情况。 
  页面替换算法主要用于如下几个地方: 
  (1) 虚拟存储器中,主存页面(或程序段)的替换。 
  (2) Cache中的块替换。 
  (3) 虚拟存储器的快慢表中,快表的替换。 
  (4) 虚拟存储器中,用户基地址寄存器的替换。 

 

LFU算法

    近期最少使用算法,即LFU算法(Least Frequently Used algorithm)。这种算法选择近期最少访问的页面作为被替换的页面。显然,这是一种非常合理的算法,因为到目前为止最少使用的页面,很可能也是将来最少访问的页面。该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部性。但是,这种算法实现起来非常困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。因此,通常采用如下一种相对比较简单的方法。

    核心思想:如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小“

    传统实现:

    15153520_vnUf.png

        1. 新加入数据插入到队列尾部(因为引用计数为1);

        2. 队列中的数据被访问后,引用计数增加,队列重新排序;

        3. 当需要淘汰数据时,将已经排序的列表最后的数据块(访问次    数最少的块)删除。

    实现方式:

        可用一个小顶堆+hashmap,来实现;

       小顶堆对访问次数排序

       hashmap对每个缓存节点访问次数来更新
 

 

 

      改良版算法:Window-LFU(置换指定时间内,按照LFU规则排序淘汰数量)

     15153520_oP8W.png

  

        1)记录了过去W个访问记录;

        2)需要淘汰时,将W个访问记录按照LFU规则排序淘汰

        举例如下:

            假设历史访问记录长度设为9,缓存大小为3,图中不同颜色代表针对不同数据块的访问,同一颜色代表            针 对同一数据的多次访问。

            样例1:黄色访问3次,蓝色和橘色都是两次,橘色更新,因此缓存黄色、橘色、蓝色三个数据块

            样例2:绿色访问3次,蓝色两次,暗红两次,蓝色更新,因此缓存绿色、蓝色、暗红三个数据块

         需要维护一个队列,记录数据的访问流历史;需要排序。          

          Window-LFU只记录一部分的访问历史记录,不需要记录所有的数据访问历史,因此内存消耗和排序消耗都            比LFU要低。

 

LRU算法

     最久没有使用算法,即LRU算法(Least Recently Used algorithm)。这种算法把近期最久没有被访问过的页面作为被替换的页面。它把LFU算法中要记录数量上的"多"与"少"简化成判断"有"与"无",因此,实现起来比较容易。 

     核心思想:如果在一段时间内长时间不访问的页面将来也不会访问

    传统实现原理:

        假设 序列为 4 3 4 2 3 1 4 2

        物理块有3个 则

        首轮 4调入内存 4

        次轮 3调入内存 3 4

        之后 4调入内存 4 3

        之后 2调入内存 2 4 3

        之后 3调入内存 3 2 4

        之后 1调入内存 1 3 2(因为最少使用的是4,所以丢弃4)

        之后 4调入内存 4 1 3(原理同上)

        最后 2调入内存 2 4 1

LRU算法扩展,可以看我的另一篇博文:

    http://my.oschina.net/manmao/blog/601698

LRU算法简单实现:

https://mp.weixin.qq.com/s?__biz=MzAxNDI5NzEzNg==&mid=2651157126&idx=1&sn=aec050aae2efc427c1397f4a7e2fde6a&chksm=8064a3d9b7132acff5614b7c9fbcb60770a52970fa4f8b76e1ab06f8ce803040f998e3f42e95&scene=0&key=1a6dc58b177dc626a128add5b7c4924b9be81733861d4c335d100d3f533c6dd072c017e31903757829134be3cbf22354&ascene=14&uin=NzkwODcyMzQx&devicetype=android-19&version=26031732&nettype=WIFI&pass_ticket=b1FAKwVG%2FaONUhFzptp9fVyQ%2BjKJN0WTZmJ10%2FqDvgH1E3rS%2BVODI%2F%2F%2FHLW%2BF%2BBc


转:https://my.oschina.net/manmao/blog/603253



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
author-avatar
fffsssjjj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有