CacheLAB1

cachelab-handout

1.数据在内存中的地址\rightarrow数据在缓存中的位置

这中间存在一种映射关系:

1

把数据在内存中的地址分成三个部分:

①tag:表明身份,缩小到某一个0~2^{b}的地址变化范围内。

②s:表明组号

③b:表明偏移量,确定一个具体的地址。

2.缓存中的一些术语:

 

1.A cache is composed of:  2^{s}

2.A set is composed of: E 行

3.A line is composed of: 有效字节数+标签+2^{b}

映射流程:

①获得地址数据中间s个字节,确定组数:index=s

②获得tag,查找Index组里面每一个行,如果已经被占用,看一下占用者的tag是不是和自己的一样。

  • 一样:命中。
  • 不一样:继续往后面的行找,没有找到相同的:(不命中)
  • 找到空的line: 放进去。
  • 没有找到空的line:根据Lru算法驱逐这一组最近最少访问到的line里的数据,我来占用。        

注意:缓存里面根据空间局部性,每次访问一个内存地址内的数据,附近地址内的数据也放入了缓存(在同一行里面)。其中可以读出的地址范围取决于b(2^{b})。 

实现:

Line: 有效数据数目+标签+距离上一次访问的时间(这是一个缓存模拟器,不需要存储数据)

typedef struct {
	int valid;
	int tag;
	int LruNumber;
	
}Line;

set:包含E个line的数组

typedef struct {
	Line *lines;
	
}Set;

cache:set_num个组+每组line_num个行+包含set_num个组的数组

typedef struct {
	int set_num;
	int line_num;
	Set* sets;
	
}Sim_Cache;

1.初始化:

void init_SimCache(int s , int E, int b,Sim_Cache* cache){
	Sim_Cache c;
	Line l;
	int S=1<<s,i,j;

	c.set_num=S;c.line_num=E;//组数和行数
	c.sets=(Set*)malloc(S*sizeof(Set));//分配组空间
	l.valid=l.LruNumber=0;//初始化行的数据
    //为每一组分配E个line的空间
	for(i=0;i<S;i++){
		c.sets[i].lines=(Line*)malloc(E*sizeof(Line));
		for(j=0;j<E;j++)//对每一个line初始化
			c.sets[i].lines[j]=l;	
	}
	*cache=c;	

}

2.释放:

void free_SimCache(Sim_Cache* cache){
	int S=(*cache).set_num;
	int i;
	for(i=0;i<S;i++)//释放每一组
		free((*cache).sets[i].lines);
    free((*cache).sets);//释放整个缓存
	
}

3.输出缓存的信息:输出每一组每一行的valid+tag+LruNumber

void putSets(Sim_Cache* cache){
	int i,j;
	Set* se=(*cache).sets;
	Line l;
	int S=(*cache).set_num,E=(*cache).line_num;
	printf("\ninformation in sets:\n  index    (valid,tag,LruNumber)\n");
	for(i=0;i<S;i++){
		printf("  0x%x:     ",i);
		for(j=0;j<E;j++){
			l=se[i].lines[i];
			printf("(%d,%d,%d)  ",l.valid,l.tag,l.LruNumber);
		}
		printf("\n");
	}
}

4.命令的输入:

2

用getopt函数读取命令行参数:#include <unistd.h>

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

获取的参数:extern char *optarg; extern int optind, opterr, optopt;

参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。

短参数的定义

       getopt()使用optstring所指的字串作为短参数列表,象"1ac:d::"就是一个短参数列表。短参数的定义是一个'-'后面跟一个字母或数字,象-a, -b就是一个短参数。每个数字或字母定义一个参数。 

  其中短参数在getopt定义里分为三种:

  1. 不带值的参数,它的定义即是参数本身。

  2. 必须带值的参数,它的定义是在参数本身后面再加一个冒号。

  3. 可选值的参数,它的定义是在参数本身后面加两个冒号 。

  在这里拿上面的"1ac:d::"作为样例进行说明,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。

  在实际调用中,'-1 -a -c cvalue -d', '-1 -a -c cvalue -ddvalue', '-1a -ddvalue -c cvalue'都是合法的。这里需要注意三点:

  1. 不带值的参数可以连写,象1和a是不带值的参数,它们可以-1 -a分开写,也可以-1a或-a1连写。

  2. 参数不分先后顺序,'-1a -c cvalue -ddvalue'和'-d -c cvalue -a1'的解析结果是一样的。

  3. 要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析错误。


返回值

   getopt()每次调用会逐次返回命令行传入的参数。

   当没有参数的最后的一次调用时,getopt()将返回-1。

    当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回'?'。

   当optstring是以':'开头时,缺值参数的情况下会返回':',而不是'?' 。

————详见oSanWenYu博客链接

int get_opt(int argc, char **argv,int *s,int *E,int*b,char* tracefileName,int* isVerbose){
	int valid=1,p=0;
	char ch;
	*isVerbose=0;
	while(valid&&(ch=getopt(argc,argv,"h::v::s:E:b:t:"))!=-1){
		switch(ch){
			case's':
				valid&=(checkOptarg(optarg));
				*s=string_to_int(optarg);
				break;
			case'E':
				valid&=(checkOptarg(optarg));
				*E=string_to_int(optarg);
				break;
			case'b':
				valid&=(checkOptarg(optarg));
				*b=string_to_int(optarg);
				break;
			case't':
				tracefileName=(char*)malloc(sizeof(optarg));
				strcpy(tracefileName,optarg);
				break;
			case'v':*isVerbose=1;break;
			case'h':printfHelpMenu();break;
			default:valid=0;printfHelpMenu();break;
		}
		
	}
	return valid;
}

5.检查输入 参数的合法性:检查数字参数


int checkOptarg(char* curOptarg){
	int l=strlen(curOptarg),i;
	for(i=0;i<l;i++)
		if(curOptarg[i]<'0'||curOptarg[i]>'9'){
			printf("Error:invalid argument: %s\n",curOptarg);return 0;
		}
	return 1;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hnu哈哈

请接受直女的么么哒????

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值