文档视界 最新最全的文档下载
当前位置:文档视界 › 计算机系统结构课程实验报告实验一:存贮层次模拟器

计算机系统结构课程实验报告实验一:存贮层次模拟器

计算机系统结构课程实验报告实验一:存贮层次模拟器计算机系统结构课程

实验报告

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等替换算法的工作全过程。通过这次实验,更加深了我对理论知识的掌握和运用。

相关文档
相关文档 最新文档