页面置换算法的模拟实现及命中率对比实验报告.docx

上传人:b****6 文档编号:6742848 上传时间:2023-01-09 格式:DOCX 页数:14 大小:37.60KB
下载 相关 举报
页面置换算法的模拟实现及命中率对比实验报告.docx_第1页
第1页 / 共14页
页面置换算法的模拟实现及命中率对比实验报告.docx_第2页
第2页 / 共14页
页面置换算法的模拟实现及命中率对比实验报告.docx_第3页
第3页 / 共14页
页面置换算法的模拟实现及命中率对比实验报告.docx_第4页
第4页 / 共14页
页面置换算法的模拟实现及命中率对比实验报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

页面置换算法的模拟实现及命中率对比实验报告.docx

《页面置换算法的模拟实现及命中率对比实验报告.docx》由会员分享,可在线阅读,更多相关《页面置换算法的模拟实现及命中率对比实验报告.docx(14页珍藏版)》请在冰豆网上搜索。

页面置换算法的模拟实现及命中率对比实验报告.docx

页面置换算法的模拟实现及命中率对比实验报告

页面置换算法的模拟实现及命中率对比实验报告

一、问题描述

课程设计目的

(1)、通过请求页式管理方式中页面置换算法的模拟设计,了解虚拟存储

术的特点,掌握请求页式存储管理中的页面置换算法。

(2)、课程设计内容

模拟实现OPT(最佳置换)、FIFO和LRU算法,并计算命中率。

(3)、课程设计要求:

a)首先用随机数生成函数产生“指令”序列,然后将指令序列变换成相应的页地址流,再计算不同算法下的命中率。

b)通过随机数产生一个指令序列,共产生400条。

其中50%的指令是顺序执行的(灵位50%就是非顺序),且25%的指令分布在前半部分地址空间,25%的指令分布在后半部分地址空间。

c)将指令地址流变换成页地址流

d)循环运行,使用户内存容量从4到40,。

计算每个内存容量下不同页面置换算法的命中率。

二、概要设计

1.程序的数据结构:

#definetotal_instruction100/*指令流长*/

#defineM100/*实际页数*/

#defineN5//可用页面数

structPro

{

intnum,time;

};

inta[total_instruction];

intpage[N];

2.程序的主函数:

intmain()

{

Prop[total_instruction];

Pro*page=newPro[N];

charc;

intt=0,i;

floatn=0;

Input(p);

do{

for(i=0;i

{

page[i].num=-1;

page[i].time=2-i;

}

printf("系统产生的随机数为:

");

for(inte=0;e

cout<

cout<

i=0;

cout<<"f:

FIFO页面置换"<

cout<<"l:

LRU页面置换"<

cout<<"o:

OPT页面置换"<

cout<<"按其它键结束"<

cin>>c;

if(c=='f')//FIFO页面置换

{

n=0;

cout<<"页面置换情况:

"<

while(i

{

if(Search(p[i].num,page)>=0)

i++;//找到相同的页面

else

{

if(t==N)t=0;

else

{

n++;//

page[t].num=p[i].num;

print(page);

t++;

}

}

}

cout<<"缺页次数:

"<

"<<1-n/total_instruction<

}

if(c=='l')//LRU页面置换

{

n=0;

cout<<"页面置换情况:

"<

while(i

{

intk;

k=t=Search(p[i].num,page);

if(t>=0)

page[t].time=0;

else

{

n++;

t=Max(page);

page[t].num=p[i].num;

page[t].time=0;

}

for(intj=0;j

{

if(j!

=t)page[j].time++;

}

/*if(t==0){page[t+1].time++;page[t+2].time++;}

if(t==1){page[2].time++;page[0].time++;}

if(t==2){page[1].time++;page[0].time++;}*/

if(k==-1)print(page);

i++;

}

cout<<"缺页次数:

"<

"<<1-n/total_instruction<

}

if(c=='o')//OPT页面置换

{

n=0;

while(i

{

if(Search(p[i].num,page)>=0)i++;

else

{

if(page[N-1].num==-1)

{

for(intg=0;g

if(page[g].num==-1)

{

page[g].num=p[i].num;

i++;

n++;

print(page);

break;

}

}

else{

inttemp=-1,cn;

for(t=0;t

{

if(temp

{

temp=Compfu(page,i,t,p);

cn=t;

}

}

page[cn]=p[i];

n++;

print(page);

i++;

}

}

}

cout<<"缺页次数:

"<

"<<1-n/total_instruction<

}

}while(c=='f'||c=='l'||c=='o');

 

return0;

}

三、详细设计

程序代码如下:

#include

#include

#include

#include

usingnamespacestd;

#definetotal_instruction100/*指令流长*/

#defineM100/*实际页数*/

#defineN5//可用页面数

structPro

{

intnum,time;

};

inta[total_instruction];

intpage[N];

voidInput(Prop[total_instruction])

{

intm,i,m1,m2;

srand((unsignedint)time(NULL));

m=rand()%400;//

for(i=0;i

{

if(m<0||m>399)

{

printf("Wheni==%d,Error,m==%d\n",i,m);

exit(0);

}

a[i]=m;/*任选一指令访问点m*/

a[i+1]=a[i]+1;

a[i+2]=a[i]+2;/*顺序执行两条指令*/

intm1=rand()%m;/*执行前地址指令m1*/

a[i+3]=m1;

a[i+4]=m1+1;

a[i+5]=m1+2;/*顺序执行两条指令*/

//s=(158-a[i+5])*rand()/32767/32767/2+a[i+5]+2;

m2=rand()%(157-m1)+m1+3;

a[i+6]=m2;

if((m2+2)>159)

{

a[i+7]=m2+1;

i+=8;

}

else

{

a[i+7]=m2+1;

a[i+8]=m2+2;

i=i+9;

}

m=rand()%m2;

}

for(i=0;i

{

p[i].num=a[i]/10;

p[i].time=0;

}

}

voidprint(Pro*page1)//打印当前的页面

{

Pro*page=newPro[N];

page=page1;

for(inti=0;i

printf("%-4d",page[i].num);

//cout<

cout<

//free(page);

}

 

intSearch(inte,Pro*page1)

{

Pro*page=newPro[N];

page=page1;

for(inti=0;i

return-1;

}

intMax(Pro*page1)

{

Pro*page=newPro[N];

page=page1;

inte=page[0].time,i=0;

while(i

{

if(e

i++;

}

for(i=0;i

return-1;

}

intCompfu(Pro*page1,inti,intt,Prop[M])

{

Pro*page=newPro[N];

page=page1;

intcount=0;

for(intj=i;j

{

if(page[t].num==p[j].num)break;

elsecount++;

}

returncount;

}

intmain()

{

Prop[total_instruction];

Pro*page=newPro[N];

charc;

intt=0,i;

floatn=0;

Input(p);

do{

for(i=0;i

{

page[i].num=-1;

page[i].time=2-i;

}

printf("系统产生的随机数为:

");

for(inte=0;e

cout<

cout<

i=0;

cout<<"f:

FIFO页面置换"<

cout<<"l:

LRU页面置换"<

cout<<"o:

OPT页面置换"<

cout<<"按其它键结束"<

cin>>c;

if(c=='f')//FIFO页面置换

{

n=0;

cout<<"页面置换情况:

"<

while(i

{

if(Search(p[i].num,page)>=0)

i++;//找到相同的页面

else

{

if(t==N)t=0;

else

{

n++;//

page[t].num=p[i].num;

print(page);

t++;

}

}

}

cout<<"缺页次数:

"<

"<<1-n/total_instruction<

}

if(c=='l')//LRU页面置换

{

n=0;

cout<<"页面置换情况:

"<

while(i

{

intk;

k=t=Search(p[i].num,page);

if(t>=0)

page[t].time=0;

else

{

n++;

t=Max(page);

page[t].num=p[i].num;

page[t].time=0;

}

for(intj=0;j

{

if(j!

=t)page[j].time++;

}

/*if(t==0){page[t+1].time++;page[t+2].time++;}

if(t==1){page[2].time++;page[0].time++;}

if(t==2){page[1].time++;page[0].time++;}*/

if(k==-1)print(page);

i++;

}

cout<<"缺页次数:

"<

"<<1-n/total_instruction<

}

if(c=='o')//OPT页面置换

{

n=0;

while(i

{

if(Search(p[i].num,page)>=0)i++;

else

{

if(page[N-1].num==-1)

{

for(intg=0;g

if(page[g].num==-1)

{

page[g].num=p[i].num;

i++;

n++;

print(page);

break;

}

}

else{

inttemp=-1,cn;

for(t=0;t

{

if(temp

{

temp=Compfu(page,i,t,p);

cn=t;

}

}

page[cn]=p[i];

n++;

print(page);

i++;

}

}

}

cout<<"缺页次数:

"<

"<<1-n/total_instruction<

}

}while(c=='f'||c=='l'||c=='o');

return0;

}

 

四、调试与分析

程序的主界面:

这里测试用的数据是M=40,N=5,三种算法置换结果如以下的图:

FIFO算法:

LRU算法:

 

OPT算法:

多运行几次,产生不同的随机数组,查看对比结果。

在某一次实验中,可能FIFO算法的命中率比LRU

算法要高,但经过多组测试数据及总体的结果表明:

LRU的平均性能比FIFO

的平均性能好。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 简洁抽象

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1