操作系统实验三页面置换算法实验报告.docx
《操作系统实验三页面置换算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验三页面置换算法实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
![操作系统实验三页面置换算法实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/24/89a6f3d2-37a9-4eab-9ed1-0fa25bb0d8e2/89a6f3d2-37a9-4eab-9ed1-0fa25bb0d8e21.gif)
操作系统实验三页面置换算法实验报告
实验三实验报告
实验源码:
#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+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();
}
实验结果截图:
程序运转:
输入相应数据:
选择相应算法:
最正确置换算法:
先进先出算法:
近来最久未使用算法: