操作系统页面调度算法.docx
《操作系统页面调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统页面调度算法.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统页面调度算法
实验报告参考格式
(实验一)
实验项目名称:
操作系统页面调度算法教师评分:
一、实验目的和要求
目的:
对操作系统中使用的页面调度算法进行设计。
要求:
对教材中所讲述的几种页面调度算法进行深入的分析,通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二、实验环境
1、PC兼容机
2、Windows2000/XP系统
三、实验内容
1、设计两个程序模拟实现一个作业在内存中执行的页面置换,并计算缺页中断次数。
3、编制两种页面置换算法:
1)FIFO页面置换算法;2)LRU页面置换算法
四、实验原理:
1、FIFO页面置换算法:
总是选择在内存中驻留时间最长的一页将其淘汰。
2、LRU页面置换算法:
选择最近一段时间内最长时间没有被访问过的页面予以淘汰。
五、实验操作过程及实验结果记录
1、FIFO页面置换算法:
此算法的思想是按照作业到来的顺序进行处理,以下是源代码,代码已经调试,可上机运行。
#include
#defineM4/*m为系统分配给作业的主存中的页面数*/
#defineN9
intcount=0;
intm=0;
intBef_ArrFull(inta[M],intb[N],intc[N])//a中未满之前的处理
{
intk;
printf("发生缺页的面号分别为:
");
printf("%d",b[0]);
for(intn=0;na[0]=b[0];
count++;
intj,ii=0;
for(j=1;j{intf=0;
for(k=0;k<=ii;k++)
{
if(b[j]==a[k]){f=1;break;}//包含在中间找到,在末尾找到
}
if(!
f)//未找到值发生中断
{
printf("%d",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{
flag=0;
for(k=0;kif(a[k]==b[i])
flag=1;
if(flag==0)
{
c[m]=a[0];
m++;
for(k=0;ka[M-1]=b[i];
count++;
printf("%3d,",b[i]);
}
}
}
voidmain()
{
inta[M];/*定义内存页面数*/
intb[N];/*定义总页面数*/
intc[N];/*定义被淘汰的页面号*/
inti;
intn;
printf("请输入作业序号:
\n");
for(i=0;iscanf("%d",&b[i]);
n=Bef_ArrFull(a,b,c);
After_ArrFull(a,b,c,n);//a中页面数满了之后的处理
printf("\n发生缺页的次数=%d\n",count);
printf("\n缺页中断率=%.2f%%%\n",(float)count/N*100);
printf("\n驻留内存的页号分别为:
");
for(i=0;iprintf("%3d,",a[i]);
printf("\n被淘汰的页号分别为:
");
for(i=0;iprintf("%3d,",c[i]);
}
测试:
请输入作业序号(9个作业):
222345678
发生缺页的面号分别为:
23456,7,8,
发生缺页的次数=7
缺页中断率=77.78%
驻留内存的页号分别为:
5,6,7,8,
被淘汰的页号分别为:
2,3,4,Pressanykeytocontinue
测试:
请输入作业序号(9个作业):
343456789
发生缺页的面号分别为:
34567,8,9,
发生缺页的次数=7
缺页中断率=77.78%
驻留内存的页号分别为:
6,7,8,9,
被淘汰的页号分别为:
3,4,5,Pressanykeytocontinue
2、LRU算法:
此算法的思想是为每一个页面分配一个使用频度falg,用以表明该页号的使用频度,在发生缺页中断时,利用循环来遍历数组a的每个页面的使用频度,找到最小的频度所对应的页面号,并把他的下标值和标号分别存入结构体min的Ye_Hao和falg中。
以下是详细的实现过程,代码已经调试,可直接运行。
#include
#defineM4/*m为在主存中的页面数*/
#defineN9
structye
{
intYe_Hao;
intfalg;//ID,标识使用的频度
};
intcount=0;
structyemin;//内存中使用频度最低的页面
//内存页面数未满之前
intBfor_ArryFull(structyeb[N],structyea[M],intc[N])
{
inti;
printf("请输入作业序号(9个页面并用空格隔开):
\n");
for(i=0;iprintf("发生缺页的面号分别为:
\n");
a[0].Ye_Hao=b[0].Ye_Hao;
a[0].falg=0;
b[0].falg=0;
printf("%d",b[0].Ye_Hao);
intii=0;
intk,j;
count++;
for(j=1;j{intflag=0;
for(k=0;k<=ii;k++)
{
if(b[j].Ye_Hao==a[k].Ye_Hao){flag=1;break;}//包含在中间找到,在末尾找到
}
if(!
flag)//未找到值发生中断
{
printf("%d",b[j].Ye_Hao);//打印缺页的页号
count++;
a[++ii].Ye_Hao=b[j].Ye_Hao;
a[ii].falg=count;
b[j].falg=count;
}
if(ii==3)break;//内存中的页面数已满
}
returnj;//j表示内存页面数满之后,下一个是第几个进入内存
}
//内存页面数已满之后
voidAfter_ArryFull(structyeb[N],structyea[M],intj,intc[N])
{
inti;
inttemp=0;
for(intp=j+1;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)//内存中不存在,发生缺页中断
{
printf("%d",b[p].Ye_Hao);
min.falg=a[0].falg;
min.Ye_Hao=0;//存储最近最久未使用的下标号
for(intn=1;n{
if(a[n].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;
count++;
}
}
}
voidmain()
{
structyea[M];//定义内存页面数
structyeb[N];//页面序列
intc[N];//定义被淘汰的页面号
intj,i;
j=Bfor_ArryFull(b,a,c);
//for(k=0;kAfter_ArryFull(b,a,j,c);
printf("\n发生缺页的次数=%d\n",count);
printf("\n缺页中断率=%.2f%%%\n",(float)count/N*100);
printf("\n驻留内存的页号分别为:
");
for(i=0;iprintf("%d,",a[i].Ye_Hao);
printf("\n被淘汰的页号分别为:
");
for(i=0;iprintf("%3d,",c[i]);
}
测试:
①输入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.下面的实验结果证明了这点
六、实验结论(可写个人体会,或相关理论知识)
通过本次实验,我对页面置换的过程了解的更加清楚。
最近最久未使用算法的详细实现过程更清晰
六、实验过程中所遇问题思考与讨论(根据个人具体情况选做)
(以后的实验报告可参考本模板)