Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】
目录
任务描述
知识回顾
实验内容
测试结果
Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。
任务描述
Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference simulator. Notice that this file is almost completely empty. You’ll need to write it from scratch.
A 部分的工作是填写 csim.c 文件,以便它采用相同的命令行参数并生成与参考模拟器相同的输出。请注意,此文件几乎完全为空。你需要从头开始编写它。
(有关参考模拟器:)
我们为您提供了引用缓存模拟器的二进制可执行文件,称为 csim-ref,用于模拟 valgrind 跟踪文件上具有任意大小和关联性的缓存的行为。在选择要逐出的缓存行时,它使用 LRU(最近最少使用的)替换策略。
知识回顾
1. 层次结构中每一层都是缓存,缓存下一层的数据块
2.块
数据以块大小为传送单元,在相邻两层之间来回复制(不同的相邻两层间传送大小不同,远离CPU倾向于使用更大的块)
3. hit&miss&eviction
4.miss的三种类别
cold miss(cold cache)
冲突不命中:与严格的放置策略有关
容量不命中:工作集比缓存大,也就是缓存太小
5.两类放置策略
随机放置:靠近CPU的层使用该策略,完全用硬件实现
更严格的放置策略:下一层的一些块被映射到上一层的同一个位置(类似于哈希,所以冲突miss产生了)
6. 缓存由谁来管理
硬件
硬件+软件
软件
7. 高速缓存存储器
随着CPU和主存性能差距增大,设计者在二者之间加入了L1,L2,L3.本书假设只有L1.

由E的不同分为3种:直接映射高速缓存、组相联高速缓存、全相联高速缓存。
8.三步:
组选择
行匹配/行替换
字抽取
实验内容
注意:
1. 测试用例的地址是以16进制表示的,且是64位地址。
2. 使用getopt时,optarg这个变量不要自己定义。
3. 我用时间戳实现LRU算法,这个效率不是最优的。标准的LRU算法实现见我的这篇文章
4. L和S是不区分的,I是要被忽略的,M相当于L+S
5. 官方可以参考的资料中,尤其要细看15年的习题课PPT和该实验的write up的最后几页内容。
#include "cachelab.h"
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <getopt.h>struct block{int stamp; //LRU的时间戳bool valid;unsigned long long tag;
};// 全局时间
int time = 0;// 预存输出详细信息的字符串
char ** makeInfoString(void)
{char ** infoStr = (char **)malloc(sizeof(char *) * 3);infoStr[0] = "hit";infoStr[1] = "miss";infoStr[2] = "miss eviction";return infoStr;
}// malloc二维数组
struct block ** createTable(int row, int col)
{struct block ** L = (struct block **)malloc(sizeof(struct block *) * row);for (int i=0; i<row; i++)L[i] = (struct block *)malloc(sizeof(struct block) * col);return L;
}// 初始化刚刚malloc出来的二维数组
void initCache(struct block ** L, int row, int col)
{for (int i=0; i<row; i++)for (int j=0; j<col; j++){L[i][j].valid = false;L[i][j].stamp = -1;}return;
}int find(struct block ** L, unsigned long long addr, int S, int E, int B, int m, int b, int s)
{unsigned long long bias = addr & (B-1);unsigned long long index = (addr >> b) & (S - 1);unsigned long long tag = (addr & ~(S * B - 1)) >> (b + s);//printf("t = %llu\ts = %llu\tb = %llu\t\n",tag, index, bias);for (int j = 0; j < E; j++){if (L[index][j].valid && L[index][j].tag == tag){L[index][j].stamp = ++time;return 0; //hit}}for (int j = 0; j < E; j++){if (!L[index][j].valid){L[index][j].valid = true;L[index][j].stamp = ++time;L[index][j].tag = tag;return 1; //miss}}int min_time = 0;for (int j = 1; j < E; j++)if (L[index][j].stamp < L[index][min_time].stamp)min_time = j;L[index][min_time].stamp = ++time;L[index][min_time].tag = tag;return 2; //miss eviction
}void solve(struct block **L, unsigned long long addr, char ** infoStr, int * m_cnt, int * h_cnt, int * e_cnt, int S, int E, int B, int m, int b, int s)
{int ans = find(L, addr, S, E, B, m, b, s);printf("%s", infoStr[ans]);if (ans == 0)(*h_cnt)++;else if (ans == 1)(*m_cnt)++;else {(*m_cnt)++;(*e_cnt)++;}}int main(int argc, char *argv[])
{char ** infoStr = makeInfoString();int S, s, E, B, b, m = 64;bool verbose = false;char filename[100];int opt;// optarg不能在这里定义,否则就覆盖了getopt函数中所用的那个变量while ((opt = getopt(argc, argv, "vs:E:b:t:")) != -1){switch (opt){case 'v':verbose = true;break;case 's':s = atoi(optarg);S = 1 << s;break;case 'E':E = atoi(optarg);break;case 'b':b = atoi(optarg);B = 1 << b;break;case 't':strcpy(filename, optarg);break;}}printf("S = %d\ns = %d\nE = %d\nB = %d\nb = %d\nfilename = %s\n", S, s, E, B, b, filename);struct block ** L = createTable(S, B);initCache(L, S, B);// std IOFILE * fp = fopen(filename, "r");if (fp == NULL) exit(-1);//读一行char line[100];char op;unsigned long long addr;int size;int m_cnt = 0, h_cnt = 0, e_cnt = 0;while (fgets(line, 100, fp)){ // 忽略是I的行if (line[0] != ' ') continue;sscanf(line, " %c %llx,%d\n", &op, &addr, &size);line[strlen(line)-1] = '\0';printf("%s ", line);solve(L, addr, infoStr, &m_cnt, &h_cnt, &e_cnt, S, E, B, m, b, s);// 如果是Mif (op == 'M'){printf(" hit");h_cnt++;}printf("\n");}printSummary(h_cnt, m_cnt, e_cnt);return 0;
}
测试结果
相关文章:

Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】
目录 任务描述 知识回顾 实验内容 测试结果 Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。 任务描述 Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference …...

操作系统基础:死锁
🌈个人主页:godspeed_lucip 🔥 系列专栏:OS从基础到进阶 🐦1 死锁的概念🦢1.1 总览🦢1.2 什么是死锁🦢1.3 死锁、饥饿、死循环的区别🐧1.3.1 概念🐧1.3.2 区别…...
Ubuntu server如何使用 Daphne + Nginx + supervisor部署 Django
Django从 3.0版开始加入对ASGI的支持,使Django开始具有异步功能。 截止目前的5.0版,对异步支持逐步也越来越好,相信在未来的版本中异步将会支持的更加完善。 所以说,我们也需要适时的更新我们的技能,学会在asgi异步服务器环境中部署django项目! 在部署之前我们所有的依…...
Android 12.0 应用中监听系统收到的通知
1. 需求 在系统内置应用中或者在第三方应用中,获取Android系统收到的通知的内容. 2. NotificationListenerService 接口 Android 系统预留了专门的API, 即 NotificationListenerService 接口,它的源码路径为: 源码路径 : /frameworks/base/core/java/android/service/notifi…...

SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)
点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录(含源码)》 1. 引言 在当今的网络环境中,保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击,我们需要在用户尝试登录失败一定次数后限制其登录。这不…...
kotlin中的初始化问题纪录
1. init 代码块的顺序问题 init代码块和成员变量实质上是按先后顺序执行的。若果init{} 中有成员变量使用。要把成员变量放到代码块之前。 2. init代码块之中的函数问题 下面是一段错误的代码: class mkotlin{val info:Stringinit {getInfoMethod()info "adad…...

Web中的转发与重定向
转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一…...

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型
目录 往期精彩内容: 前言 1 快速傅里叶变换FFT原理介绍 第一步,导入部分数据 第二步,故障信号可视化 第三步,故障信号经过FFT可视化 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 交叉注意力机制 …...

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)
通过STM32F103C8T6读取MPU6050数据控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机) 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM?②STM32F103C8T6如何生成PWM?③控制舵机需要什么样的PWM波? 三…...
Unity_Playable工具使用
Unity_Playable工具使用 目录 Unity_Playable工具使用 1. Default Playables(Timeline扩展) 2. PlayableGraph Visualizer&#x...

Flutter canvas 画一条波浪线 进度条
之前用 Flutter Canvas 画过一个三角三角形,html 的 Canvas 也画过一次类似的, 今天用 Flutter Canvas 试了下 感觉差不多: html 版本 大致效果如下: 思路和 html 实现的类似: 也就是找出点的位置,使用二阶…...

Java技术栈 —— Spring MVC 与 Spring Boot
参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC...

跟着cherno手搓游戏引擎【16】Camera和Uniform变量的封装
相机封装: OrthographicCamera.h: #pragma once #include <glm/glm.hpp> namespace YOTO {class OrthographicCamera{public:OrthographicCamera(float left,float right , float bottom,float top);const glm::vec3& GetPosition()const { return m_Pos…...

微服务中间件 RabbitMq学习
1、为什么需要Mq 例如在用户注册业务中,用户注册成功后 需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式;2.并行的方式 ; 假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间10…...
3D Gaussian Splatting-实时辐射场渲染技术
引用自:https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf 概述: 该论文介绍了一种用于实时辐射场渲染的3D高斯点渲染技术。 其基本原理是: 一:首先从SfM校准的图像及其对应的稀疏点云…...
vue中nextTick()
在 Vue.js 中,nextTick() 是一个非常有用的方法,用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码,用于解析 nextTick() 的用法: <template> &…...

Redis 布隆过滤器
布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…...

中国的茶文化:现代生活中的茶文化
中国的茶文化:现代生活中的茶文化 引言 在现代社会的快节奏生活中,茶文化并未随时间流逝而褪色,反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴,成为一种连接历史、人文与现代生活方式的艺术形式。本文…...

Python正则表达式语法
正则表达式是一种强大的文本处理工具,它可以用来搜索、匹配和替换特定的字符模式。在Python中,正则表达式常常被用于处理字符串数据,例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法,帮助读者全…...
C++核心编程:文件操作 笔记
5.文件操作 程序运行时产生的数据都属于临时数据,程序一旦允许结束都会被释放。通过文件可以将数据持久化 C中对文件操作需要包含头文件<fstream> 文件类型分为两种: 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...