CSAPP实验四——cache lab实验(一)

在学完《深入理解计算机系统(CSAPP)》第六章有关存储器层次结构方面的知识后,就可以着手做cache lab的实验了。实验分为两个部分,这篇博客只聊聊自己在做第一部分的一点心得。思路部分也是参考了网上其他大神的想法,如果有写的不对的地方,欢迎大家在评论区指出。

cache lab的第一个实验是写一个程序模拟高速缓存的行为。需要注意的是这个程序仅仅需要模拟判断命中、替换算法和牺牲行的驱逐三个功能,不需要考虑缓存里块中存储的所需要读写的数据到底是什么。最后呈现的方式也是读取一系列内存读取的指令,给出命中、不命中和驱逐次数。

压缩文件中包含了一个csim-ref的可执行文件,我们写的程序csim功能上需要与这个csim-ref基本类似,至少对于相同内存读写时命中、不命中和驱逐次数三个数值相同。所以我们不妨看看csim-ref的基本情况。

根据压缩包里提供的帮助文档,可以知道在控制台输入的参数格式如下:
控制台输入的参数格式
其中加上参数v后,会把每一条指令是什么类型(L, M, S),读写内存大小和是否命中是否驱逐的信息逐行逐指令一一显示。而如果不加参数v只会显示做完所有指令后统计的命中、不命中和驱逐次数的和。

再来看指令的格式
指令格式
I表示读指令,在这个实验中不需要考虑。L表示加载、S表示存储,由于这个实验只需要模拟命中和驱逐次数这些,与内存块内数值是什么并没有关系,所以可以将L和S看成同一个对缓存的操作。M表示修改,对应一个加载一个存储,所以可以看成两个操作

理清思路后就可以着手码代码了。

1. 前期准备


首先定义相应结构体类型,回忆书上讲的内容,我们知道缓存可以看成一个很大的数组,数组中是由一个个组构成,组是由行来构成的,行是由标识位、有效位和块来组成。
这里由于实验我们不关心块的具体内容,所以可以在行中省去块的部分。同时每个行需要一个用来表示替换算法LRU优先级的数值,表示在没有空行时如果不命中需要优先替换组内的哪一行。在这里我定义这个数值为LRUcount,当这个数值越大则其越容易被替换,被访问后或被替换后这一行的数值被重置为0。

//行
typedef struct{
   
    int valid;   //一行的有效位(1表示有效)
    int tag;	 //一行的标识位
    int LRUcount;    //LRU替换优先级(越大替换优先级越高)	
}Line;

//组
typedef struct{
   
    Line* lines;  
}Set;

//缓存
typedef struct{
   
    Set* sets;
    int numset;    //组数
    int numline;   //行数
}Sim_cache;

接着写从控制台得到对应的s, E, b等选项参数的输入,参考了其他博客调用的是Linux C下的getopt()函数。需要包含头文件<getopt.h>。虽然<getopt.h>也是包含在<unistd.h>头文件中,但是我在make时一直报“隐式函数声明错误”的问题,于是索性直接include<getopt.h>本身了。

getopt()函数原型如下:
int getopt(int argc,char * const argv[ ],const char * optstring);

其中第三个参数传入的字符串就是命令行输入参数对应的格式。有冒号的表示该选项需要参数,全域变量optarg 即会指向此额外参数。这样就可以得到s, E, b这些数值。
关于getopt()函数的详细解释可以参考链接

void getOpt(int argc, char** argv, int *verbose, int *s, int *E, int *b){
   
    char ch;
    while( (ch=getopt(argc, argv, "hvs:E:b:t:") )!= -1 ){
   
		switch(ch){
   
	    	case 'h' : printHelpMenu(); break;
	    	case 'v' : *verbose = 1; break;
	    	case 's' : *s = atoi(optarg); break;
	    	case 'E' : *E = atoi(optarg); break;
	    	case 'b' : *b = atoi(optarg); break;
	    	case 't' : tracename = (char*)optarg; break;
	    	default : printHelpMenu(); exit(0);
		}
    }
}

依葫芦画瓢,模仿csim-ref的参考文档写出csim相应的打印帮助信息函数。

void printHelpMenu(){
   
    printf("Usage: ./csim-ref [-hv] -s <num> -E <nu
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值