实验2 使用 LRU 方法更新 Cache

使用C++实现一个LRU cache 什么是LRU Cache LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache 阅读详情

一、实验目的

  了解和掌握寄存器分配和内存分配的有关技术。

二、实验内容

  结合数据结构的相关知识,使用LRU的策略,对一组访问序列进行内部的 Cache 更新。
  LRU 置换算法是选择最近最久未使用的页面予以置换,该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间 T,当须淘汰一个页面时,选择现有页面中 T 值最大的,即最近最久没有访问的页面,这是一个比较合理的置换算法。例如:
  有一个 Cache 采用组相连映象方式。每组有四块,为了实现 LRU 置换算法,在快表中为每块设置一个 2 位计数器。我们假设访问序列为 1、1、2、4、3、5、2、1、6、7、1、3。在访问 Cache 的过程中,块的装入、置换及命中时,具体情况如下表所示:

112435216713
Cache块0111115555777
Cache块1-1-12222222223
Cache块2-1-1-1444411111
Cache块3-1-1-1-133336666
装入命中装入装入装入置换命中置换置换置换命中置换

三、实验结果

在这里插入图片描述

四、实验代码

#include <iostream>

using namespace std;

class Cache {
public:
	bool state = false;
	int value = -1;
	int count = 0;
};

const int M = 4; // Cache块数 
Cache cache[M];
const int N = 12;// 测试页面数 
int walk_sort[] = {1,1,2,4,3,5,2,1,6,7,1,3};// 测试数据 
void up_cache();

int main() {
	up_cache();
}

void up_cache() {
    int i = 0;
    while (i < N) {
        int j = 0;
	   // 满么? 
        while (j < M) {
            if((cache[j].state == false) && (walk_sort[i] != cache[j].value)) {
                cout << "cache有空闲块,不考虑是否要置换..." << endl;
                cout << walk_sort[i] << "被调入cache...." << endl;
                cache[j].value = walk_sort[i++]; 
                cache[j].state = true;
                cache[j].count = 0;
                int kk = 0;
                
                for (int x = 0; x < M; x++) {
                    cout << "cache块" << x << ": " << cache[x].value << endl;
                }
                cout << endl;
                
                // 更新其它cache块没使用时间
                while (kk < M) {
                    if (kk != j && cache[kk].value != -1) {
                        cache[kk].count++;
                    }
                    kk++;
                }
                break; 
            }
            if (cache[j].value == walk_sort[i]) {
                cout << endl;
                cout << walk_sort[i] << "命中!!!" << endl;
                
                for (int x = 0; x < M; x++) {
                    cout << "cache块" << x << ": " << cache[x].value << endl;
                }
                cout << endl;
                
                int kk = 0;
                i++;
                cache[j].count=0;
                //更新其它cache块没使用时间
                while (kk < M) {
                    if (kk != j && cache[kk].value != -1) {
                        cache[kk].count++;
                    }
                    kk++;
                }
            }
            j++;
        }

        if (j == M) {
            cout << "cache已经满了,考虑是否置换..." << endl;
            cout << endl;
            int k = 0;

            while (k < M) {
                if (cache[k].value == walk_sort[i]) {
                    cout << endl;
			        cout << walk_sort[i] << "命中!!!" << endl;
  
                    for (int x = 0; x < M; x++) {
                        cout << "cache块" << x << ": " << cache[x].value << endl;
                    }
                    
                    i++;
                    cache[k].count = 0;
                    int kk = 0;
                     
                    //更新其它cache块没使用时间
                    while (kk < M) {
                        if (kk != k){
                            cache[kk].count++;
                        }
                        kk++;
                    }
                    break;
                }
                k++;
            } 
            //考虑置换那一块.
            if (k == M) {
                int ii = 0;
                int t = 0;//要替换的cache块号.
                int max = cache[ii].count;
                ii++; 
                while (ii < M) {
                    if(cache[ii].count > max) {
                        max = cache[ii].count;
                        t = ii;
                    }
                    ii++;
                }
                //置换
                cout<<cache[t].value<<"被"<<walk_sort[i]<<"在cache的"<<t<<"号块置换..."<<endl;
                cache[t].value=walk_sort[i++];
                cache[t].count=0;
                
                for (int x = 0; x < M; x++) {
                    cout << "cache块" << x << ": " << cache[x].value << endl;
                }
                int kk = 0;                
                //更新其它cache块没使用时间
                while (kk < M) {
                    if (kk != t) {
                        cache[kk].count++;
                    }
                    kk++;
                }
            }
        }
    }
}
LRU Cache(最少最近使用机制) 1、什么是LRU Cache LRU是Least Recently Used的缩写,最少最近使用,这是一种Cache替换算法。Cache指位于CPU和主存间的快速RAM,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构。除了CPU与主存之间有Cache,内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache-称为Internet临时文件夹或网络内容缓冲等。 Cache的容 阅读详情

相关推荐

如何设计一个LRU Cache?

如何设计一个LRU Cache?Google和百度的面试题都出现了设计一个Cache的题目,什么是Cache,如何设计简单的Cache,通过搜集资料,本文给出个总结。 通常的问题描述可以是这样:Question:[1] Design a layer in front of a s

2万+

高阶数据结构——LRU Cache

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。

weixin_74310945的博客 1781

LRU Cache的简单c++实现

什么是 LRU LRU Cache是一个Cache的置换算法,含义是“最近最少使用”,把满足“最近最少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是最近刚刚访问的,因为这样的数据更有可能被接下来的程序所访问。 LRU的应用比较广泛,最基础的内存页置换中就用了,对了,这里有个概念要清楚一下,Cache不见得是CPU的高速缓存的那个Cache,这里的Cache直接翻译为缓

笑笑的程序人生 1万+

实验2 使用 LRU 方法更新 Cache

一、实验目的   了解和掌握寄存器分配和内存分配的有关技术。 二、实验内容   结合数据结构的相关知识,使用LRU的策略,对一组访问序列进行内部的 Cache 更新。   LRU 置换算法是选择最近最久未使用的页面予以置换,该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间 T,当须淘汰一个页面时,选择现有页面中 T 值最大的,即最近最久没有访问的页面,这是一个比较合理的置换算法。 例如:   有一个 Cache 采用组相连映象方式。每组有四块,为了实现 LRU 置换算法,在快表中为

Acx7的博客 1208

Python functools.lru_cache 实现高速缓存及其原理 源码解析

Python functools.lru_cache 实现高速缓存及其原理

wei_bo_cai的博客 3076

golang-lru Cache (二)2Q

LRU的问题 当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。 2Q Cache 2Q算法 2Q算法有两个缓存队列,一个是FIFO队列,用于保存最近访问的数据;一个是LRU队列,用于保存热点数据。 golang-lru实现 在golang-lru中,两个队列都是用simplelru实现。 type TwoQueueCa...

Uncle_Y的专栏 1491

LRU Cache

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或。DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种。狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用。硬件之间, 用于协调两者数据传输速度差异的结构。

未知陨落的博客 1846

Python LRU 缓存机制(functools.lru_cache)的实现原理

LRU 缓存是一种常见的缓存淘汰算法,其核心思想是:当缓存空间不足时,优先移除最近最少使用的数据项。这种策略非常适合那些需要频繁访问但数据量较大的场景,比如数据库查询结果或 API 响应。在 Python 中,`functools.lru_cache` 提供了一种简单的方式来实现 LRU 缓存功能。通过装饰器的形式,我们可以轻松地为函数添加缓存支持,而无需手动管理缓存结构。通过本文的介绍,相信读者已经对 `functools.lru_cache` 的工作原理及其应用场景有了全面的认识。

2501_91228841的博客 1664

Python实现可自定义更新策略的LRU Cache

LRU Cache  LRU(Least Recently Used),直译为“最近最少使用”,其实称“最久未被使用”更为恰当。这是一个非常重要的算法,在学操作系统的时候第一次遇见,在做leetcode的时候再次遇见,知道是用于做缓存的页面置换。但是LRU不仅仅用于这一个用途,凡是有数据更新策略的应用,LRU都可以是候选算法。比如redis、memcached、oracle等缓存和数据库、或在其它应

wangyibo0201的博客 4835

【实验7】Cache模拟器(保姆级教程Cache的组相联LRU实现)

*直接映射Data Cache,16KB大小每行存放64个字节,共256行*/#define DCACHE_SIZE 16384 /*----题目要求的Cache必须是16KB----*/#define DCACHE_DATA_PER_LINE 16 /*----B:一行多少数据字节?----*/ // 必须是8字节的倍数。

Faustina__的博客 1919

C语言实现TCP聊天室:Socket编程与并发模型实战解析

网络编程是构建分布式系统的核心技术,其核心在于理解进程间通信的底层机制。TCP/IP协议栈提供了可靠的字节流传输服务,通过Socket API这一抽象接口,开发者可以在应用层建立连接、收发数据。为了高效处理多个并发连接,服务器需要采用多线程或I/O复用模型,前者为每个连接创建独立线程,逻辑清晰但资源消耗大;后者通过select、poll或epoll等系统调用监控多个文件描述符,显著提升并发能力。这些技术是构建高性能网络服务(如即时通讯、在线游戏服务器)的基础。本文以C语言实现一个简洁的TCP聊天室为例,详细

weixin_32642109的博客 292

【高阶数据结构】LRU Cache

LRU Cache的介绍+OJ题目实现

chuxinchangcun的博客 6839

Vue集成天地图:从定位到交互绘图的完整实践指南

本文详细介绍了如何在Vue项目中集成天地图API,从基础配置到高级功能实现,包括定位、标点、画线等交互绘图功能。通过实战代码示例和性能优化技巧,帮助开发者快速掌握Vue与天地图的结合应用,提升地图开发效率。

weixin_29013129的博客 248

【数据结构】LRU Cache

本文介绍了LRU缓存算法的原理与实现。LRU(最近最少使用)是一种缓存替换算法,通过优先淘汰最久未使用的数据来优化存储效率。其实现采用哈希表+双向链表的数据结构组合:哈希表保证O(1)时间查找,双向链表维护数据访问时序。热数据置于链表头部,冷数据逐步后移。当缓存满时,直接删除链表尾部冷数据。文章给出了C++实现代码,重点展示了get/put操作如何通过迭代器快速定位并更新数据位置,确保操作时间复杂度均为O(1)。这种结构完美平衡了查找效率和顺序维护的需求。

2401_82610555的博客 1300

多模态模型评测神器 | OpenCompass MMBench 了解一下!

MMBench 是 OpenCompass 研究团队自建的视觉语言模型评测数据集,可实现从感知到认知能力逐级细分评估。研究团队从互联网公开信息与权威基准数据集采集约 3000 道单项选择题 ,覆盖目标检测、文字识别、动作识别、图像理解、关系推理等 20 个细粒度评估维度。

OpenCompass的博客 7826

100天精通Oracle-实战系列(第33天)RHEL 7 安装 Oracle 12CR2 RAC 数据库

100天精通Oracle-实战系列(第33天)RHEL 7 安装 Oracle 12CR2 RAC 数据库

LuciferLiu_DBA 3451

LRU Cache缓存替换算法

总之,LRU 是管理缓存空间的一种策略(当缓存满了,优先淘汰最久没被用过的数据)。Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选 并舍弃原有的部分内容,从而腾出空间来放新内容。使用双向链表是因为双向链表可以实现任意位置O(1)的插入和 删除(维护数据使用顺序),使用哈希表是因为哈希表的增删查改也是O(1)和快速访问。那这样的话如果更新的话,首先我们在哈希表里面找到key,然后通过它里面存的该元素在list中的迭代器,就可以直接修改list里面存放的数据。

学习日记 1171

LVGL iPhone Duo 开合过渡

环境:LVGL 9.x(需要软件模糊),窗口建议 1280×800。界面文案英文(默认 Montserrat 无 CJK)。

摸鱼专家 149

LRU Cache(C++)

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。什么是 Cache?狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用 DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构。

sqm_C的博客 1067

【AI测试必学】DeepSeek API 快速入门:获取 API Key 与调用 API 步骤详解

DeepSeek API 使用与 OpenAI 兼容的格式,可以通过修改配置使用 OpenAI SDK。生成的 API Key 只会显示一次,请妥善保存。注册并登录账号,进入左侧导航栏的。创建 API Key。

blues_C的博客 1万+

MinerU 系列教程 | 第二课:快速上手 -- 安装与第一次解析

本篇教程作为的第二课,将带你从零完成 MinerU 的环境搭建、模型下载,并成功运行第一次文档解析。上一课我们从宏观视角认识了 MinerU,本课开始正式动手实践。

weixin_43674738的博客 301
上一篇: 实验1 对指令操作码进行霍夫曼编码
下一篇: 实验2 使用 LRU 方法更新 Cache
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值