本项目大体上就是要求用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)的更多相关文章

  1. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...

  2. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom

    CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom 栈结构镇楼 这里先给 ...

  3. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz

    前言 完成这个实验大概花费一天半的时间,看了很多大佬的博客,也踩了很多的坑,于是打算写一篇博客重新梳理一下思路和过程,大概会有两篇博客吧. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上 ...

  4. 《计算机组成原理/CSAPP》网课总结(一)

    现在是2022年4月17日晚10点,本月计划的网课<csapp讲解>视频课看到了第八章"异常"第三讲,视频讲的很好但更新很慢,暂时没有最新的讲解,所以先做一个简单总结. ...

  5. 内存管理 初始化(五)kmem_cache_init 初始化slab分配器(上)

    看了下kmem_cache_init,涉及到不同MIGRATE间的buddy system的迁移,kmem_cache的构建,slab分配器头的构建.buddy system的伙伴拆分. 对于SMP系 ...

  6. 数据结构---平衡查找树之B树和B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...

  7. 组建一台计算机5_硬件5 多位存储器&累加器&初始汇编(1)

    转载请遵循GNU开源宣言.Copyleft ! <2013>, <http://www.cnblogs.com/sciencefans from buaa 华罗庚班> 阅读此文 ...

  8. 【经典数据结构】B树与B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...

  9. 02--C编程细节整理(一)

    用C语言比较多,这篇是平时攒下的.有些内容在工作后可能会很常见,但是不用容易忘,所以就写篇博客吧. 1.        printf的用法 %*可以用来跳过字符,可以用于未知缩进.像下面一样. for ...

随机推荐

  1. Javascript 控制style 小结

    style.top 如: c.style.top=scrollTop; 在IE各版本中可以,Safari, chrome, Firefox都不work, 需要在后面 + "px";

  2. Android 开源项目 eoe 社区 Android 客户端(转)

    本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub ...

  3. U口破解指令介绍.

  4. Android签名详解(debug和release)

    Android签名详解(debug和release)   1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...

  5. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...

  6. 【OpenSSL】创建证书

    [-] 1生成根证书 1 生成RSA私钥 2 生成证书请求 3 签发自签名证书 2 生成用户证书 1 生成RSA私钥 2 生成证书请求 3 签发证书   1)生成根证书 1.1) 生成RSA私钥 op ...

  7. 在浏览器运行 java applet时遇到的一些问题及其解决方法

    运行 java applet时提示:您的安全设置已阻止本地应用程序运行,如何解决?如下图所示 这时候通过设置java的安全级别就可以了. 控制面板->程序->Java->安全 将安全 ...

  8. WPF命令

    WPF的命令是经常使用的,在MVVM中,RelayCommand更是用得非常多,但是命令的本质究竟是什么,有了事件为什么还要命令,命令与事件的区别是什么呢?MVVM里面是如何包装命令的呢?命令为什么能 ...

  9. magnific-popup 一款优秀, 多种功能于一身的弹出层jQuery插件.

    功能很强大:灯箱, 画廊, 放大图片, 弹出Youtube GoogleMap, ajax读取popup等等文档:http://dimsemenov.com/plugins/magnific-popu ...

  10. (转)你知道Android也有安全模式吗?(地球人都知道了吧)

    使用PC时,我们习惯在安全模式下解决驱动的各种兼容性问题.而你是否又知道,Android手机同样存在安全模式,帮你解决APP的各种冲突问题. 很多Android手机用户都遇到过下面这种极端情况:因为第 ...