CMU15/445 2023 Spring-project1 LRU-K 替换策略

news2024/11/16 16:32:17

在写个demo之前,专门学习了LRU:【LeetCode刷题】146. LRU 缓存-CSDN博客

使用哈希表 + 双向链表可以满足删除/增加的时间复杂度为O(1)。

在通读完15/445这块的说明之后,发现和LRU还是有些差别的。

官方文档中对LRU-K的解释是:LRU-K算法根据所谓的“后向k距离”来确定替换哪个缓存帧。后向k距离是指当前时间戳与第k次访问之间的时间差。如果某个缓存帧的历史访问次数少于k次,则其后向k距离被视为正无穷当有多个缓存帧的后向k距离都是正无穷时,LRU-K算法会选择替换具有最早总体时间戳的缓存帧。换句话说,它会替换最近访问时间最早的缓存帧,从而使得系统更可能淘汰不常用的数据,而保留最常用的数据。

解释一下:之前学习的LRU算法是替换/最近最少使用的数据,在具体实现上采用的是哈希+双向链表的形式,将最近使用的数据放在双向链表表头,最少使用的放在尾部。

这里的LRU-K算法是以当前节点位基准,往前计数到第k个位置,将该位置的数据剔除;如果没有第k的位置,则后向距离视为正无穷(2147483647);当有多个缓存帧的后向k距离都是正无穷时,LRU-K算法会选择替换具有最早总体时间戳的缓存帧(即替换最先加进来的数据)。

15/445中的代码这里有两个类:LRUKNode类和LRUKReplacer类。

1 LRUKNode类

LRUKNode中有一些属性:

  [[maybe_unused]] std::list<size_t> history_;
  [[maybe_unused]] size_t k_;
  [[maybe_unused]] frame_id_t fid_;
  [[maybe_unused]] bool is_evictable_{false};

(1)history就是存放数据的节点,而C++中的list底层是双向链表,可以满足前插和删除操作;

(2)k_就是参数k;

(3)fid_是帧id,类型是using frame_id_t = int32_t;    // frame id type;

(4)是否要剔除该节点,默认不剔除。

对照着LRUKReplacer的函数,给LRUKNode添加几个函数:

(1)构造函数肯定是要的;

(2)计算k距离的函数;(遍历到第k个相减即可,注意没有第k个情况时要返回无穷大)

(3)记录LRUKNode对象的访问历史函数;

开始可能就能想到这几个,增量式开发,后面写着写着需要哪些再添加。

2 LRUKReplacer类

对代码中的LRUKReplacer类各个函数一定要理解清楚。

(1)Size函数是最好实现的(::>_<::);

(2)Remove函数的实现思路:先查找,如果数据存在,再判断该数据是否是要被剔除的,如果是则删除;

(3)SetEvictable函数是指定帧是否可被替换的状态。这个函数还控制替换器的大小;

(4)RecordAccess是添加数据的,数据存在更新换时间戳;数据不存在则添加新的数据;

(5)Evict是最难的。【查找具有最大后向k距离的帧,并将其替换。只有被标记为可被替换的帧才是替换的候选对象。成功替换后,应该减少替换器的大小并移除帧的访问历史。】

LRU-K算法根据所谓的“后向k距离”来确定替换哪个缓存帧。后向k距离是指当前时间戳与第k次访问之间的时间差。如果某个缓存帧的历史访问次数少于k次,则其后向k距离被视为正无穷当有多个缓存帧的后向k距离都是正无穷时,LRU-K算法会选择替换具有最早总体时间戳的缓存帧。换句话说,它会替换最近访问时间最早的缓存帧,从而使得系统更可能淘汰不常用的数据,而保留最常用的数据。

  [[maybe_unused]] std::unordered_map<frame_id_t, LRUKNode> node_store_;
  [[maybe_unused]] size_t current_timestamp_{0};
  [[maybe_unused]] size_t curr_size_{0};
  [[maybe_unused]] size_t replacer_size_;
  [[maybe_unused]] size_t k_;
  [[maybe_unused]] std::mutex latch_;

(6)这里也用到了哈希+list,符合前面LRU的思路,只是后面在测试的时候,发现unordered_map的value一直有问题,网上查了一下,大家都是用的指针形式,后面又使用了智能指针;

(7)std::mutex不允许拷贝构造,也不允许 move 拷贝,使用智能指针的形式;

c++ - 在 C++ 中使用用户定义的类型作为映射值 - IT工具网 (coder.work)

(8)宏的学习:这个宏的作用是确保 LRUKReplacer 类不能被拷贝构造、拷贝赋值、移动构造和移动赋值;

// 这个宏的作用是确保 LRUKReplacer 类不能被拷贝构造、拷贝赋值、移动构造和移动赋值。
DISALLOW_COPY_AND_MOVE(LRUKReplacer);

#define DISALLOW_COPY_AND_MOVE(cname) \
  DISALLOW_COPY(cname);               \
  DISALLOW_MOVE(cname);

// Macros to disable copying and moving
#define DISALLOW_COPY(cname)                                    \
  cname(const cname &) = delete;                   /* NOLINT */ \
  auto operator=(const cname &)->cname & = delete; /* NOLINT */

#define DISALLOW_MOVE(cname)                               \
  cname(cname &&) = delete;                   /* NOLINT */ \
  auto operator=(cname &&)->cname & = delete; /* NOLINT */

(9)还学习了一个之前没注意到的小知识:成员列表初始化属性的时候,要按照属性在类中出现的顺序初始化;

(10)删掉测试代码的DISABLED_

3 结果

这里只实现了LRUKdemo,所以得分是25分,看通过的case,LRUKReplacerTest是通过的。

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

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

相关文章

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接&#xff1a;https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码&#xff1a;7tfj

JavaWeb--JavaScript Part 01

1. JavaScript概述 JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释执行的客户端脚本语言&#xff0c;主要用于增强网页的交互性和动态性。它起源于Netscape的LiveScript&#xff0c;并在1995年发布时更名为JavaScript。尽管名称中包含"Java"&#xf…

2024.4.3-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

时序预测 | Python实现BiGRU-RELM时间序列预测

时序预测 | Python实现BiGRU-RELM时间序列预测 目录 时序预测 | Python实现BiGRU-RELM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BiGRU-RELM时间序列预测分析 将BiGRU和RELM两种模型进行了融合&#xff0c;BiGRU进行预测&#xff0c;RELM对BiGRU模型的预…

LED点阵屏与LCD1602

目录 LED点阵屏 点阵屏的介绍 LED点阵屏分类 点阵屏的显示原理 点阵案例 静态案例 电路图 keil文件 动态案例 电路图 keil文件 LCD1602 LCD1602概述 LCD1602内部结构 存储器结构 LCD引脚及应用电路 时序结构 LCD1602指令集 LCD1602编程 初始化 显示字符 …

使用libibverbs构建RDMA应用

本文是对论文Dissecting a Small InfiniBand Application Using the Verbs API所做的中英文对照翻译 Dissecting a Small InfiniBand Application Using the Verbs API Gregory Kerr∗ College of Computer and Information ScienceNortheastern UniversityBoston, MAkerrgccs…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域&#xff0c;其重要性在于为建设、规划和资源管理提供准确的地理数据。然而&#xff0c;随着技术的发展&#xff0c;传统的测绘方法已经难以满足对数据精度和实时性的要求。因此&#xff0c;测绘行业正逐渐向数字化转型&#xff0c;采用…

唯美首页纯静态html5引导页源码,格子化win8风格官方引导页面源码

唯美首页纯静态html5引导页源码&#xff0c;格子化win8风格官方引导页面源码&#xff0c;喜欢的朋友可以拿去使用 源码下载 唯美首页纯静态html5引导页源码

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型&#xff0c;包括整型&#xff08;如i32、u32&#xff09;、浮点型&#xff08;如f32、f64&#xff09;、布尔类型&#xff08;bool&#xff09;和字符类型&#xff08;char&#xff09;。此外&#xff0c;Rust还提供了原生数组、元组…

记忆的方法 简单易行的记忆技巧:归纳整理,联想,重点标注压缩,改错,留痕记念(去个地方买个特别能长久保留的纪念品),差异

记忆的方法有很多&#xff0c;以下是一些简单易行的记忆技巧&#xff1a; 分类整理&#xff1a;将需要记忆的信息进行分类&#xff0c;这样可以帮助你更好地组织和记忆信息。例如&#xff0c;尝试记住一组词语时&#xff0c;可以将它们按照类别或相关性分组。归纳整理。间隔重…

mysql的安装和部署

##官网下载mysql 我下载的是一个mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 可以通过xshell 或者xftp传送 xshell则是先下载一个lrzsz 执行以下的命令 yum install lrzsz -y #安装好我下面有个一键安装的脚本 #!/bin/bash#解决软件的依赖关系 yum install cmake ncurses…

LangChain学习笔记—RAG(检索增强生成)

LangChain LangChain是一个软件开发框架&#xff0c;可以更轻松地使用大型语言模型&#xff08;LLM&#xff09;创建应用程序。它是一个具有 Python 和 JavaScript 代码库的开源工具。LangChain 允许开发人员将 GPT-4 等 LLM 与外部数据相结合&#xff0c;为聊天机器人、代码理…

代理IP在爬虫中的连接复用与开销减少

目录 一、引言 二、代理IP的基本概念 三、代理IP在爬虫中的使用 四、代理IP的连接复用 五、减少开销的策略 六、代码示例与注释 七、总结 一、引言 在爬虫开发中&#xff0c;代理IP的使用是常见的做法&#xff0c;尤其在目标网站设置了反爬虫机制时。代理IP能够帮助爬虫…

【鸿蒙 HarmonyOS】获取设备的地理位置

一、背景 获取移动设备的地理位置&#xff0c;包含&#xff1a;经度、维度、具体地理位置等&#xff0c;地理位置信息能在许多业务场景中被应用&#xff0c;如导航、地图服务、位置服务、社交媒体等。 下面以一个Demo例子&#xff0c;来实现获取设备地理位置的功能 官方文档…

27.WEB渗透测试-数据传输与加解密(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…

经济学 赋税

赋税&#xff1a; 1.为政府服务提供金钱来源 2. 用于保护环境 3.帮助国家使用财政和货币政策&#xff0c;推动经济增长 4.再分配社会财富的一种方式&#xff0c;平衡富人和穷人的贫富差距 5.帮助我们支付市场自身可能无法实现的服务&#xff0c;比如公共安全&#xff0c;国…

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点&#xff1a; 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…

全力推进Copilot,微软抽调Teams团队精英

据 Business Insider 网站报道&#xff0c;他们获得的一份俺们微软内部备忘录显示&#xff0c;说俺们微软正在建立一个专门团队&#xff0c;负责俺们家的 Copilot 及其相关产品的后续开发工作。 该备忘录由俺们微软人工智能业务副总裁贾里德・斯帕塔罗&#xff08;Jared Spata…

【201】Java8读取JSON树形结构并插入到MySQL数据库表中

我写了一个 maven 项目的 Demo&#xff0c;用来演示 JAVA8 如何读取 JSON 文件树形结构&#xff0c;并将这种树形结构保存到 MySQL 中。 json文件 city.json {"name": "山东省","sub": [{"name": "青岛市","sub"…

【蓝桥杯嵌入式】RTC——实时时钟

一、RTC简介 RTC RTC—real time clock&#xff0c;实时时钟&#xff0c;主要包含日历、闹钟和自动唤醒这三部分的功能&#xff0c;其中的日历功能我们使用的最多。日历包含两个32bit的时间寄存器&#xff0c;可直接输出时分秒&#xff0c;星期、月、日、年。 从Cubemx里的配置…