!
计算机系统结构课程实验报告实验一:存贮层次模拟器计算机系统结构课程
实验报告
2012—2013 学年
第 1 学期
学生姓名: 学生班级: 2011179 学生学号: 2011179 指导教师: 孙全红教研室: 计算机系统结构教研室
2012年 10月 23日
实验一:存贮层次模拟器
·
一、实验目的与要求
使学生清楚认识虚拟存贮层次结构,熟练掌握常用的几种存储地址映象与变换方法,以及FIFO、LRU等替换算法的工作全过程。
要求用程序实现任意地址流在存储层次上的命中情况,实验结束后提交源程序和实验说明书。
二、实验内容
在模拟器上实现在任意地址流下求出在cache —主存—辅存三层存贮层次上的命中率。三、实验步骤
1(Cache—主存:映像方式可以选择全相联、直接映象、组相联方式;替换算法一般使用LRU
算法。
2(要求Cache大小、主存容量、块大小以及组数等可以输入修改。
、
3(求出命中率;显示替换的全过程;任选一种高级语言来做。
4(要有简洁、易于操作的界面。
四、程序源代码
# include <>
# include <>
# include <>
struct CacheStruct
{
*
int blocknum;
int count;
};
void All_LinkLRU(CacheStruct cs[],int bottom,int stream[],int k,int result[20][20])
{
int j=0,m=0,max=0,location=0,hitnum=0;
cout< locknum=stream[i]; 。 cs[j].count=0; result[j][i]=stream[i]; locknum!=-1) cout< else cout<<"空 "; } cout< > j++; locknum!=stream[i]) { cs[m].count++; m++; } if(m==j)locknum=stream[i]; cs[j].count=0; — result[j][i]=stream[i]; locknum!=-1) cout< cout<<"空 "; } cout< j++; … ount=0; m++; result[bottom+1][i]=0; /*cout< cout<<"命中\t\t"; for(int t=0;t ~ if(cs[t].blocknum!=-1) cout< cout<<"空 "; } cout< if(m!=j) { 《 while(m { cs[m].count++; m++; } } hitnum++; locknum!=stream[i]) 、 { cs[m].count++; if(cs[m].count>max) { location=m; max=cs[m].count; } m++; · } if(m==bottom)locknum; /*cout< cout<<"替换块"< cs[location].blocknum=stream[i]; cs[location].count=0; result[location][i]=stream[i]; ? /* for(int t=0;t { if(cs[t].blocknum!=-1) cout< else cout<<"空 "; } cout< ~ } elseount=0; m++; if(m!=bottom) { while(m!=bottom) { cs[m].count++; 】 m++; } } /*for(int t=0;t if(cs[t].blocknum!=-1) cout< ~ cout<<"空 "; } cout< hitnum++; } } if(i { | for(int r=0;r } cout<<"块地址流 "; for(int t=0;t cout< cout< ) for(t=0;t<(bottom+2);t++) { cout< for(int s=0;s { if(t { if(result[t][s]==-1) ~ cout<<"空\t"; else cout< } else if(t==bottom) { if(result[t][s]!=-1)locknum!=-1)locknum==stream[i])locknum!=-1) cout< 】 else cout<<"空 "; } cout< hitnum++; locknum; /* cout< cout<<"替换块"< 》 cout<<"未命中\t\t"; */ cs[location].blocknum=stream[i]; result[location][i]=stream[i]; ount=0; /*for(int t=0;t if(cs[t].blocknum!=-1) ` cout< cout<<"空 "; } cout< } } elselocknum=stream[i]; : result[location][i]=stream[i]; /* cout< cout<<"未命中\t\t"; for(int t=0;t { if(cs[t].blocknum!=-1) cout< ` else cout<<"空 "; } cout< } if(i { for(int r=0;r … result[r][i+1]=result[r][i]; } } cout<<"块地址流 "; for(int t=0;t cout< cout< for(t=0;t<(bottom+2);t++) | { cout< for(int s=0;s { if(t { if(result[t][s]==-1) cout<<"空\t"; : else cout< } else if(t==bottom) { if(result[t][s]!=-1)locknum==-1) { location=j;find=1; 》 } if(cs[j].blocknum!=-1) cs[j].count++; if(cs[j].count>max) { max=cs[j].count; m=j; } [ if(cs[j].blocknum==stream[i]) break; } if(j<=end)ount=0; if(j { j++; while(j<=end) … { if(cs[j].blocknum!=-1) cs[j].count++; j++; } } /* for(int t=0;t / if(cs[t].blocknum!=-1) cout< cout<<"空 "; } cout< hitnum++; } ; elselocknum=stream[i]; cs[location].count=0; /*for(int t=0;t { if(cs[t].blocknum!=-1) cout< else cout<<"空 "; … } cout< } elselocknum; /* cout< cout<<"替换块"< cs[m].blocknum=stream[i]; 、 cs[m].count=0; result[m][i]=stream[i]; /* for(int t=0;t { if(cs[t].blocknum!=-1) cout< else cout<<"空 "; 《 } cout< } } if(i { for(int r=0;r } } cout<<"块地址流 "; for(int t=0;t cout< cout< for(t=0;t<(bottom+2);t++) { ( cout< for(int s=0;s { if(t { if(result[t][s]==-1) cout<<"空\t"; else ; cout< } else if(t==bottom) { if(result[t][s]!=-1)locknum=-1; cs[i].count=0; } cout<<"请依次输入主存空间大小(MB),Cache空间大小(KB),分块大小(KB):"; 。 cin>>Mvolumn>>Cvolumn>>Blockvolumn; /* 问题改进:1.界面输入输出方式 2.容量之间的关系 3. */ while((Mvolumn*1024)%Blockvolumn!=0 || Cvolumn%Blockvolumn!=0) { % cout<<"主存空间大小与Cache空间大小应是块大小的整数倍~"; cout<<"请依次输入主存空间大小(MB),Cache空间大小(KB),分块大小(KB):"; cin>>Mvolumn>>Cvolumn>>Blockvolumn; } Mblocknum=(Mvolumn*1024)/Blockvolumn; Cblocknum=Cvolumn/Blockvolumn; cout<<"请输入CPU访问主存块流:(-1结束输入)"; cin>>t; 、 while(t!=-1) { if(t<0 || t>=Mblocknum) { /* cout<<"输入的主存块地址号有误~请重新输入:"; cin>>t; while(t<0 || t>=Mblocknum ||t==-1) { & if(t==-1) break; else { cout<<"输入的主存块地址号有误~请重新输入:"; cin>>t; } } > if(t!=-1) { stream[k]=t; k++; cin>>t; } */ cout<<"已跳过输入错误的无效的块地址~"; & cin>>t; } else { stream[k]=t; k++; cin>>t; } } 相联 2.直接映射 3.组相联)"; cin>>type; switch(type) { case 1:All_LinkLRU(cs,Cblocknum,stream,k,result);break; case 2:Direct_link(cs,Cblocknum,stream,k,result);break; case 3:{ cout<<"请输入主存分组数:"; cin>>groupnum; while(Mblocknum%groupnum!=0 || Cblocknum%(Mblocknum/groupnum)!=0)//输入的组数不能被整除 { cout<<"输入主存分组数有误~请依据主存与Cache分块数确定合适的分组数:"; cin>>groupnum; } Group_link(cs,Cblocknum,stream,k,Mblocknum/groupnum,result); } } cout<<"还要继续输入块地址流吗,(Y or N)"; cin>>ch; } // All_LinkLRU(cs,Cblocknum,stream,k); //Direct_link(cs,Cblocknum,stream,k); /* cout<<"请输入主存分组数:"; cin>>groupnum; Group_link(cs,Cblocknum,stream,k,Mblocknum/groupnum); } 四、实验截图 采用全相联映射方式: 采用组相联映射方式: 采用直接相联映射方式: 五、实验总结 通过上机操作,我掌握了常用的几种存储地址映象与变换方法即全相联映象方式,直接映象方式和组相联映象方式,并且认识了虚拟存贮层次结构,而且了解了FIFO、LRU等替换算法的工作全过程。通过这次实验,更加深了我对理论知识的掌握和运用。