一、实验目的
1、了解虚拟存储技术的特点,掌握请求页式存储管理的主要页面置换算法原理。
2、掌握请求页式存储管理中页面置换算法的模拟设计方法。
3、通过随机产生页面访问序列开展有关算法的测试及性能比较。
二、实验内容
设计一个虚拟存储区和内存工作区,并使用下述方法计算访问命中率。
①先进先出的算法(FIFO);
②最近最少少使用算法(LRU);
③最佳淘汰算法(OPT):选淘汰最不常用的页地址;
④最少访问页面算法(LFR);
⑤最近最不经常使用算法(NUR).
(其中③④为选择内容)
命中率= 1 - 页面失效次数 / 页地址流长度
三、设计原理(或方案)及相关算法
1.fifo算法流程图
![](https://img-blog.csdnimg.cn/b5f87675241c43f69946f8d39bd46837.png)
2.Lru算法流程图
3.opt算法流程图
运行结果及分析:
分析:通过多次运行结果发现,OPT算法淘汰页面最少,命中率始终最高,FIFO算法和LRU算法命中率差不多,但是淘汰页面大有不同。
源程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 320//随机数列的长度
#define B 4//内存的页面数
int IsInBuf(int buf[],int x)//返回某个数X有没有在缓冲区buf[]中
{
int i,j=-1;
for(i=0;i<B;i++)
{
if(buf[i]==x)
{
j=i;
break;
}else if(buf[i]==-1)
{
buf[i]=x;
j=i;
break;
}
}
return j;
}
int oldest(int list[],int buf[],int f[],int start)//返回最近最久未使用的页面的位置
{
int i,j;
for(i=0;i<B;i++)
{
for(j=start;j<N;j++)
{
if(buf[i]==list[j])break;
}
f[i]=j;
}
return oldest2(f);
}
int oldest2(int f[])//返回最长时间不使用的页面的位置
{
int i,j=0,max=-1;
for(i=0;i<B;i++)
{
if(f[i]>max){max=f[i];j=i;}
f[i]++;
}
return j;
}
void main()
{
int list[N];
int buf[B],f[B],i,j,k,max,min;
int old=0;
int change=0;
printf("本程序假设内存为程序分配的内存块数是4!\n");
srand((int)time(NULL));//生成一系列随机数并初始化环境
for(i=0;i<B;i++)buf[i]=f[i]=-1;
printf("产生的随机数列为:\n");
for(i=0;i<N;i++)
{
list[i]=(int)rand()%10;//产生随机数列
printf("%2d",list[i]);
}
printf("\n");
printf("\nOPT淘汰页面的序列为:\n");
change=0;
for(i=0;i<B;i++)buf[i]=f[i]=-1;
for(i=0;i<N;i++)
{
j=IsInBuf(buf,list[i]);
if(j==-1)
{
old=oldest(list,buf,f,i);
printf("%2d",buf[old]);
buf[old]=list[i];
f[old]=0;
change++;
}
else
{
printf("");
}
}
printf("\nOPT算法的命中率为:%f\n",1-(float)change/320);
printf("\nFIFO淘汰页面的序列为:\n");
change=0;
for(i=0;i<B;i++)buf[i]=-1;
for(i=0;i<N;i++)
{
j=IsInBuf(buf,list[i]);
if(j==-1)
{
if(buf[old]==-1)printf("");
else printf("%2d",buf[old]);
buf[old]=list[i];
old=(old+1)%(int)B;
change++;
}
else
printf("");
}
printf("\nFIFO算法的命中率为:%f\n",1-(float)change/320);
printf("\nLRU淘汰页面的序列为:\n");
change=0;
for(i=0;i<B;i++)buf[i]=f[i]=-1;
for(i=0;i<N;i++)
{
j=IsInBuf(buf,list[i]);
old=oldest2(f);
if(j==-1)
{
printf("%2d",buf[old]);
buf[old]=list[i];
f[old]=0;
change++;
}
else
{
f[j]=0;
printf("");
}
}
printf("\nLRU算法的命中率为:%f\n",1-(float)change/320);
}
版权归原作者 Forge ahead# 所有, 如有侵权,请联系我们删除。