计算机系统结构实验报告册实验一:存贮层次模拟器【实验目的】使学生清楚认识虚拟存贮层次结构,熟练掌握常用的几种存储地址映象与变换方法,以及FIFO、LRU等替换算法的工作全过程。要求用程序实现任意地址流在存储层次上的命中情况,实验结束后提交源程序和实验说明书。【实验内容】在模拟器上实现在任意地址流下求出在cache—主存—辅存三层存贮层次上的命中率。【实验仪器设备】计算机(装有常用编程环境,如C、VC++等)【实验步骤】1.Cache—主存:映像方式可以选择全相联、直接映象、组相联方式;替换算法一般使用LRU算法。2.要求Cache大小、主存容量、块大小以及组数等可以输入修改。3.求出命中率;显示替换的全过程;任选一种高级语言来做。4.要有简洁、易于操作的界面。【实验仪器设备】计算机(装有常用编程环境,如C、VC++等)【源程序】#includestdio.h#includeiostream.h#includestdlib.hstructCacheStruct{intblocknum;intcount;};voidAll_LinkLRU(CacheStructcs[],intbottom,intstream[],intk,intresult[20][20]){intj=0,m=0,max=0,location=0,hitnum=0;coutendl;//cout主存访问块流是否替换是否命中Cache块存放情况endl;for(inti=0;ik;i++){if(jbottom)//Cache块不满{m=0;if(j==0){cs[j].blocknum=stream[i];cs[j].count=0;result[j][i]=stream[i];//result[bottom][i]=0;//result[bottom+1][i]=0;不需要/*coutstream[i]\t\t;cout块失效\t\t;cout未命中\t\t;for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/j++;//continue;}else{while(mj&&cs[m].blocknum!=stream[i]){cs[m].count++;m++;}if(m==j)//已存在的未命中{cs[j].blocknum=stream[i];cs[j].count=0;result[j][i]=stream[i];//result[bottom][i]=0;//result[bottom+1][i]=0;不需要/*coutstream[i]\t\t;cout块失效\t\t;cout未命中\t\t;for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/j++;//continue;}else//已存在的命中了{cs[m].count=0;m++;result[bottom+1][i]=0;/*coutstream[i]\t\t;cout无替换\t\t;cout命中\t\t;for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/if(m!=j){while(mj){cs[m].count++;m++;}}hitnum++;//continue;}}}else//Cache块满了{m=0;max=0;location=0;while(mbottom&&cs[m].blocknum!=stream[i]){cs[m].count++;if(cs[m].countmax){location=m;max=cs[m].count;}m++;}if(m==bottom)//未命中,所有块计数器都已加1,{result[bottom][i]=cs[location].blocknum;/*coutstream[i]\t\t;cout替换块cs[location].blocknum\t\t;cout未命中\t\t;*/cs[location].blocknum=stream[i];cs[location].count=0;result[location][i]=stream[i];/*for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/}else//命中,{result[bottom+1][i]=0;/*coutstream[i]\t\t;cout无替换\t\t;cout命中\t\t;*/cs[m].count=0;m++;if(m!=bottom){while(m!=bottom){cs[m].count++;m++;}}/*for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/hitnum++;}}if(ik-1){for(intr=0;rbottom;r++)result[r][i+1]=result[r][i];}}cout块地址流;for(intt=0;tk;t++)coutstream[t]\t;coutendl\t;for(t=0;t(bottom+2);t++){coutendl\t;for(ints=0;sk;s++){if(tbottom){if(result[t][s]==-1)cout空\t;elsecoutresult[t][s]\t;}elseif(t==bottom){if(result[t][s]!=-1)//块替换cout替换块result[t][s]\t;else{if(result[t+1][s]!=-1)//块命中cout无替换\t;elsecout块失效\t;}}else{if(result[t][s]!=-1)//命中cout命中\t;elsecout未命中\t;}}coutendl;}coutendl;if(hitnum!=0){cout采用全相联地址映射方式访问Cache的命中率为:hitnum'/'kendl;}else{cout采用全相联地址映射方式访问Cache的命中率为:0endl;}}voidDirect_link(CacheStructcs[],intbottom,intstream[],intk,intresult[20][20]){//cout主存访问块流是否替换是否命中Cache块存放情况endl;intlocation=-1,hitnum=0,m=0;for(inti=0;ik;i++){location=stream[i]%bottom;if(cs[location].blocknum!=-1)//若产生冲突{if(cs[location].blocknum==stream[i])//若命中{result[bottom+1][i]=0;/*coutstream[i]\t\t;cout无替换\t\t;cout命中\t\t;for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/hitnum++;//continue;}else{result[bottom][i]=cs[location].blocknum;/*coutstream[i]\t\t;cout替换块cs[location].blocknum\t\t;cout未命中\t\t;*/cs[location].blocknum=stream[i];result[location][i]=stream[i];//cs[location].count=0;/*for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/}}else//不产生冲突,仅是页面失效{cs[location].blocknum=stream[i];result[location][i]=stream[i];/*coutstream[i]\t\t;cout块失效\t\t;cout未命中\t\t;for(intt=0;tbottom;t++){if(cs[t].blocknum!=-1)coutcs[t].blocknum'';elsecout空;}coutendl;*/}if(ik-1){for(intr=0;rbottom;r++)result[r][i+1]=result[r][i];}}cout块地址流;for(intt=0;tk;t++)coutstream[t]\t;coutendl\t;for(t=0;t(bottom+2);t++){coutendl\t;for(ints=0;sk;s++){if(tbottom){if(result[t][s]==-1)cout空\t;elsecoutresult[t][s]\t;}elseif(t==bottom){if(result[t][s]!=-1)//块替换cout替换块result[t][s]\t;else{if(result[t+1][s]!=-1)//块命中cout无替换\t;elsecout块失效\t;}}else{if(result[t][s]!=-1)//命中cout命中\t;elsecout未命中\t;}}coutendl;}coutendl;if(hitnum!=0){cout采用直接地址映射方式访问Cache的命中率为:hitnum'/'kendl;}else{cout采用直接地址映射方式访问Cache的命中率为:0endl;}}voidGroup_link(CacheStructcs[],intbottom,intstream[],intk,intGblock,intresult[20][20]){//cout主存访问块流是否替换是否命中Cache块存放情况endl;intCgroupnum=bottom/Gblock,Mgroupnum=0,location=-1;intstart=-1,end=-1,max=0,m=-1,find=0,hitnum=0;for(inti=0;ik;i++){Mgroupnum=stream[i]/Gblock;location=Mgroupnum%Cgroupnum;start=location*Gblock;end=start+Gblock-1;location=-1;find=0;m=-1;max=0;//以下实现组内全相联for(intj=start;j=end;j++){if(find==0&&cs[j].blocknum==-1){location=j;fin