22222设计一个程序,有一个虚拟存储区和内存工作区,实现下述三种算法中的任意两种,计算访问命中率(命中率=1-页面失效次数/页地址流长度)。附加要求:能够显示页面置换过程。算法包括:先进先出的算法(FIFO)、最少使用算法(LFU)、最近未使用算法(NUR)

 第二部分

 

 

 

/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/
int GetMax(Page *b)
{
int i;
int max=-1;
int tag=0;
for(i=0;i<bsize;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
/*判断页面是否已在内存中*/
int Equation(int fold,Page *b)
{
int i;
for(i=0;i<bsize;i++)
{
if (fold==b[i].num)
return i;
}
return -1;
}
/*LRU核心部分*/
void Lruu(int fold,Page *b)
{
int i;
int val;
val=Equation(fold,b);
if (val>=0)
{
b[val].time=0;
for(i=0;i<bsize;i++)
if (i!=val)
b[i].time++;
}
else
{
queue[++K]=fold;/*记录调入页面*/
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<bsize;i++)
if (i!=val)
b[i].time++;
}
}
void LRU()
{
int i,j;
K=-1;
Init(b, c);
for(i=0;i<psize;i++)
{
Lruu(pro[i],b);
c[0][i]=pro[i];
/*记录当前的内存单元中的页面*/
for(j=0;j<bsize;j++)
c[j][i]=b[j].num;
}
/*结果输出*/
printf("内存状态为:\n");
for(j=0;j<psize;j++)
printf("|%2d ",pro[j]);
printf("|\n");
for(i=0;i<bsize;i++)
{ for(j=0;j<psize;j++)
{
if(c[i][j]==-1)
printf("|%2c ",32);
else
printf("|%2d ",c[i][j]);
}
printf("|\n");
}
printf("\n调入队列为:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/psize);
}
//主函数
int main()
{
int sel ;
do{

printf(" \t1、产生随机序列 \n ");
printf(" \t2、最久未使用(LRU) \n ");
printf(" \t3、先进先出(FIFO) \n ");
printf(" \t4、二种算法的比较() \n ");
printf(" \t0、退出(Exit) \n ");
printf("请选择所要执行的操作(0/1/2/3/4):");
scanf("%d",&sel);
switch(sel)
{
case 0:printf("\t\t\t^-^再见!^-^ \t\t\t\n");system("pause");break;
case 1:build();break;
case 2:printf("最久未使用算\n");LRU();empty();printf("\n");break;
case 3:printf("先进先出算\n");FIFO();empty();printf("\n");break;
case 4:printf("先进先出算法\n");FIFO();empty();
printf("\t");
printf("最久未使用算法\n");LRU();
empty();break;
default: printf("请输入正确的选项号!");printf("\n\n");break;
}
}while(sel!=0);
return 0;

posted @ 2017-10-28 23:03  can丶  阅读(2771)  评论(0编辑  收藏  举报