页面置换算法模拟OPTFIFO及LRU算法.docx

上传人:b****5 文档编号:5715918 上传时间:2022-12-31 格式:DOCX 页数:23 大小:16.84KB
下载 相关 举报
页面置换算法模拟OPTFIFO及LRU算法.docx_第1页
第1页 / 共23页
页面置换算法模拟OPTFIFO及LRU算法.docx_第2页
第2页 / 共23页
页面置换算法模拟OPTFIFO及LRU算法.docx_第3页
第3页 / 共23页
页面置换算法模拟OPTFIFO及LRU算法.docx_第4页
第4页 / 共23页
页面置换算法模拟OPTFIFO及LRU算法.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

页面置换算法模拟OPTFIFO及LRU算法.docx

《页面置换算法模拟OPTFIFO及LRU算法.docx》由会员分享,可在线阅读,更多相关《页面置换算法模拟OPTFIFO及LRU算法.docx(23页珍藏版)》请在冰豆网上搜索。

页面置换算法模拟OPTFIFO及LRU算法.docx

页面置换算法模拟OPTFIFO及LRU算法

 

操作系统实验报告

 

页面置换算法模拟

——OFT、FIFO和LRU算法

 

班级:

2013级软件工程1班

学号:

XXX

姓名:

萧氏一郎

适用标准文案

 

数据构造说明:

Memery[10]物理块中的页码

Page[100]页面号引用串

Temp[100][10]协助数组

Voidprint(unsignedintt)协助函数

 

ViodFIFO()先进先出页面置换算法

ViodLRU()近来最久未使用置换换算法

 

ViodOPT()最正确置换算法

 

流程图:

 

开始

 

载入序列号,从第0个获得页号

 

将页号放入物理地点中编

 

NO

引用编号大于物理块数

 

Yes

 

号存在物理块中

 

Yes

 

NO

依据选择的置换算法达成

 

NO

页号序列载完?

 

Yes

 

结束

 

出色文档

适用标准文案

 

源代码:

#include

 

#include

 

/*全局变量*/

 

intmSIZE;/*物理块数*/

 

intpSIZE;/*页面号引用串个数*/

 

staticintmemery[10]={0};/*物理块中的页号*/

 

staticintpage[100]={0};/*页面号引用串*/

 

staticinttemp[100][10]={0};/*协助数组*/

 

/*置换算法函数*/

 

voidFIFO();

 

voidLRU();

 

voidOPT();

 

/*协助函数*/

 

voidprint(unsignedintt);

 

voiddesignBy();

 

voiddownload();

 

voidmDelay(unsignedintDelay);

 

/*主函数*/

 

voidmain()

 

{

 

inti,k,code;

 

出色文档

适用标准文案

 

printf("请输入物理块的个数(M<=10):

");

 

scanf("%d",&mSIZE);

 

printf("请输入页面号引用串的个数(P<=100):

");

 

scanf("%d",&pSIZE);

 

puts("请挨次输入页面号引用串(连续输入,无需分开):

");

 

for(i=0;i

 

scanf("%1d",&page[i]);

 

download();

 

do{

 

puts("输入的页面号引用串为:

");

 

for(k=0;k<=(pSIZE-1)/20;k++)

 

{

 

for(i=20*k;(i

 

{

 

if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

 

printf("%d\n",page[i]);

 

else

 

printf("%d",page[i]);

 

}

 

}

 

printf("***********************\n");

 

printf("*请选择页面置换算法:

\t\t\t*\n");

 

出色文档

适用标准文案

 

printf("*-----------------------------------------

 

*\n");

 

printf("*1.先进先出(FIFO)2.近来最久未使用(LRU)

 

*\n");

 

printf("*3.最正确(OPT)4.退出

 

*\n");

 

printf("***********************\n");

 

printf("请选择操作:

[]\b\b");

 

scanf("%d",&code);

 

switch(code)

 

{

 

case1:

 

FIFO();

 

break;

 

case2:

 

LRU();

 

break;

 

case3:

 

OPT();

 

break;

 

case4:

 

system("cls");

 

出色文档

适用标准文案

 

//system("color0A");

 

exit(0);

 

default:

 

printf("输入错误,请从头输入:

");

 

}

 

printf("按随意键从头选择置换算法:

>>>");

 

getch();

 

}while(code!

=4);

 

getch();

 

}

 

/*载入数据*/

 

voiddownload()

 

{

 

printf("\nFinish.\n载入成功!

");

 

}

 

/*设置延缓*/

 

voidmDelay(unsignedintDelay)

 

{

 

unsignedinti;

 

for(;Delay>0;Delay--)

 

{

 

for(i=0;i<124;i++)

 

出色文档

适用标准文案

 

{

 

printf("\b");

 

}

 

}

 

}

 

/*显示设计者信息*/

 

voidprint(unsignedintt)

 

{

 

inti,j,k,l;

 

intflag;

 

for(k=0;k<=(pSIZE-1)/20;k++)

 

{

 

for(i=20*k;(i

 

{

 

if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))

 

printf("%d\n",page[i]);

 

else

 

printf("%d",page[i]);

 

}

 

for(j=0;j

 

{

 

for(i=20*k;(i

 

出色文档

适用标准文案

 

{

 

if(i>=j)

 

printf("|%d|",temp[i][j]);

 

else

 

printf("||");

 

}

 

for(i=mSIZE+20*k;(i

 

{

 

for(flag=0,l=0;l

 

if(temp[i][l]==temp[i-1][l])

 

flag++;

 

if(flag==mSIZE)/*页面在物理块中*/

 

printf("");

 

else

 

printf("|%d|",temp[i][j]);

 

}

 

/*每行显示20个*/

 

if(i%20==0)

 

continue;

 

printf("\n");

 

}

 

}

 

出色文档

适用标准文案

 

printf("----------------------------------------\n");

 

printf("缺页次数:

%d\t\t",t+mSIZE);

 

printf("缺页率:

%d/%d\n",t+mSIZE,pSIZE);

 

printf("置换次数:

%d\t\t",t);

 

printf("接见命中率:

%d%%\n",(pSIZE-(t+mSIZE))*100/pSIZE);

 

printf("----------------------------------------\n");

 

}

 

/*计算过程延缓*/

 

voidcompute()

 

{

 

inti;

 

printf("正在进行有关计算,请稍候");

 

for(i=0;i++<30;printf("\b"));

 

for(i=0;i++<30;printf(""));

 

for(i=0;i++<30;printf("\b"));

 

}

 

/*先进先出页面置换算法*/

 

voidFIFO()

 

{

 

intmemery[10]={0};

 

inttime[10]={0};/*记录进入物理块的时间*/

 

inti,j,k,m;

 

出色文档

适用标准文案

 

intmax=0;/*记录换出页*/

 

intcount=0;/*记录置换次数*/

 

/*前mSIZE个数直接放入*/

 

for(i=0;i

 

{

 

memery[i]=page[i];

 

time[i]=i;

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

for(i=mSIZE;i

 

{

 

/*判断新页面号能否在物理块中*/

 

for(j=0,k=0;j

 

{

 

if(memery[j]!

=page[i])

 

k++;

 

}

 

if(k==mSIZE)/*假如不在物理块中*/

 

{

 

count++;

 

/*计算换出页*/

 

出色文档

适用标准文案

 

max=time[0]

0:

1;

 

for(m=2;m

 

if(time[m]

 

max=m;

 

memery[max]=page[i];

 

time[max]=i;/*记录该页进入物理块的时间*/

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

else

 

{

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

}

 

compute();

 

print(count);

 

}

 

/*近来最久未使用置换算法*/

 

voidLRU()

 

{

 

intmemery[10]={0};

 

出色文档

适用标准文案

 

intflag[10]={0};/*记录页面的接见时间*/

 

inti,j,k,m;

 

intmax=0;/*记录换出页*/

 

intcount=0;/*记录置换次数*/

 

/*前mSIZE个数直接放入*/

 

for(i=0;i

 

{

 

memery[i]=page[i];

 

flag[i]=i;

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

for(i=mSIZE;i

 

{

 

/*判断新页面号能否在物理块中*/

 

for(j=0,k=0;j

 

{

 

if(memery[j]!

=page[i])

 

k++;

 

else

 

flag[j]=i;/*刷新该页的接见时间*/

 

}

 

出色文档

适用标准文案

 

if(k==mSIZE)/*假如不在物理块中*/

 

{

 

count++;

 

/*计算换出页*/

 

max=flag[0]

0:

1;

 

for(m=2;m

 

if(flag[m]

 

max=m;

 

memery[max]=page[i];

 

flag[max]=i;/*记录该页的接见时间*/

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

else

 

{

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

}

 

compute();

 

print(count);

 

}

 

出色文档

适用标准文案

 

/*最正确置换算法*/

 

voidOPT()

 

{

 

intmemery[10]={0};

 

intnext[10]={0};/*记录下一次接见时间*/

 

inti,j,k,l,m;

 

intmax;/*记录换出页*/

 

intcount=0;/*记录置换次数*/

 

/*前mSIZE个数直接放入*/

 

for(i=0;i

 

{

 

memery[i]=page[i];

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

for(i=mSIZE;i

 

{

 

/*判断新页面号能否在物理块中*/

 

for(j=0,k=0;j

 

{

 

if(memery[j]!

=page[i])

 

k++;

 

出色文档

适用标准文案

 

}

 

if(k==mSIZE)/*假如不在物理块中*/

 

{

 

count++;

 

/*获得物理快中各页下一次接见时间*/

 

for(m=0;m

 

{

 

for(l=i+1;l

 

if(memery[m]==page[l])

 

break;

 

next[m]=l;

 

}

 

/*计算换出页*/

 

max=next[0]>=next[1]?

0:

1;

 

for(m=2;m

 

if(next[m]>next[max])

 

max=m;

 

/*下一次接见时间都为pSIZE,则置换物理块中第一个*/

 

memery[max]=page[i];

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

出色文档

适用标准文案

 

else{

 

for(j=0;j

 

temp[i][j]=memery[j];

 

}

 

}

 

compute();

 

print(count);

 

}

 

出色文档

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

当前位置:首页 > 医药卫生 > 基础医学

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

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