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 ...
随机推荐
- Python分类统计数据
在数据的常见分布中,有一种是一对多存储的数据,即一个是key,其他改key对应的多个value.例如气象数据等,每天有很多组,又或者是一个球员,他每天得多少分等等.我做这个东西有三种方法,即:常规编程 ...
- Python自动化之5种session类型
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session Django默认支持Se ...
- Android 自定义Activity的标题栏(Titlebar)
缺省的情况下,通常见到Activity的标题栏(Titlebar)是这样的(红色框内): HandleContacts是Activity的标题.有时候,我们希望能改变一下这样单调的状况.比如,要在标题 ...
- 运行phpize时出现:Cannot find autoconf. Please check your autoconf installation
运行/usr/local/webserver/php/bin/phpize时出现:Configuring for:PHP Api Version: 20041225Zend Module Api No ...
- iOS开发之Quartz2D详解
1. 什么是Quartz2D? Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片( ...
- 如何修改UITableView每个cell的分隔线和左边的距离?
在ios7中,UITableViewCell左侧会有默认15像素的空白.这时候,设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉.但是在ios8中,设置setSe ...
- Android动画 fillAfter和fillBefore
fillBefore是指动画结束时画面停留在此动画的第一帧; fillAfter是指动画结束是画面停留在此动画的最后一帧. java代码设置如下: /*****动画结束时,停留在最后一帧******* ...
- Windows环境下 配置memcached (php)
memcached就不用介绍了-- 1:在Windows下安装memcached服务端软件,已经下载并上传云盘 ---传送门 记得带钥匙:ykrc 解压缩后里面的安装说明内有安装教程. 2:软件安装 ...
- jquery ajax (1)原始js 实现
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Asp.net mvc中Controller的返回值
(1)EmptyResult:当用户有误操作或者是图片防盗链的时候,这个EmptyResult就可以派上用场,返回它可以让用户啥也看不到内容,通过访问浏览器端的源代码,发现是一个空内容: public ...