计算机系统结构
实验报告
班级:xxxxxxxxxxxxxxxx
姓名:xxxxxx
学号:2xxxxxxxxxxxxxx
报告完成时间:20xxxxxxxx
计算机系统结构实验报告
第二篇:计算机系统结构实验报告册2
计算机系统结构实验报告册
姓名: 李亚飞
学号: 201017714
专业:计算机科学与技术
班级: 177
指导教师: 孙全红
华北水利水电学院信息系系统结构教研室
实验二 存贮层次模拟器
完成日期: 20##年10月17日
学时:2学时
【实验目的】
1、使学生清楚认识虚拟存贮层次结构,熟练掌握常用的几种存储地址映象与变换方法,以及FIFO、LRU等替换算法的工作全过程。
2、要求用程序实现任意地址流在存储层次上的命中情况,实验结束后提交源程序和实验说明书。
【实验内容】
在模拟器上实现在任意地址流下求出在主存—辅存两层存贮层次上的命中率。
【实验步骤】
1.主存—辅存:映像方式采用组相联,替换算法分别选择FIFO、LRU两种算法实现。
2.要求主存容量、页大小以及组数等可以输入修改。
3.求出命中率;显示替换的全过程;任选一种高级语言来做。
4.要有简洁、易于操作的界面。
【实验仪器设备】
计算机(装有常用编程环境,如C、VC++等)
【源程序、实验结果及分析、实验心得及体会】
#include <stdio.h>
#include <string.h>
typedef struct CMemory4
{
int gm;//组号
int bm;
};
CMemory4 mem4[50];
typedef struct CCach4
{
int gc;
int bc;
int cc;
int bs;
};
CCach4 cac4[50];
int a2[10][20],b2[10][20];
void inputmem2(int m_num,int group) //输入
{
int i,t=0,nn=0;
for(i=0;i<m_num;)
{
for(int j=0;j<group;j++)
{
if(i>=m_num)
{
break;
}
printf("第%d块",i);
scanf("%d",&nn);
mem4[i].bm=nn;
mem4[i].gm=nn%group;
i++;
}
}
}
void initcac2(int ilen,int group) //
{
int i=0,j=0;
for(i;i<group;i++)
{
for(j;j<ilen/group;j++)
{
//cac[j].gc=i;//
cac4[j].bc=-1;//
cac4[j].cc=0;
cac4[j].bs=j;
}
}
}
void change2(int x,int y,int cnum)
{
for(int i=0;i<cnum;i++)
{
cac4[i].cc+=1;
}
a2[y][x]=cac4[y].bc;
b2[y][x]=cac4[y].cc;
}
void fdl(int cnum)
{
int tmp;
tmp=cac4[0].bc;
for(int i=0;i<cnum;i++)
{
cac4[i].bc=cac4[i+1].bc;
}
cac4[cnum-1].bc=tmp;
}
float steadcac2(int tt,int c_num,int j,float h,int i,int g,int group)
{
float sc=h;
int fi=1,fj;//判断是否装满的标记
for (int jj=0;jj<c_num;jj++)//判断cache中是否装满
{
if(jj%group==g&&cac4[jj].bc==-1)
{
fi=0;//没有装满
fj=jj;
break;
} }
if(fi==0)// 未装满
{
cac4[fj].bc=tt;//装入Cache中
printf("块%d装入%d组%d块号\n",tt,g,cac4[fj].bs);
}
else //装满
{
int m=0;
for(m;m<c_num;m++)
{
if(tt==cac4[m].bc)
{
printf("块%d命中%d组%d块号\n",tt,g,cac4[m].bs);
sc=sc+1;//命中
break;
} }
if (m==c_num)
{
fdl(c_num);//FIFO替换,把进队较早的替换掉
cac4[0].bc=tt;
printf("块%d替换%d组%d块号\n",tt,g,cac4[m].bs);
} }
return sc;
}
bool compare2(int m_num,int c_num,int group)
{
float sc=0;
int sm=0,max,j=0,gm,gc,gt=0,tt,bm;
for(int i=0;i<m_num;i++)//内存单元
{
for(j=0;j<c_num; j++)
{
gm=mem4[i].gm;
gc=j%group;
bm=mem4[i].bm;
if(gm==gc)//检查组号相等
{
if(cac4[gt].bc==bm)
{sc=sc+1;//命中
printf("块%d命中%d组%d块号!\n",bm,gc,cac4[gt].bs);
}
else
{
if(j==0)
{
gt=0;
}
else
{
gt++;
}
sc=steadcac2(bm,c_num,gt,sc,i,gc,group);
}
sm++;
if(gt>=c_num/group)
{
gt=0; }
break;
}
}
}
printf("命中率:H=%.2f\n",sc/sm);
return 1;
}
void Flink()//
{
int m_num,c_num,group;
printf("请输入内存大小:");
scanf("%d",&m_num);
printf("请输入Cache大小:");
scanf("%d",&c_num);
printf("请输入组数:");
scanf("%d",&group);
inputmem2(m_num,group);
initcac2(c_num,group); //
compare2(m_num,c_num,group);
}
void main()
{
Flink();
}
实验心得:这个实验和上个实验原理差不多,参考了上个实验,现在也能做出来,就是不是很熟练,很多原理很是深奥,需要慢慢琢磨。