操作系统实验三页面置换算法实验报告.docx
《操作系统实验三页面置换算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验三页面置换算法实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
操作系统实验三页面置换算法实验报告
实验三实验报告
实验源码:
#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;iscanf("%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+1
if((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{
//增加count
for(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指的是个数,从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("\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{
//增加count
for(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();
}
实验结果截图:
程序运行:
输入相应数据:
选择相应算法:
最佳置换算法:
先进先出算法:
最近最久未使用算法: