实验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++;
                }
            }
        }
    }
}


相关文章
|
机器学习/深度学习 数据采集 监控
大模型开发:描述一个典型的机器学习项目流程。
机器学习项目涉及问题定义、数据收集、预处理、特征工程、模型选择、训练、评估、优化、部署和监控。每个阶段都是确保模型有效可靠的关键,需要细致操作。
562 0
|
4月前
|
安全 Shell 开发工具
分支名从 main 改成 master?本地怎么改、远程(GitHub)怎么改、如果别人也在用这个仓库该怎么办?
本文详解将 Git 仓库默认分支从 `main` 迁移至 `master` 的完整流程:本地重命名、推送新分支、GitHub 后台切换默认分支、删除旧分支、更新跟踪关系,并涵盖团队协作同步与常见报错处理,操作安全清晰。(239字)
893 11
|
监控 Android开发
【Android 开发入门】android studio 控制台打印输出日志
有些情况下,不方便使用断点的方式来调试,而是希望在控制台打印输出日志,使用过Eclipse的同学都知道Java可以使用 System.out.println(""); 来在控制台打印输出日志,但是在android studio中却是不行的,还是有差别的,那应该用什么呢? android.util.Log 在调试代码的时候我们需要查看调试信息,那我们就需要用Android Log类。
3500 0
|
5月前
|
存储 人工智能 弹性计算
阿里云服务器学生免费领取指南:2026年最新0元获得一台学生机教程
阿里云学生可免费领300元无门槛代金券,认证后用于购云服务器即0元入手!教程涵盖申请、认证及使用全流程。非学生亦享权益中心特惠机型,低至38元/年。详情见阿里云高校用云计划。
11657 18
|
6月前
|
存储 缓存 安全
2026阿里云轻量服务器实例规格族:通用型、CPU优化型、多公网IP型、国际型和容量型介绍
阿里云轻量应用服务器升级至200M峰值带宽,提供通用型、CPU优化型、多公网IP型、国际型和容量型5大实例规格族,覆盖网站搭建、企业应用、跨境电商、私有网盘等多种场景,性能全面提升,最低38元/年起,助力开发者高效上云。
592 6
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
1087 2
基于Redis的高可用分布式锁——RedLock
|
JSON 前端开发 Java
Java新手指南:如何在Spring MVC中处理请求参数
处理Spring MVC中的请求参数是通过控制器方法中的注解来完成的。这些注解包括 `@RequestParam`, `@PathVariable`, `@ModelAttribute`, `@RequestBody`, `@RequestHeader`, `@Valid`, 和 `@RequestMapping`。使用这些注解可以轻松从HTTP请求中提取所需信息,例如URL参数、表单数据或者JSON请求体,并将其转换成Java对象以供进一步处理。
671 17
|
JSON API 数据安全/隐私保护
批量上传发布视频的软件,小红书抖音快手哔哩哔哩,自动发布上传作品工具【python】
这个项目包含完整的视频批量上传功能,支持多个平台,包含视频处理、配置管理和错误处理等功能
|
人工智能 网络安全 开发工具
vscode代码推送到github库菜鸡专用教程
vscode代码推送到github库菜鸡专用教程
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
923 3
快速上手|HTTP 接口功能自动化测试