操作系统实验三页面置换算法实验报告.docx

上传人:b****7 文档编号:11012116 上传时间:2023-02-24 格式:DOCX 页数:20 大小:17.19KB
下载 相关 举报
操作系统实验三页面置换算法实验报告.docx_第1页
第1页 / 共20页
操作系统实验三页面置换算法实验报告.docx_第2页
第2页 / 共20页
操作系统实验三页面置换算法实验报告.docx_第3页
第3页 / 共20页
操作系统实验三页面置换算法实验报告.docx_第4页
第4页 / 共20页
操作系统实验三页面置换算法实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

操作系统实验三页面置换算法实验报告.docx

《操作系统实验三页面置换算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验三页面置换算法实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

操作系统实验三页面置换算法实验报告.docx

操作系统实验三页面置换算法实验报告

 

实验三实验报告

 

实验源码:

 

#include"stdio.h"

#include

#include

 

#defineDataMax100

//

常量DataMax

#defineBlockNum10

//

常量BlockNum

intDataShow[BlockNum][DataMax];

//

用于储蓄要显示的数组

boolDataShowEnable[BlockNum][DataMax];

//

用于储蓄数组中的数据能否需要显示

intData[DataMax];

//

保存数据

intBlock[BlockNum];

//

物理块

intcount[BlockNum];

//

计数器

intN;

//

页面个数

intM;

//

最小物理块数

intChangeTimes;

//

缺页次数

voidDataInput();

//

输入数据的函数

voidDataOutput();

//

输出数据的函数

voidFIFO();

//FIFO函数

voidOptimal();

//Optimal

函数

voidLRU();

//LRU函数

intmain(intargc,char*argv[])

{

DataInput();

intmenu;

while(true)

{

printf("\n*

菜单项选择择

*\n");

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

printf("*

1-Optimal

*\n");

printf("*

2-FIFO

*\n");

printf("*

3-LRU

*\n");

printf("*

4-返回上一级

*\n");

printf("*

0-EXIT

*\n");

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

scanf("%d",&menu);

 

switch(menu)

{

case1:

Optimal();

break;

case2:

FIFO();

break;

case3:

LRU();

break;

case0:

exit(0);

break;

case4:

system("cls");

DataInput();

break;

 

}

if(menu!

=1&&menu!

=2&&menu!

=3&&menu!

=0&&menu!

=4){system("cls");

printf("\n请输入0-4之间的整数!

\n");

continue;

}

}

return0;

}

 

voidDataInput()

{

inti,choice;

printf("请输入最小物理块数:

");

scanf("%d",&M);

//输入最小物理块数大于数据个数

while(M>BlockNum)

{

printf("物理块数超出预约值,请重新输入:

");

scanf("%d",&M);

}

 

printf("请输入页面的个数:

");

scanf("%d",&N);

//输入页面的个数大于数据个数

 

while(N>DataMax)

{

printf("页面个数超出预约值,请重新输入:

");

scanf("%d",&N);

}

printf("请选择产生页面接见序列的方式(1.随机2.输入):

");scanf("%d",&choice);

 

switch(choice)

{

case1:

//产生随机接见序列

for(i=0;i

{

Data[i]=(int)(((float)rand()/32767)*10);//随机数大小在

0-9之间

}

system("cls");

//显示随机产生的接见序列

printf("\n随机产生的接见序列为:

");

for(i=0;i

{

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

}

printf("\n");

break;

case2:

//输入接见序列

printf("请输入页面接见序列:

\n");

for(i=0;i

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

system("cls");

//显示输入的接见序列

printf("\n输入的接见序列为:

");

for(i=0;i

{

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

}

printf("\n");

break;

default:

while(choice!

=1&&choice!

=2)

{

printf("请输入1或2选择相应方式:

");

scanf("%d",&choice);

 

}

break;

}

}

 

voidDataOutput()

{

inti,j;

//对全部数据操作

for(i=0;i

{

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

}

printf("\n");

for(j=0;j

{

//对全部数据操作

for(i=0;i

{

if(DataShowEnable[j][i])

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

else

printf("");

}

printf("\n");

}

printf("缺页次数:

%d\n",ChangeTimes);

printf("缺页率:

%d%%\n",ChangeTimes*100/N);

}

 

//最正确置换算法

voidOptimal()

{

inti,j,k;

boolfind;

intpoint;

inttemp;//暂时变量,比较离的最远的时候用

intm=1,n;

 

ChangeTimes=0;

for(j=0;j

{

for(i=0;i

{

 

DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据

}

}

for(i=0;i

{

count[i]=0;//初始化计数器

}

//确立当前页面能否在物理块中,在连续,不在置换

///////////////////////////////////////////////////////////////////////////////////

Block[0]=Data[0];

 

for(i=1;m

{

intflag=1;

for(n=0;n

{

if(Data[i]==Block[n])flag=0;

}

if(flag==0)continue;

Block[m]=Data[i];

m++;

}

//////////////////////////////////////////////////////////////////////////////////

 

//对全部数据进行操作

for(i=0;i

{

//表示块中有没有该数据

find=false;

for(j=0;j

{

if(Block[j]==Data[i])

{

find=true;

}

}

if(find)continue;//块中有该数据,判断下一个数据

//块中没有该数据,最优算法

ChangeTimes++;//缺页次数++

for(j=0;j

{

//找到下一个值的地址

find=false;

for(k=i;k

 

{

if(Block[j]==Data[k])

{

find=true;

count[j]=k;

break;

}

}

if(!

find)count[j]=N;

}

//因为i是从0开始记,而BlockNum指的是个数,从1开始,因此i+1if((i+1)>M)

{

//获取要取代的块指针

temp=0;

for(j=0;j

{

if(temp

{

temp=count[j];

point=j;//获取离的最远的指针

}

}

}

elsepoint=i;

//取代

Block[point]=Data[i];

 

//保存要显示的数据

for(j=0;j

{

DataShow[j][i]=Block[j];

DataShowEnable[i

(j<=i?

j:

i):

j][i]=true;//设置显示数据

}

 

}

//输出信息

printf("\nOptimal=>\n");

DataOutput();

}

 

//先进先出置换算法

voidFIFO()

{

 

inti,j;

boolfind;

intpoint;

inttemp;//暂时变量

intm=1,n;

 

ChangeTimes=0;

for(j=0;j

{

for(i=0;i

{

DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据

}

}

for(i=0;i

{

count[i]=0;//大于等于BlockNum,表示块中没有数据,或需被取代掉

//

因此经这样初始化(

321),每次取代>=3的块,取代后计数值置

1,

//

同时其他的块计数值加

1,成了(132),见下边先进先出程序段

}

//确立当前页面能否在物理块中,在连续,不在置换

///////////////////////////////////////////////////////////////////////////////////

Block[0]=Data[0];

 

for(i=1;m

{

intflag=1;

for(n=0;n

{

if(Data[i]==Block[n])flag=0;

}

if(flag==0)continue;

Block[m]=Data[i];

m++;

}

//////////////////////////////////////////////////////////////////////////////////

 

//对有所数据操作

for(i=0;i

{

//增添countfor(j=0;j

{

count[j]++;

 

}

find=false;//表示块中有没有该数据

for(j=0;j

{

if(Block[j]==Data[i])

{

find=true;

}

}

//块中有该数据,判断下一个数据

if(find)continue;

//块中没有该数据

ChangeTimes++;//缺页次数++

//因为i是从0开始记,而M指的是个数,从

if((i+1)>M)

{

 

1开始,因此

 

i+1

//获取要取代的块指针

temp=0;

for(j=0;j

{

if(temp

{

temp=count[j];

point=j;//获取离的最远的指针

}

}

}

elsepoint=i;

//取代

Block[point]=Data[i];

 

count[point]=0;//更新计数值

 

//保存要显示的数据

for(j=0;j

{

DataShow[j][i]=Block[j];

DataShowEnable[i

(j<=i?

j:

i):

j][i]=true;//设置显示数据

}

}

//输出信息

printf("\nFIFO=>\n");

DataOutput();

}

 

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

voidLRU()

{

inti,j;

boolfind;

intpoint;

inttemp;//暂时变量

intm=1,n;

 

ChangeTimes=0;

for(j=0;j

{

for(i=0;i

{

DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据

}

}

for(i=0;i

{

count[i]=0;//初始化计数器

}

//确立当前页面能否在物理块中,在连续,不在置换

///////////////////////////////////////////////////////////////////////////////////

Block[0]=Data[0];

 

for(i=1;m

{

intflag=1;

for(n=0;n

{

if(Data[i]==Block[n])flag=0;

}

if(flag==0)continue;

Block[m]=Data[i];

m++;

}

//////////////////////////////////////////////////////////////////////////////////

 

//对有所数据操作

for(i=0;i

{

//增添countfor(j=0;j

 

{

count[j]++;

}

find=false;//表示块中有没有该数据

for(j=0;j

{

if(Block[j]==Data[i])

{

count[j]=0;

find=true;

}

}

//块中有该数据,判断下一个数据

if(find)continue;

//块中没有该数据

ChangeTimes++;

//因为i是从

0开始记,而

BlockNum

指的是个数,从

1开始,因此

i+1

if((i+1)>M)

{

//获取要取代的块指针

temp=0;

for(j=0;j

{

if(temp

{

temp=count[j];

point=j;//获取离的最远的指针

}

}

}

elsepoint=i;

//取代

Block[point]=Data[i];

count[point]=0;

 

//保存要显示的数据

for(j=0;j

{

DataShow[j][i]=Block[j];

DataShowEnable[i

(j<=i?

j:

i):

j][i]=true;//设置显示数据

}

 

}

//输出信息

 

printf("\nLRU=>\n");

DataOutput();

}

实验结果截图:

 

程序运转:

 

输入相应数据:

 

选择相应算法:

 

最正确置换算法:

 

先进先出算法:

 

近来最久未使用算法:

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

当前位置:首页 > 高等教育 > 历史学

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

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