计算机系统结构课程实验报告2016——2017学年第1学期学院:信息工程学院专业:计算机科学与技术学号:姓名:实验:存贮层次模拟器2学时:2学时实验类型:(综合/设计):设计一、实验目的与要求使学生清楚认识虚拟存贮层次结构,熟练掌握常用的几种存储地址映象与变换方法,以及FIFO、LRU等替换算法的工作全过程。要求用程序实现任意地址流在存储层次上的命中情况,实验结束后提交源程序和实验说明书。二、实验内容在模拟器上实现在任意地址流下求出在主存—辅存两层存贮层次上的命中率。三、实验步骤1.主存—辅存:映像方式采用组相联,替换算法分别选择FIFO、LRU两种算法实现。2.要求主存容量、页大小以及组数等可以输入修改。3.求出命中率;显示替换的全过程;任选一种高级语言来做。4.要设计简洁、易于操作的界面。四、实验仪器设备计算机(装有常用编程环境,如C、VC++等)五、实验代码#includestdio.h#includeconio.htypedefstructcache{intb,c;}cache;intfind(intk,intb,cache*a)//从cache中找到相应的地址,然后在cache中的位置{inti=0;while(ik&&b!=a[i].b)i++;returni;}intfull(intk,cache*a)//寻找空的cache块,并返回它在cache中的地址{inti=0;while(a[i].b!=-1&&ik)i++;returni;}intchange(intk,cache*a){inti,j=0,b=-2;for(i=0;ik;i++){if(a[i].cb){b=a[i].c;j=i;}}returnj;}voidGROUPF(){intflows[50],i,j=0,k,f,l,e,length,g,gb;//k表示地址流的大小,length表示cache的块数,g表示块内组数,l表示cache的长度floath=0;structcacheblocks[20],blocksl[20];inta[10][20];charm[20];printf(请输入Cache块数:);scanf(%d,&length);printf(请输入组数:);scanf(%d,&g);l=length/g;printf(请输入地址流中包含地址的个数:);scanf(%d,&k);printf(请输入地址流:);for(i=0;ik;i++)scanf(%d,&flows[i]);for(i=0;ilength;i++){blocks[i].b=-1;blocks[i].c=1;}while(jk){gb=((flows[j]/l)%g)*l;//flows[j]/l表示选中的块数,(flows[j]/l)%g表示选中的块内的组数,gb用来表示映射在cache中的地址for(i=0;il;i++){blocksl[i]=blocks[gb+i];}f=find(l,flows[j],blocksl);if(f=l)//未命中{f=full(l,blocksl);if(f=l)//满{f=change(l,blocksl);blocksl[f].b=flows[j];m[j]='t';for(i=0;il;i++)blocksl[i].c=blocksl[i].c+1;blocksl[f].c=1;}else{blocksl[f].b=flows[j];m[j]='d';for(i=0;if;i++)blocksl[i].c++;blocksl[f].c=1;}}else//有命中{e=full(l,blocksl);if(e=l){for(i=0;il;i++)blocksl[i].c=blocksl[i].c+1;}else{for(i=0;i=e;i++)blocksl[i].c=blocksl[i].c+1;}m[j]='H';h=h+1;}for(i=0;il;i++){blocks[gb+i]=blocksl[i];}for(i=0;ilength;i++){a[i][j]=blocks[i].b;}j++;}h=h/k;printf(命中率H=%.2f,h);printf(\n\t);for(i=0;ik;i++)printf(|----);printf(|\n地址流:);for(i=0;ik;i++)printf(|%-3d,flows[i]);printf(|\n\t);for(i=0;ilength;i++){for(j=0;jk;j++)printf(|----);printf(|\n\t);for(j=0;jk;j++){if(a[i][j]!=-1)printf(|%-3d,a[i][j]);elseprintf(|);}printf(|\n\t);}for(i=0;ik;i++)printf(|----);printf(|\n);printf(过程:);for(i=0;ik;i++){j=i-1;if(m[i]=='H')printf(|命中,m[i]);elseif(m[i]=='t')printf(|替换);elseprintf(|调入);}printf(|\n);printf(\t);for(i=0;ik;i++)printf(|----);printf(|\n);}voidGROUPL(){intflows[50],i,j=0,k,f,l,e,length,g,gb;floath=0;structcacheblocks[20],blocksl[20];inta[10][20];charm[20];printf(请输入Cache块数:);scanf(%d,&length);printf(请输入组数:);scanf(%d,&g);l=length/g;printf(请输入地址流中包含地址的个数:);scanf(%d,&k);printf(请输入地址流:);for(i=0;ik;i++)scanf(%d,&flows[i]);for(i=0;ilength;i++){blocks[i].b=-1;blocks[i].c=1;}while(jk){gb=((flows[j]/l)%g)*l;for(i=0;il;i++){blocksl[i]=blocks[gb+i];}f=find(l,flows[j],blocksl);if(f=l)//没有{f=full(l,blocksl);if(f=l)//满{f=change(l,blocksl);blocksl[f].b=flows[j];m[j]='t';for(i=0;il;i++)blocksl[i].c=blocksl[i].c+1;blocksl[f].c=1;}else{blocksl[f].b=flows[j];m[j]='d';for(i=0;if;i++)blocksl[i].c++;blocksl[f].c=1;}}else//有{e=full(l,blocksl);if(e=l){for(i=0;il;i++)blocksl[i].c=blocksl[i].c+1;blocksl[f].c=1;}else{for(i=0;i=e;i++)blocksl[i].c=blocksl[i].c+1;blocksl[f].c=1;}m[j]='H';h=h+1;}for(i=0;il;i++){blocks[gb+i]=blocksl[i];}for(i=0;ilength;i++){a[i][j]=blocks[i].b;}j++;}h=h/k;printf(H=%.2f,h);printf(\n\t);for(i=0;ik;i++)printf(|----);printf(|\n地址流:);for(i=0;ik;i++)printf(|%-3d,flows[i]);printf(|\n\t);for(i=0;ilength;i++){for(j=0;jk;j++)printf(|----);printf(|\n\t);for(j=0;jk;j++){if(a[i][j]!=-1)printf(|%-3d,a[i][j]);elseprintf(|);}printf(|\n\t);}for(i=0;ik;i++)printf(|----);printf(|\n);printf(命中?:\t);for(i=0;ik;i++){if(m[i]=='H')printf(|命中,m[i]);elseif(m[i]=='t')printf(|替换);elseprintf(|调入);}printf(|\n);printf(\t);for(i=0;ik;i++)printf(|----);printf(|\n);}voidmain(){charchose;printf(主存--辅存替换模拟器(映像方式采用组相联)\n);printf(\n请选择替换算法(F(f)代表FIFO替换算法,L(l)代表LRU替换算法):);chose=getchar();switch(chose){case'l':GROUPL();break;case'L':GROUPL();break;case'F':GROUPF();break;case'f':GROUPF();break;}}六、运行结果七、实验总结通过这几次上机实验,对书本上的知识又进行了巩固,能够清楚认识虚拟存贮层次结构,熟练掌握了常用的几种存储地址映像与变换方法,并且掌握了FIFO、LRU等替换算法的工作全过程。