实验2 使用 LRU 方法更新 Cache

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

一、实验目的


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


二、实验内容


  结合数据结构的相关知识,使用LRU的策略,对一组访问序列进行内部的 Cache 更新。

      LRU 置换算法是选择最近最久未使用的页面予以置换,该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间 T,当须淘汰一个页面时,选择现有页面中 T 值最大的,即最近最久没有访问的页面,这是一个比较合理的置换算法。

例如:

     有一个 Cache 采用组相连映象方式。每组有四块,为了实现 LRU 置换算法,在快表中为每块设置一个 2 位计数器。我们假设访问序列为 1、1、2、4、3、5、2、1、6、7、1、3。在访问 Cache 的过程中,块的装入、置换及命中时,具体情况如下表所示:

image.png

三、实验结果



四、实验代码

#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缓存的三种方式(建议收藏)
LRU全称为Least Recently Used,即最近使用的。针对的是在有限的内存空间内,只缓存最近使用的数据(即get和set的数据),超过有限内存空间的数据将会被删除。这个在面试题中也是常会被问到的内容,接下来就看看怎么来实现。
1393 0
实现LRU缓存的三种方式(建议收藏)
|
3月前
|
缓存 算法 数据挖掘
深入理解缓存更新策略:从LRU到LFU
【10月更文挑战第7天】 在本文中,我们将探讨计算机系统中缓存机制的核心——缓存更新策略。缓存是提高数据检索速度的关键技术之一,无论是在硬件还是软件层面都扮演着重要角色。我们会详细介绍最常用的两种缓存算法:最近最少使用(LRU)和最少使用频率(LFU),并讨论它们的优缺点及适用场景。通过对比分析,旨在帮助读者更好地理解如何选择和实现适合自己需求的缓存策略,从而优化系统性能。
72 3
|
5月前
|
存储 缓存 算法
缓存优化利器:5分钟实现 LRU Cache,从原理到代码!
嗨,大家好!我是你们的技术小伙伴——小米。今天带大家深入了解并手写一个实用的LRU Cache(最近最少使用缓存)。LRU Cache是一种高效的数据淘汰策略,在内存有限的情况下特别有用。本文将从原理讲起,带你一步步用Java实现一个简单的LRU Cache,并探讨其在真实场景中的应用与优化方案,如线程安全、缓存持久化等。无论你是初学者还是有一定经验的开发者,都能从中受益。让我们一起动手,探索LRU Cache的魅力吧!别忘了点赞、转发和收藏哦~
120 2
|
8月前
|
缓存 算法 内存技术
【高阶数据结构】LRU Cache -- 详解
【高阶数据结构】LRU Cache -- 详解
|
8月前
|
缓存 监控 安全
如何使用LRU缓存来提高程序的性能?
如何使用LRU缓存来提高程序的性能?
76 3
|
存储 缓存 算法
【基础篇】4 # 链表(上):如何实现LRU缓存淘汰算法?
【基础篇】4 # 链表(上):如何实现LRU缓存淘汰算法?
179 0
【基础篇】4 # 链表(上):如何实现LRU缓存淘汰算法?
|
缓存 NoSQL 算法
会会大厂面试官五----Redis【内存调整、OOM、淘汰策略、LRU算法】
会会大厂面试官五----Redis【内存调整、OOM、淘汰策略、LRU算法】
228 0
会会大厂面试官五----Redis【内存调整、OOM、淘汰策略、LRU算法】
|
缓存 算法 API
算法必知 --- LRU缓存淘汰算法
算法必知 --- LRU缓存淘汰算法
算法必知 --- LRU缓存淘汰算法
|
缓存 算法 API
算法必知 --- LFU缓存淘汰算法
算法必知 --- LFU缓存淘汰算法
算法必知 --- LFU缓存淘汰算法
|
存储 缓存 算法
从 LRU Cache 带你看面试的本质
在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题。
227 0
从 LRU Cache 带你看面试的本质