CSAPP:cachelab(1)
本项目大体上就是要求用C\C++来模拟cpu对cache的访问,然后统计hits、misses和eviction的次数。其实并没有想象中的那么难,感觉完全可以当成一道acm里面的大模拟题。。下面就对这个题目涉及到的一些知识点做下总结:
(一)linux命令行处理
由于题目要求是在linux下以附加命令参数的方式来执行程序的,所以要对命令行的参数进行一下处理。这里要用到getopt函数,函数原型为:
int getopt(int argc,char** argv,const char* opstring);
我们都知道linux的命令参数分长参数和短参数,而这个函数是用来且只能用来处理短参数的,函数的返回值即为当前调用它所读取到的那个参数(int对应其ASCII码值),其中的opstring是一个短参数集合的字符串,形如:
const char* optstring = "hvs:t:b:E:";
其中每一个字母后面如果加一个冒号代表其必须带有一个附加的参数,不带就是必须没有附加的参数,而如果有两个冒号则是可带可不带参数,还有一点很重要,这些参数也就是字母的顺序是无所谓前后的,只要在这个字符串里就可以。
这个函数的调用要引用<getopt.h>库,该库还为我们提供了几个比较用帮助的全局变量,比较常见的有:optarg、opterror、optind,分别表示当前解析的参数的附加参数、解析是否出错(存在不能识别的opt即不在我们的optstring中,或者该加附带参数的opt没加不该加的加了)从而打印错误信息、下一个要解析的参数的index。我们可以根据自己的需要来利用并且手动的更改这些变量。
比如opterror=1的如果出错程序就会打印错误信息而当其等于0的时候程序就不会打印错误信息。我们通过optarg来获取每次解析参数所得到的附加参数,以字符串的形式返回!
关于命令行就总结这些,还有长参数的解析函数getopt_long(),详情可以去查看linux man page: http://linux.die.net/man/3/getopt_long
实现代码:
char* trace_file;
const char* optstring = "hvs:E:b:t";
char opt;
//deal with the short-option
while((opt=getopt(argc,argv,optstring))!=-) {
switch (opt) {
case 'h':
printusage(argv);
break;
case 'v':
flag = ;
break;
case 's':
state.s = atoi(optarg);
break;
case 'E':
state.E = atoi(optarg);
break;
case 'b':
state.b = atoi(optarg);
break;
case 't':
trace_file = optarg;
break;
default :
printusage(argv);
break;
}
}
(二)Cache的初始化
这部分其实就是通过编程语言的形式来“模拟”出cache的简单模型,即S=2^s个分组(set),每一组有E行,每行有B=2^b个存储单元,还有tag标记位和valid有效位,具体的图片如下图:
(图片来源:CSAPP.2E P305)
第一看这张图的时候一直看不懂,后来明白了上面得灰色部分是cache,而最下面哪一行长条是内存的一个地址,这个原理就是我们对内存的地址按照给定的参数s,E,b(其实还有个m,不过这题默认m=64)来划分成不同的块,从而借此来在cache中查找其是否存在,如果存在就是一个hit,直接在cache中提取从而节省访存的时间,反之就要将其载入cache然后在提取。
至于语言上的实现,就是设置几个结构体然后用malloc分配空间,或者用3维数组来实现应该也可以(不过数据量太大应该就不行了)
代码实现:
Cache init(int s,int E,int b)
{
int i,j;
int S = <<s;
int B = <<b;
Cache cache_t;
Set set_t;
Line line_t;
cache_t.s = (Set*)malloc(sizeof(Set)*S);
for(i = ;i < S;i++) {
set_t.l = (Line*)malloc(sizeof(Line)*E);
cache_t.s[i] = set_t;
for(j = ;j < E;j++) {
line_t.block = (int*)malloc(sizeof(int)*B);
cache_t.s[i].l[j] = line_t;
cache_t.s[i].l[j].flag = ;
cache_t.s[i].l[j].tag = ;
cache_t.s[i].l[j].used_time = ;
}
}
return cache_t;
}
(三)核心部分:对内存的访问
关于从trace文件中获取的数据,每条有两个要注意,一是开头的命令字母,这点cmu在一开始的提示文档里也给我们指出来了:aaarticlea/png;base64,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" alt="" />
注意这个‘M’是相当于两次访存!
第二个就是提供的address了,其实我们每次更新cache只要将address给传入到state_fresh函数就可以,然后根据给定的b、E、s来确定miss和hit的情况:
void state_fresh(Cache* cache,State* state,int ad,int cflag)
{
int i,j;
Set set_t;
Line line_t;
int cnt = getbi(ad);
int m = ;
int set = ,tag = ;
//get set
for(i = cnt-state->b;i > cnt-state->b-state->s;i--)
set += bi[i]*(<<(m++));
//get tag
m = ;
for(i = cnt-state->b-state->s;i > ;i--)
tag += bi[i]*(<<(m++));
首先对于给定的address我们确定他如果在cache中则他必须在的set的序号和他所固有的tag值,计算出这两个值后剩下的就是在cache中的相应位置去查找即可:
首先给出hit的情况:
//search in cache
set_t = cache->s[set];
for(i = ;i < state->E;i++) {
line_t = set_t.l[i];
if(line_t.flag== && line_t.tag==tag) {
state->hit++;
cache->s[set].l[i].used_time++;
if(cflag) printf("hit\n");
return;
}
}
如果set匹配,行匹配(flag=1且tag匹配),则标记位hit做好相应的处理工作,这题的关键点就是miss的情况,因为我们要分别讨论其是否要进行evict以及如何进行evict。
还是先给出有空位的情况:
//miss-could be flag = 0 or tag not equal
state->miss++;
//get the max used number
int* used_num = (int*)malloc(*sizeof(int));
int Min = getnum(&set_t,state,used_num);
//1.search for empty seats
for(i = ;i < state->E;i++) {
line_t = set_t.l[i];
if(line_t.flag == ) {
cache->s[set].l[i].flag = ;
cache->s[set].l[i].tag = tag;
cache->s[set].l[i].used_time = used_num[]+;
if(cflag) printf("miss\n");
return;
}
}
getnum函数就是找到当前ad所必须在的set的所有行的最小值和最大值,分别存储在used_num[0]和used_num[1]中,最小值很好理解就是为了稍后的找不到空行时替换用的,而最大值则是为了将miss的ad载入cache时标记其优先级用的。
LRU(Least-Recently used)算法就是在evict时主要用到的,这里只是给出了他的低级实现,简单的记录一下优先级,更全的大家可以参考:http://flychao88.iteye.com/blog/1977653 里面从低级到高级的LRU都有讲解,还有java的实现
//2.evict
if(cflag) {
if(cache->s[set].l[Min].flag==)
printf("miss ");
else
printf("miss\n");
}
if(cache->s[set].l[Min].flag==) {
state->evict++;
if(cflag)
printf("eviction\n");
}
cache->s[set].l[Min].flag = ;
cache->s[set].l[Min].tag = tag;
cache->s[set].l[i].used_time = used_num[]+;
free(used_num);
CSAPP:cachelab(1)的更多相关文章
- 链接器(linker)的作用——CSAPP第7章读书笔记
首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...
- CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom
CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom 栈结构镇楼 这里先给 ...
- CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz
前言 完成这个实验大概花费一天半的时间,看了很多大佬的博客,也踩了很多的坑,于是打算写一篇博客重新梳理一下思路和过程,大概会有两篇博客吧. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上 ...
- 《计算机组成原理/CSAPP》网课总结(一)
现在是2022年4月17日晚10点,本月计划的网课<csapp讲解>视频课看到了第八章"异常"第三讲,视频讲的很好但更新很慢,暂时没有最新的讲解,所以先做一个简单总结. ...
- 内存管理 初始化(五)kmem_cache_init 初始化slab分配器(上)
看了下kmem_cache_init,涉及到不同MIGRATE间的buddy system的迁移,kmem_cache的构建,slab分配器头的构建.buddy system的伙伴拆分. 对于SMP系 ...
- 数据结构---平衡查找树之B树和B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...
- 组建一台计算机5_硬件5 多位存储器&累加器&初始汇编(1)
转载请遵循GNU开源宣言.Copyleft ! <2013>, <http://www.cnblogs.com/sciencefans from buaa 华罗庚班> 阅读此文 ...
- 【经典数据结构】B树与B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- 02--C编程细节整理(一)
用C语言比较多,这篇是平时攒下的.有些内容在工作后可能会很常见,但是不用容易忘,所以就写篇博客吧. 1. printf的用法 %*可以用来跳过字符,可以用于未知缩进.像下面一样. for ...
随机推荐
- 初学coreData数据库读取不成功的问题
写了一个从数据库读取数据显示列表的代码,结果却无法运行,提示找不到对应的entity,也就是数据库中的某一个表 我查遍了代码也没有发现什么逻辑错误,在appDelegate也初始化了相关数据库,在界面 ...
- 关于Daydream VR的最直白的介绍
虚拟现实(Virtual Reality),简称虚拟技术,也称虚拟环境,是利用电脑模拟产生一个三度空间的虚拟世界,提供用户关于视觉等感官的模拟,让用户如同身历其境一般,电脑可以立即进行复杂的运算,将精 ...
- BestCoder 1st Anniversary
Souvenir Accepts: 1078 Submissions: 2366 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 26 ...
- XMLHelper 类
这个XMLHelper类中包括了XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现,有兴趣的朋友,可以进来看看,所有代码都在WebForm和WinForm中调试通过. 这是下面 ...
- 解决tomcat占用8080端口问题
在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程 显示占用端口的进程 askkill /pid 44464 /f //说明,运 ...
- 跟我学android-使用Eclipse开发第一个Android应用(三)
打开Eclipse,选择 File—New –Android Application Project Application Name 就是我们的 应用名称,也是我们在手机应用程序列表里看到的名称. ...
- JavaScript奇技淫巧44招
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- 事后调试之MiniDump转储
程序发布后,针对在用户使用过程中出现的一些问题进行调试,这个过程可以称为是事后调试.在程序Crash时转储MiniDump文件供软件开发工程师分析是一种比较常用的方法.下面介绍两种常用的在程序Cras ...
- table表格cellspacing与cellpadding属性
cellspacing属性 用来指定表格各单元格之间的空隙. cellpadding属性 用来指定单元格内容与单元格边界之间的空白距离的大小. 此属性的参数值也是数字,表示单元格内容与上下边界之间空白 ...
- windows8.1 下搭建配置apache+php+mysql
软件版本: apache:Apache 2.4.10 Win64 http://www.apachelounge.com/download/VC11/binaries/httpd-2.4.10- ...