当前位置: 首页 > news >正文

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.

高速缓存的结构可以用元组(S,E,B,m)来描述。

由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 …...

操作系统基础:死锁

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f426;1 死锁的概念&#x1f9a2;1.1 总览&#x1f9a2;1.2 什么是死锁&#x1f9a2;1.3 死锁、饥饿、死循环的区别&#x1f427;1.3.1 概念&#x1f427;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如何实现用户输入错误密码后限制登录&#xff08;含源码&#xff09;》 1. 引言 在当今的网络环境中&#xff0c;保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击&#xff0c;我们需要在用户尝试登录失败一定次数后限制其登录。这不…...

kotlin中的初始化问题纪录

1. init 代码块的顺序问题 init代码块和成员变量实质上是按先后顺序执行的。若果init{} 中有成员变量使用。要把成员变量放到代码块之前。 2. init代码块之中的函数问题 下面是一段错误的代码&#xff1a; class mkotlin{val info:Stringinit {getInfoMethod()info "adad…...

Web中的转发与重定向

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

交叉注意力融合时域、频域特征的FFT + CNN-Transformer-CrossAttention轴承故障识别模型

目录 往期精彩内容&#xff1a; 前言 1 快速傅里叶变换FFT原理介绍 第一步&#xff0c;导入部分数据 第二步&#xff0c;故障信号可视化 第三步&#xff0c;故障信号经过FFT可视化 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 3 交叉注意力机制 …...

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动&#xff08;STM32、GY-521 MPU6050、SG90舵机、MG946舵机&#xff09; 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM&#xff1f;②STM32F103C8T6如何生成PWM&#xff1f;③控制舵机需要什么样的PWM波&#xff1f; 三…...

Unity_Playable工具使用

Unity_Playable工具使用 目录 Unity_Playable工具使用 1. Default Playables(Timeline扩展) 2. PlayableGraph Visualizer&#x...

Flutter canvas 画一条波浪线 进度条

之前用 Flutter Canvas 画过一个三角三角形&#xff0c;html 的 Canvas 也画过一次类似的&#xff0c; 今天用 Flutter Canvas 试了下 感觉差不多&#xff1a; html 版本 大致效果如下&#xff1a; 思路和 html 实现的类似&#xff1a; 也就是找出点的位置&#xff0c;使用二阶…...

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变量的封装

相机封装&#xff1a; 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 例如在用户注册业务中&#xff0c;用户注册成功后 需要发注册邮件和注册短信&#xff0c;传统的做法有两种 1.串行的方式&#xff1b;2.并行的方式 &#xff1b; 假设三个业务节点分别使用50ms&#xff0c;串行方式使用时间150ms&#xff0c;并行使用时间10…...

3D Gaussian Splatting-实时辐射场渲染技术

引用自&#xff1a;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_high.pdf 概述&#xff1a; 该论文介绍了一种用于实时辐射场渲染的3D高斯点渲染技术。 其基本原理是&#xff1a; 一&#xff1a;首先从SfM校准的图像及其对应的稀疏点云…...

vue中nextTick()

在 Vue.js 中&#xff0c;nextTick() 是一个非常有用的方法&#xff0c;用于在下一个 DOM 更新循环结束后执行延迟回调。这在你需要读取或写入刚刚更新的 DOM 时非常有用。 下面是一个简单的示例代码&#xff0c;用于解析 nextTick() 的用法&#xff1a; <template> &…...

Redis 布隆过滤器

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

中国的茶文化:现代生活中的茶文化

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

Python正则表达式语法

正则表达式是一种强大的文本处理工具&#xff0c;它可以用来搜索、匹配和替换特定的字符模式。在Python中&#xff0c;正则表达式常常被用于处理字符串数据&#xff0c;例如文本搜索、数据提取、格式验证等任务。本文将深入介绍Python中正则表达式的语法&#xff0c;帮助读者全…...

C++核心编程:文件操作 笔记

5.文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦允许结束都会被释放。通过文件可以将数据持久化 C中对文件操作需要包含头文件<fstream> 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本…...

Matlab_Simulink与Carsim的联合仿 擅长基于群智能算法优化的LQR、PID控制算法,能清晰讲解其中要点哦。对于基于群智能算法的一般路径规划

Matlab/Simulink与Carsim的联合仿 擅长基于群智能算法优化的LQR、PID控制算法&#xff0c;能清晰讲解其中要点哦。对于基于群智能算法的一般路径规划 稍长智能车轨迹跟踪控制方向 熟悉Matlab/Simulink和Carsim的联合仿真呢。这是一个非常专业且热门的研究方向&#xff08;群智能…...

Phi-3-mini-4k-instruct-gguf应用落地:律师助理合同风险点识别与提示生成

Phi-3-mini-4k-instruct-gguf应用落地&#xff1a;律师助理合同风险点识别与提示生成 1. 项目背景与价值 在法律服务领域&#xff0c;合同审查是律师日常工作中最耗时且重复性高的任务之一。传统人工审查方式存在效率低下、容易遗漏细节等问题。Phi-3-mini-4k-instruct-gguf作…...

Cursor Free VIP:突破AI编程助手限制的开源解决方案

Cursor Free VIP&#xff1a;突破AI编程助手限制的开源解决方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial…...

区块链+AI的致命组合:深扒某DeFi项目的测试黑幕

在数字经济浪潮中&#xff0c;区块链与人工智能&#xff08;AI&#xff09;的融合被视为金融创新的“致命组合”&#xff0c;尤其在去中心化金融&#xff08;DeFi&#xff09;领域&#xff0c;它承诺了前所未有的效率和智能决策能力。然而&#xff0c;这一组合也带来了隐蔽的测…...

亚洲美女-造相Z-Turbo可部署方案:适配信创环境(麒麟OS+昇腾910B)可行性验证

亚洲美女-造相Z-Turbo可部署方案&#xff1a;适配信创环境&#xff08;麒麟OS昇腾910B&#xff09;可行性验证 今天我们来聊聊一个挺有意思的话题&#xff1a;怎么把一个专门生成亚洲美女图片的AI模型&#xff0c;部署到咱们国产的信创环境里。这个模型叫“亚洲美女-造相Z-Tur…...

Z-Image-Turbo_Sugar脸部Lora问题排查:常见错误403 Forbidden与连接问题解决

Z-Image-Turbo_Sugar脸部Lora问题排查&#xff1a;常见错误403 Forbidden与连接问题解决 部署和调用AI模型服务&#xff0c;就像组装一台新电脑&#xff0c;硬件都插好了&#xff0c;但开机时屏幕就是不亮&#xff0c;或者提示你密码错误。最近不少朋友在折腾Z-Image-Turbo_Su…...

深入理解Java AQS:抽象队列同步器的核心原理与实战指南

深入理解Java AQS&#xff1a;抽象队列同步器的核心原理与实战指南 【免费下载链接】JavaGuide Java 面试 & 后端通用面试指南&#xff0c;覆盖计算机基础、数据库、分布式、高并发、系统设计与 AI 应用开发 项目地址: https://gitcode.com/gh_mirrors/ja/JavaGuide …...

新手零基础入门:在快马平台用AI生成你的首个龙虾部署项目

新手零基础入门&#xff1a;在快马平台用AI生成你的首个龙虾部署项目 作为一个刚接触容器化开发的新手&#xff0c;第一次听说"龙虾部署"这个概念时&#xff0c;我完全摸不着头脑。后来才知道&#xff0c;这其实就是Docker容器化部署的一种形象说法。今天我想分享一…...

机器标识重置技术实现的Cursor Pro功能解锁解决方案

机器标识重置技术实现的Cursor Pro功能解锁解决方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request li…...

遗传算法(GA)调参实战:以Scikit-learn模型为例,手把手教你自动化超参数搜索

遗传算法调参实战&#xff1a;用进化思维优化Scikit-learn模型超参数 当我们在机器学习项目中反复调整随机森林的max_depth或XGBoost的learning_rate时&#xff0c;是否想过自然界早已提供了更优雅的解决方案&#xff1f;生物进化经过数十亿年锤炼的优化机制&#xff0c;正以遗…...