Cache 替换策略--PLRU算法详解

一、引言

       LRU(Least Recently Used)是 cache 的经典替换策略之一,但当  Cache 的路数比较大时(多路组相连结构),实现 LRU 的硬件开销就会变得很大。现代处理器一般会考虑使用 PLRU(pseudo-LRU)作为 Cache 的替换策略而不是 LRU。

       PLRU 是 LRU 的一种优化,本文要介绍的是PLRU中的 tree-PLRU(tree-based pseudo-LRU)。

二、PLRU算法原理

       若当前 Cache 为 n 路组相连结构,即一个 Cache Set 中有n个 Cacheline,则 tree-PLRU 会使用(n-1)位来表示近似访问历史顺序的二叉树。根据二叉树的特性,tree-PLRU 将这 n 个Cacheline划分成不同的区块,并用0/1表示区块的访问时间的远近。

        假设有一个4路组相连的 Cache,Cache 替换时会在一个 Cache Set 中的4条 Cache line 中选择一条进行替换,假设这四条 Cache line 编号分别为line_0~3,则 tree-PLRU 会使用 4-1=3bit 来构建二叉树来反映 Cache line 的历史访问顺序。

是
图2.1 Cache line替换选择情况示意图

        如上图所示,每1bit代表了二叉树的一个分支,假设1表示左侧比右侧最近被访问,0表示右侧比左侧最近被访问,判断最近访问行时,箭头指向是“左1右0”

        第0bit位=1,表示最近访问的是line_0或line_1;

        第0bit位=0,表示最近访问的是line_2或line_3;

        第1bit位=1,表示最近访问的是line_0;

        第1bit位=0,表示最近访问的是line_1;

        第2bit位=1,表示最近访问的是line_2;

        第2bit位=0,表示最近访问的是line_3;

        请注意,这里描述的是最近访问顺序。上图二叉树绘制的是替换选择情况,也即选择访问最少的Cache line,叶子节点表示要被替换的Cache line。

       假设 branch_bits = 3'b011,表示最近访问的是 line_0 或 line_1,并且访问的是 Line_0。line_2和 line_3 中最近访问的是 line_3。这样我们就能近似得到一个最近访问顺序了,也即最近访问了 line_0 和 line_3,但 line_1 和 line_2 的之间的访问顺序不确定。

三、PLRU替换过程举例

       假设state = 3'b000,tree-PLRU的初始状态图如下。

       用 state 绘制的二叉树和我们判断最近访问的 branch_bits 正好相反,因为 branch_bits 是判断最近访问的叶子节点,而二叉树反映的是需要剔除的叶子节点(很久未访问),因此正好相反。选择替换行时箭头指的方向是“左0右1”。此时 state=3’b000 表示需要替换的 Cache line 为 line_0,因此我们往 line_0 中填入 data_0。

       填入 data_0 之后,原本指向 line_0 的箭头,因为 line_0 被访问替换了,因此指向 line_1。同理,根节点原本指向左侧(近期访问 line_0 或 line_1)的,反过来指向右侧,表示接下来要去替换(line_2 或 line_3),此时 state = 3’b110。倘若此时来了一个 data_1,将替换 line_2,如下图所示。

       填入 data_1 之后,原本指向 line_2 的箭头,因为 line_2被访问替换了,因此指向 line_3。同理,根节点原本指向右侧(近期访问 line_2 或 line_3)的,反过来指向左侧,表示接下来要去替换(line_0 或 line_1),此时 state = 3’b011。倘若此时来了一个 data_2,将替换 line_1,如下图所示。

       填入 data_2 之后,原本指向 line_1 的箭头,因为 line_1 被访问替换了,因此指向 line_0。同理,根节点原本指向左侧(近期访问line_0 或 line_1)的,反过来指向左侧,表示接下来要去替换(line_2 或 line_3),此时 state = 3’b101。倘若此时来了一个 data_3,将替换 line_3,如下图所示。

       替换掉 line_3 之后,二叉树替换情况的最新 state=3’b000,回到了一开始的时候。由此我们可以发现,每发生一次 cache miss,从根节点到叶子节点路径上的箭头指向都要换向(从↙到↘或从↘到↙)。


       以上是一个4路组相连结构的 Cache 连续发生4次 Cache miss 的 Cache line 替换情况。倘若中途发生了 Cache hit 该如何处理呢?

       我们以上图情况的二叉树为例,倘若此时来了一个 load 访问请求命中了 line_0,那么从第二层到第三层叶子结点的箭头不用发生改变,但是从根节点到第二层节点的箭头需要发生转换。

       根节点的转换表示:由于 line_0 或 line_1 最近被访问了,接下来要去替换的是 line_2 或 line_3。这是 Cache hit 有别于 Cache miss 的点。

四、参考资料

1.people.computing.clemson.edu/~mark/464/p_lru.txt

2.Cache replacement policies(缓存替换策略)/ LRU 和 LFU等算法

3.Cache替换策略之tree-PLRU 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文带你搞懂C++运算符重载

7. C运算符重载 C运算符重载 什么是运算符重载 运算符重载赋予运算能够操作自定义类型。 运算符重载前提条件: 必定存在一个自定义类型 运算符重载实质: 就是函数调用 友元重载 类重载 在同一自定义类型中,一个运算符只能被重载一次 C重载只能重载…

vue element-ui日期控件传参

前端&#xff1a;Vue element-ui <el-form-item label"过期时间" :rules"[ { required: true, message: 请选择过期时间, trigger: blur }]"><el-date-picker v-model"form.expireTime" type"date" format"yyyy-MM-dd&…

【C++】透析类和对象(下)

有不懂的可以翻阅我之前文章&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;CSDN_C入门 目录 拷贝构造函数 运算符重载 赋值运算符重载 取地址运算符重载 const成员函数 取地址重载 再探构造函数 初始化列表 类型转换 static成员 友元 内…

MySQL查询执行(二):order by工作原理

假设你要查询城市是“杭州”的所有人名字&#xff0c; 并且按照姓名排序返回前1000个人的姓名、 年龄。 假设这个表的部分定义是这样的&#xff1a; -- 创建表t CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT N…

Docker 搭建Elasticsearch详细步骤

本章教程使用Docker搭建Elasticsearch环境。 一、拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.8.2二、运行容器 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-n

maven clean报错:Failed to delete xxxxx\target\xxxx.jar

问题描述 今天使用maven的clean命令时候出错如下&#xff1a; 分析问题 target文件可能时编译的文件被其他程序占用&#xff0c;导致资源无法回收 解决问题 1 打开任务管理器 右键任务栏。进入任务管理器 点击详细信息 2 进入 点击性能&#xff0c;点击打开资源监视器 …

推荐2024年大家都在用的4款ai写作免费神器

最近公司年中总结&#xff0c;要写好多像工作报告&#xff0c;工作计划之类的文件。我尝试着使用AI写作工具帮助&#xff0c;没想到效果意外的好&#xff0c;省事又省力。如果你也有和我一样的烦恼的话&#xff0c;可以去使用这4个写作工具&#xff0c;都是可以免费使用的。 1、…

错误代码0x80070035是什么情况?针对错误代码0x80070035的解决方法

错误代码 0x80070035 通常与网络连接和文件共享有关&#xff0c;表示“找不到网络路径”。这个问题可能由多种原因引起&#xff0c;包括网络设置不当、服务未启动、注册表配置错误等。今天这篇文章就和大家分享几种针对错误代码0x80070035的解决方法。 针对错误代码0x80070035问…

express连接mysql

一、 安装express npm install express --save二、express配置 //引入 const express require("express"); //创建实例 const app express(); //启动服务 app.listen(8081, () > {console.log("http://localhost:8081"); });三、安装mysql npm i m…

简过网:大学生考公,一定要先好好看看这篇文章!

大家好&#xff0c;我是简过网&#xff0c;今天这篇文章我们来聊聊关于大学生考公的那些事儿&#xff0c;希望能给大学生们一点点的帮助&#xff01; 首先&#xff0c;可能有朋友会问了&#xff0c;大学生一般从什么时候开始备考公务员呢&#xff0c;在这里小编建议大家从大三…

mysql1055报错解决方法

目录 一、mysql版本 二、 问题描述 三、解决方法 1.方法一&#xff08;临时&#xff09; 2.方法二&#xff08;永久&#xff09; 一、mysql版本 mysql版本&#xff1a;5.7.23 二、 问题描述 在查询时使用group by语句&#xff0c;出现错误代码&#xff1a;1055&#xf…

FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章FastAPI&#xff08;七十三&#xff09;实战开发《在线课程学习系统》接口开发-- 回复留言&#xff0c;那么我们这次分享删除留言接口的开发…

MySQL可重复读的隔离机制下是否彻底解决了幻读?

答案&#xff1a;没有彻底解决。 一、什么是幻读&#xff1f; 当同一个查询在不同时间产生不同的结果集时&#xff0c;事务中就会出现幻读问题。 幻读关注的是记录数量的不同。 不可重复读关注的是记录内容的不同。 二、快照读和当前读 InnoDB引擎的默认隔离级别是可重复读&…

搭建自己的金融数据源和量化分析平台(四):自动化更新上市公司所属一级、二级行业以及股票上市状态

前面做了更新沪深交易所的上市股票列表的读取和更新&#xff0c;但一旦股票退市则需要在数据库里将该股票状态更新为退市&#xff0c;同时附上退市日期&#xff0c;将股票名更改为XX退。 此外深交所下载的xls解析出来是没有上市公司所属的二级行业的&#xff0c;因此还需要建立…

鸿蒙仓颉语言之【安全密码库crypto4cj】功能示例

功能示例 MD5使用样例 from crypto4cj import md5cj.*main() { var md: Array<UInt8> Array<UInt8>(16, item: 0)var result: String String(Array<Char>(33, item: 0))var str: String "helloworld"var ret md5(str.toUtf8Array(), md)r…

不支持jdk8的jenkins部署jdk8项目

1、背景 目前最新的jenkins必须基于jdk8以上&#xff0c;才能安装。jenkins最新的插件部分也不支持jdk8了。 2、全局工具配置 配置一个jdk8 配置一个jdk8以上的版本&#xff0c;如jdk17 3、部署maven项目 jdk17项目 可以直接使用maven插件&#xff0c;部署。 jdk8项目 由…

git等常用工具以及cmake

一、将git中的代码克隆进电脑以及常用工具介绍 1.安装git 首先需要安装git sudo apt install git 注意一定要加--recursive&#xff0c;因为文件中有很多“引用文件“&#xff0c;即第三方文件&#xff08;库&#xff09;&#xff0c;加入该选项会将文件中包含的子模…

C嘎嘎浅谈模板

这篇文章给大家介绍一下c嘎嘎内存管理和模板&#xff0c;那么我们直接进入正题 c/c的程序内存分布 这里的了解一下即可 new和delete的定义和操作 格式&#xff1a;类型* 对象名 new 类型&#xff1b; 数组(对象)定义格式&#xff1a;类型* 对象名 new 类型[元素个数]&…

NOIP图论 最小生成树——Prim算法(详细图解)

最小生成树的概念 经典题目 prim算法简介 prim算法解析 &#xff08;详细图解&#xff09; 代码实现 代码实战 最小生成树的概念 在一给定的无向图G (V, E) 中&#xff0c;(u, v) 代表连接顶点 u 与顶点 v 的边&#xff0c;而 w(u, v) 代表此的边权重&#xff0c;若存在 …

Kali中docker与docker-compose的配置

权限升级 sudo su 升级为root用户 更新软件 apt-get update安装HTTPS协议和CA证书 apt-get install -y apt-transport-https ca-certificates下载docker apt下载docker apt install docker.io 验证docker安装是否成功 查版本 docker -v 启动docker systemctl start …