操作系统页面调度算法Word文件下载.docx
《操作系统页面调度算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统页面调度算法Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
五、实验操作过程及实验结果记录
此算法的思想是按照作业到来的顺序进行处理,以下是源代码,代码已经调试,可上机运行。
#include<
stdio.h>
#defineM4/*m为系统分配给作业的主存中的页面数*/
#defineN9
intcount=0;
intm=0;
intBef_ArrFull(inta[M],intb[N],intc[N])//a中未满之前的处理
{
intk;
printf("
发生缺页的面号分别为:
"
);
%d"
b[0]);
for(intn=0;
n<
M;
n++)a[n]=0;
//初始化
a[0]=b[0];
count++;
intj,ii=0;
for(j=1;
j<
N;
j++)
{intf=0;
for(k=0;
k<
=ii;
k++)
{
if(b[j]==a[k]){f=1;
break;
}//包含在中间找到,在末尾找到
}
if(!
f)//未找到值发生中断
{
printf("
b[j]);
//打印缺页的页号
count++;
a[++ii]=b[j];
}
if(ii==3)break;
//内存中的页面数已满
}
returnj;
}
voidAfter_ArrFull(inta[M],intb[N],intc[N],intj)//a中页面数满了之后的处理
inti,flag;
intk;
for(i=j+1;
i<
i++)
flag=0;
for(k=0;
if(a[k]==b[i])
flag=1;
if(flag==0)
c[m]=a[0];
m++;
for(k=0;
M-1;
k++)a[k]=a[k+1];
a[M-1]=b[i];
count++;
printf("
%3d,"
b[i]);
}
voidmain()
inta[M];
/*定义内存页面数*/
intb[N];
/*定义总页面数*/
intc[N];
/*定义被淘汰的页面号*/
inti;
intn;
请输入作业序号:
\n"
for(i=0;
i++)/*输入作业依次要访问的页号*/
scanf("
%d"
&
b[i]);
n=Bef_ArrFull(a,b,c);
After_ArrFull(a,b,c,n);
//a中页面数满了之后的处理
\n发生缺页的次数=%d\n"
count);
\n缺页中断率=%.2f%%%\n"
(float)count/N*100);
\n驻留内存的页号分别为:
a[i]);
\n被淘汰的页号分别为:
m;
c[i]);
测试:
请输入作业序号(9个作业):
222345678
23456,7,8,
发生缺页的次数=7
缺页中断率=77.78%
驻留内存的页号分别为:
5,6,7,8,
被淘汰的页号分别为:
2,3,4,Pressanykeytocontinue
343456789
34567,8,9,
6,7,8,9,
3,4,5,Pressanykeytocontinue
2、LRU算法:
此算法的思想是为每一个页面分配一个使用频度falg,用以表明该页号的使用频度,在发生缺页中断时,利用循环来遍历数组a的每个页面的使用频度,找到最小的频度所对应的页面号,并把他的下标值和标号分别存入结构体min的Ye_Hao和falg中。
以下是详细的实现过程,代码已经调试,可直接运行。
#defineM4/*m为在主存中的页面数*/
structye
intYe_Hao;
intfalg;
//ID,标识使用的频度
};
structyemin;
//内存中使用频度最低的页面
//内存页面数未满之前
intBfor_ArryFull(structyeb[N],structyea[M],intc[N])
请输入作业序号(9个页面并用空格隔开):
i++)scanf("
b[i].Ye_Hao);
a[0].Ye_Hao=b[0].Ye_Hao;
a[0].falg=0;
b[0].falg=0;
b[0].Ye_Hao);
intii=0;
intk,j;
{intflag=0;
if(b[j].Ye_Hao==a[k].Ye_Hao){flag=1;
}//包含在中间找到,在末尾找到
flag)//未找到值发生中断
b[j].Ye_Hao);
//打印缺页的页号
a[++ii].Ye_Hao=b[j].Ye_Hao;
a[ii].falg=count;
b[j].falg=count;
//内存中的页面数已满
//j表示内存页面数满之后,下一个是第几个进入内存
//内存页面数已满之后
voidAfter_ArryFull(structyeb[N],structyea[M],intj,intc[N])
inttemp=0;
for(intp=j+1;
p<
p++)
{
for(i=0;
++i)
if(b[p].Ye_Hao==a[i].Ye_Hao)
{
a[i].falg=b[p-1].falg+1;
b[p].falg=a[i].falg;
break;
}
if(i==4)//内存中不存在,发生缺页中断
b[p].Ye_Hao);
min.falg=a[0].falg;
min.Ye_Hao=0;
//存储最近最久未使用的下标号
for(intn=1;
n++)//找到最不经常使用
if(a[n].falg<
min.falg)
{
min.falg=a[n].falg;
min.Ye_Hao=n;
}
c[temp++]=a[min.Ye_Hao].Ye_Hao;
a[min.Ye_Hao].Ye_Hao=b[p].Ye_Hao;
a[min.Ye_Hao].falg=b[p-1].falg+1;
b[p].falg=a[min.Ye_Hao].falg;
}
structyea[M];
//定义内存页面数
structyeb[N];
//页面序列
//定义被淘汰的页面号
intj,i;
j=Bfor_ArryFull(b,a,c);
//for(k=0;
k++)printf("
a[k].Ye_Hao);
After_ArryFull(b,a,j,c);
%d,"
a[i].Ye_Hao);
count-M;
}
测试:
①输入123234567↙
理论上分析可知在a满时,a数组中的元素应为1,2,3,4发生4次中断,在所有作业请求都进入时,驻留在a中的页面应为5,6,7,4,被淘汰的页面号应为1,2,3,图示可以证明这一点。
②输入2,3,2,3,4,5,3,6,7↙
理论分析可知发生的中断页号应为2,3,4,5,6,7,一共发生6次中断
驻留的内存页号分别为:
6,3,7,5。
被淘汰的页号为2,4.下面的实验结果证明了这点
六、实验结论(可写个人体会,或相关理论知识)
通过本次实验,我对页面置换的过程了解的更加清楚。
最近最久未使用算法的详细实现过程更清晰
六、实验过程中所遇问题思考与讨论(根据个人具体情况选做)
(以后的实验报告可参考本模板)