当前位置: 首页 > news >正文

计算机组成原理_Cache的替换算法

计算机组成原理总目录

Cache的替换算法

(1)全相联映射下,若Cache已满,则在所有Cache块中选取一个Cache块进行替换
在这里插入图片描述
(2)直接映射下,若Cache已满,则从Cache对应要调入的主存块位置进行替换
在这里插入图片描述
(3)组相联映射下,当Cache内的分组满后,才需要进行替换
在这里插入图片描述

1. 随机算法(RAND)

随机算法(Random)顾名思义就是随机地选择Cache块进行替换

如下图:

  • 橙色:代表Cache有空块可直接使用,则调入主存块到空闲Cache块中
  • 红色:代表该主存块在Cache中未命中,则替换该Cache块
  • 绿色:代表该主存块在Cache中命中,直接访问该Cache块即可
    在这里插入图片描述

分析:没有考虑到局部性原理,运气不好的话刚调入的Cache块有会被马上替换出来

2. 先进先出(FIFO)

先进先出算法(First In First Out)顾名思义就是替换最先被使用的Cache块

如下图:

  • 橙色:代表Cache有空块可直接使用,则调入主存块到空闲Cache块中
  • 红色:代表该主存块在Cache中未命中,【则替换最先被使用的Cache块
  • 绿色:代表该主存块在Cache中命中,直接访问该Cache块即可
    在这里插入图片描述

分析:同样没有考虑到局部性原理,如果最先被使用的先被调出,而后又频繁使用1234块,就会发生【抖动现象

抖动:频繁调入调出Cache块,造成性能的下降==
如下图的极端情况,在下图中的访问主存块顺序下,可能一下都没命中
(有没有觉得很像你在电脑word写了半天论文,却因为切到QQ回了一条消息而导致word卡死,论文没了)
在这里插入图片描述

3. 近期最少使用(LRU)

近期最少使用算法(Least Recently Used):
每个Cache都设置一个【计数器】,代表每个Cache块有多久没被访问,当Cache满的时候替换【计数器】最大的Cache块

如下图:

  • 橙色:代表Cache有空块可直接使用,【则调入主存块到空闲Cache块中并设置计数器为0,其余非空闲块计数器+1
    在这里插入图片描述
    在这里插入图片描述
  • 红色:代表该主存块在Cache中未命中,【则替换计数器最大的Cache块,并清零该计数器,其他非空闲块计数器+1
    在这里插入图片描述
  • 绿色:代表该主存块在Cache中命中,【则比该Cache块计数器低的均+1,并清零该Cache块计数器
    在这里插入图片描述

分析:该算法比较好的利用了局部性原理(近期被访问的主存块可能在不就还会被访问到),因此该算法很不错
但是如果频繁被访问的主存块数 > Cache的块数,则可能还会发生抖动现象

4. 最近不经常使用(LFU)

最近不经常使用算法(Least Frequently Used):
每个Cache都设置一个【计数器】,用于记录每个Cache块被访问的次数,当Cache满的时候替换【计数器】最小的Cache块

如下图:

  • 橙色:代表Cache有空块可直接使用,【则调入主存块到空闲Cache块中并设置计数器为0
    在这里插入图片描述
  • 红色:代表该主存块在Cache中未命中,【则选择计数器最小的Cache块替换,若计数器同样小,则可以采用其他策略(RAND、FIFO、按顺序)进行替换,并重置计数器为0
    在这里插入图片描述
  • 绿色:代表该主存块在Cache中命中,【则命中的Cache块计数器+1
    在这里插入图片描述

分析:没有很好的利用局部性原理,因为已知经常用到的主存块在未来不一定要用到,其命中率相比LRU较低,且CPU访问主存的次数极高,代表计数器将会占用较多的空间

LRU和LFU比较:LRU会替换最近最少访问的Cache块,而LFU会替换访问次数最小的Cache块

虽然算法不一样,但从说明上这么一看似乎LRU也可以理解成LFU,最近最少访问不就等于访问次数最小吗?

但是假设我们先频繁访问了某程序的主存数据A【主存块号为1、2、3、4】,将其全部装入Cache,如果未来需要频繁访问程序的主存数据B【97、98、99】
(1)对LFU算法而言,就会出现频繁调入调出计数器最小的【Cache块(1)】,即抖动现象
在这里插入图片描述
(2)但对于LRU算法的影响较小,LRU算法能更快的把数据A的Cache块全部替换成数据B的主存块
在这里插入图片描述

相关文章:

  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • 如何快速提取设计地形等高线?
  • 详解MeerEVM:MeerDAG共识下的智能合约执行引擎
  • 上万字全面解读websocket(多种实现方案,含集群实现代码)
  • 【网络安全】XSS跨站脚本攻击专题讲解
  • 【栈和队列OJ】一、有效的括号
  • 行业竞争分析及发展动向
  • c++现代特性
  • 【学习笔记】go协程和通道
  • 十二、bootstrap前端开发框架
  • USACO Training 1.3 Milking Cows
  • < Linux > 进度条小程序 + git三板斧
  • 惊险的十天
  • 【数据结构初阶】堆堆的实现堆排序TOP-K
  • 自动驾驶技术综述1:自动驾驶算法软件架构介绍
  • 【译】JS基础算法脚本:字符串结尾
  • docker-consul
  • Kibana配置logstash,报表一体化
  • 二维平面内的碰撞检测【一】
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于web的全景—— Pannellum小试
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 排序算法之--选择排序
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 系统认识JavaScript正则表达式
  • 学习JavaScript数据结构与算法 — 树
  • 一、python与pycharm的安装
  • 一文看透浏览器架构
  • 大数据全解:定义、价值及挑战
  • 说说我为什么看好Spring Cloud Alibaba
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (11)MSP430F5529 定时器B
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)(3.5) 遥测无线电区域条例
  • (js)循环条件满足时终止循环
  • (rabbitmq的高级特性)消息可靠性
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (万字长文)Spring的核心知识尽揽其中
  • (一) springboot详细介绍
  • (原)本想说脏话,奈何已放下
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)虚函数剖析
  • .java 9 找不到符号_java找不到符号
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • /proc/vmstat 详解
  • ??eclipse的安装配置问题!??
  • @Transactional 详解
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [BZOJ 1040] 骑士
  • [BZOJ4010]菜肴制作
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)