本项目大体上就是要求用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. Windows Azure上的Odoo(OpenERP)-2.在Ubuntu虚拟机上部署Odoo(OpenERP)

    创建虚拟机的步骤在这里就不再赘述了,请参考上一篇博文. 首先用下述命令将Ubuntu系统进行更新: 1. sudo apt-get update 2. sudo apt-get upgrade 3. ...

  2. HTML 详细介绍

    什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...

  3. java中的IO二

    java中流分为节点流和处理流,IO一中的案例都是节点流 一.处理流的使用实例 二.装饰者模式 以上BufferReader的用法就是装饰者模式 Decorator就是动态地给对象增添行为 如果要实现 ...

  4. type和create type

    type和create type 异同点:      create type 可在库中生成一个长期有效的自定义类型对象,而type作用域仅限于语句块中:      两者都可以自定义数据类型: 各种ty ...

  5. 015_xml_函数

    015_xml_函数 --环境准备******************************************************************* USE test --f:/t ...

  6. 【转】Hibernate和ibatis的比较

    1. 简介 Hibernate是当前最流行的O/R mapping框架.它出身于sf.net,现在已经成为Jboss的一部分了.iBATIS是另外一种优秀的O/R mapping框架,现已改名叫myB ...

  7. thinkphp框架之模型(数据库查询)

    1. 模型定义 文件名称必须是 表名+Model.class.php 例如:UserModel.class.php namespace Home\Model; //该模型类的命名空间 use Thin ...

  8. 兄弟连王牌PHP课程送三重豪礼啦!

    兄弟连PHP就业办课程送三重豪礼啦! 惊喜一:报名9月23日班级,保障薪资直涨1000元! 9月报名学习,春节后就业,正是企业招聘的黄金高峰期,一年中拿到高薪最好的时节! 惊喜二:兄弟连云课堂900元 ...

  9. centos 下搭建 php环境(1)

    3.PHP的安装 安装GD库(让PHP支持GIF,PNG,JPEG) 首先下载 jpeg6,libpng,freetype 并安装模块 wget http://www.ijg.org/files/jp ...

  10. twisted(1)--何为异步

    早就想写一篇文章,整体介绍python的2个异步库,twisted和tornado.我们在开发python的tcpserver时候,通常只会用3个库,twisted.tornado和gevent,其中 ...