操作系统实验三页面置换算法实验报告材料Word文档下载推荐.docx
《操作系统实验三页面置换算法实验报告材料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验三页面置换算法实验报告材料Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
//输入数据的函数
voidDataOutput();
//输出数据的函数
voidFIFO();
//FIFO函数
voidOptimal();
//Optimal函数
voidLRU();
//LRU函数
intmain(intargc,char*argv[])
{
DataInput();
intmenu;
while(true)
{
printf("
\n*菜单选择*\n"
);
*******************************************************\n"
*1-Optimal*\n"
*2-FIFO*\n"
*3-LRU*\n"
*4-返回上一级*\n"
*0-EXIT*\n"
printf("
scanf("
%d"
&
menu);
switch(menu)
{
case1:
Optimal();
break;
case2:
FIFO();
case3:
LRU();
case0:
exit(0);
case4:
system("
cls"
DataInput();
}
if(menu!
=1&
&
menu!
=2&
=3&
=0&
=4){
system("
\n请输入0-4之间的整数!
\n"
continue;
}
return0;
}
voidDataInput()
inti,choice;
printf("
请输入最小物理块数:
"
scanf("
M);
//输入最小物理块数大于数据个数
while(M>
BlockNum)
物理块数超过预定值,请重新输入:
请输入页面的个数:
N);
//输入页面的个数大于数据个数
while(N>
DataMax)
页面个数超过预定值,请重新输入:
请选择产生页面访问序列的方式(1.随机2.输入):
choice);
switch(choice)
case1:
//产生随机访问序列
for(i=0;
i<
N;
i++)
{
Data[i]=(int)(((float)rand()/32767)*10);
//随机数大小在0-9之间
system("
//显示随机产生的访问序列
\n随机产生的访问序列为:
%d"
Data[i]);
break;
case2:
//输入访问序列
请输入页面访问序列:
scanf("
Data[i]);
//显示输入的访问序列
\n输入的访问序列为:
default:
while(choice!
choice!
=2)
请输入1或2选择相应方式:
voidDataOutput()
inti,j;
//对所有数据操作
for(i=0;
for(j=0;
j<
M;
j++)
//对所有数据操作
if(DataShowEnable[j][i])
printf("
DataShow[j][i]);
else
"
缺页次数:
%d\n"
ChangeTimes);
缺页率:
%d%%\n"
ChangeTimes*100/N);
//最佳置换算法
voidOptimal()
inti,j,k;
boolfind;
intpoint;
inttemp;
//临时变量,比较离的最远的时候用
intm=1,n;
ChangeTimes=0;
for(i=0;
DataShowEnable[j][i]=false;
//初始化为false,表示没有要显示的数据
count[i]=0;
//初始化计数器
//确定当前页面是否在物理块中,在继续,不在置换
///////////////////////////////////////////////////////////////////////////////////
Block[0]=Data[0];
for(i=1;
m<
intflag=1;
for(n=0;
n<
m;
n++)
if(Data[i]==Block[n])flag=0;
if(flag==0)continue;
Block[m]=Data[i];
m++;
//////////////////////////////////////////////////////////////////////////////////
//对所有数据进行操作
for(i=0;
//表示块中有没有该数据
find=false;
for(j=0;
if(Block[j]==Data[i])
{
find=true;
}
if(find)continue;
//块中有该数据,判断下一个数据
//块中没有该数据,最优算法
ChangeTimes++;
//缺页次数++
//找到下一个值的位置
find=false;
for(k=i;
k<
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;
if(temp<
count[j])
temp=count[j];
point=j;
//获得离的最远的指针
elsepoint=i;
//替换
Block[point]=Data[i];
//保存要显示的数据
DataShow[j][i]=Block[j];
DataShowEnable[i<
M?
(j<
=i?
j:
i):
j][i]=true;
//设置显示数据
//输出信息
\nOptimal=>
\n"
DataOutput();
//先进先出置换算法
voidFIFO()
//临时变量
}
count[i]=0;
//大于等于BlockNum,表示块中没有数据,或需被替换掉
//所以经这样初始化(321),每次替换>
=3的块,替换后计数值置1,
//同时其它的块计数值加1,成了(132),见下面先进先出程序段
//对有所数据操作
//增加count
count[j]++;
//表示块中有没有该数据
//块中有该数据,判断下一个数据
//块中没有该数据
ChangeTimes++;
//缺页次数++
//因为i是从0开始记,而M指的是个数,从1开始,所以i+1
count[j])
count[point]=0;
//更新计数值
\nFIFO=>
//最近最久未使用置换算法
voidLRU()
count[j]=0;
//块中没有该数据
for(j=0;
j<
M;
(j<
\nLRU=>
实验结果截图:
程序运行:
输入相应数据:
选择相应算法:
最佳置换算法:
先进先出算法:
最近最久未使用算法: