题目;
一个页面存储系统使用``FIFO,OPT和LRU页面替换算法,如果一个页面的走向为:2,3,2,1,5,2,4,5,3,2,5,2。当分配给该作业的物理页框块数为3时,试计算访问过程中发生的缺页中断次数和终端率。
代码
#include<stdio.h>
int ncc[3]={0,0,0};
int ncc0[3]={0,0,0}; //内存空间
int ncc1[3]={0,0,0}; //opt算法的内存页面在将来使用的次数
int ncc2[3]={0,0,0};
int nczx0[12]={2,3,2,1,5,2,4,5,3,2,5,2}; //页面走向
int nczx1[12]={2,3,2,1,5,2,4,5,3,2,5,2};
int nczx2[12]={2,3,2,1,5,2,4,5,3,2,5,2};
int bs0[3][12];
int bs1[3][12];
int bs2[3][12]; //表示出计算过程的数组
int zdcs0=0;
int zdcs1=0;
int zdcs2=0; //每个算法的中断次数
int zdl0=0,zdl1=0,zdl2=0; //中断率
void optsf(int x) //最佳置换方法算法,计算ncc数组中谁该被替换出来
{
int i,k;
int c=0;
int ncc1[3]={0,0,0}; //opt算法的内存页面在将来使用的次数
for( i=x+1; i<12 ; i++) //将当前内存中的页面与nczx中的i页面以后的页面作比较,计算第i次ncc中页面在未来出现的次数
{
if(nczx0[i]==ncc[0] && ncc1[0]<2)
{
ncc1[0]++;
c++;
}
if(nczx0[i]==ncc[1] && ncc1[1]<2)
{
ncc1[1]++;
c++;
}
if(nczx0[i]==ncc[2] && ncc1[2]<2)
{
ncc1[2]++;
c++;
}
if(c==2) break;
}
for(k=0;k<3;k++) //将未来出现最少次数的元素置零
if(ncc1[k]==0)
{
ncc[k]=0;
break;
}
}
void opt() //最佳置换
{
int i;
for(i=0; i<12; i++)
{
if( ncc[0]!=nczx0[i] && ncc[1]!=nczx0[i] && ncc[2]!=nczx0[i] ) //判断该改页面是否在内存中
{
zdcs0++; //当前页面不在内存,中断次数加1
if( ncc[0]==0 ) ncc[0]=nczx0[i]; //当内存中有空闲区域
else if( ncc[1]==0 ) ncc[1]=nczx0[i];
else if( ncc[2]==0 )ncc[2]=nczx0[i];
else //当内存中没有空闲区域就需要将未来最久不使用页面替换出来
{
optsf(i); //调用optsf函数计算下个未来最久不使用
if( ncc[0]==0 )
ncc[0]=nczx0[i]; //将未来最久不使用页面从内存中找出后用当前页面替换
if( ncc[1]==0 )
ncc[1]=nczx0[i];
if( ncc[2]==0 )
ncc[2]=nczx0[i];
}
}
bs0[0][i]=ncc[0];
bs0[1][i]=ncc[1];
bs0[2][i]=ncc[2];
}
zdl0=zdcs0*100/12; //计算页面中断率
int o,u;
for(o=0;o<3;o++)
{
for(u=0;u<12;u++)
printf("%d ",bs0[o][u]); //将页面置换过程表示出来
printf("\n");
}
}
void fifo() //先进先出置换算法
{
int a=0; //最早页面指针
int zzjc=nczx1[0];
int i,o,u,j;
for(i=0;i<12;i++)
{
if( ncc1[0]!=nczx1[i] && ncc1[1]!=nczx1[i] && ncc1[2]!=nczx1[i] ) //判断将要访问的页面是否内存中
{
zdcs1++; //该页面不在内存中发生一次页面中断
if(ncc1[0]==0) ncc1[0]=nczx1[i]; //如果内存中存在空内存,则直接插入
else if(ncc1[1]==0) ncc1[1]=nczx1[i];
else if(ncc1[2]==0) ncc1[2]=nczx1[i];
else //如果内存中无空内存,则用要存入的页面替换最早页面
{
if( ncc1[0]==zzjc ) ncc1[0]=nczx1[i];
if( ncc1[1]==zzjc ) ncc1[1]=nczx1[i];
if( ncc1[2]==zzjc ) ncc1[2]=nczx1[i]; //替换完成
a++;
if(nczx1[a]==nczx1[i]) //
{
for(j=a; j<i; j++)
{
if(nczx1[j]==nczx1[i])
a++;
}
}
if( nczx1[a]==ncc1[0] || nczx1[a]==ncc1[1] || nczx1[a]==ncc1[2])
zzjc=nczx1[a];
else
{
while(nczx1[a]!=ncc1[0] ||nczx1[a]!=ncc1[1] ||nczx1[a]!=ncc1[2])
{
zzjc=nczx1[a++];
}
}
}
}
bs1[0][i]=ncc1[0]; //将置换过程记录下来
bs1[1][i]=ncc1[1];
bs1[2][i]=ncc1[2];
}
zdl1=zdcs1*100/12;
for(o=0;o<3;o++)
{
for(u=0;u<12;u++)
printf("%d ",bs1[o][u]); //将页面置换过程表示出来
printf("\n");
}
}
void lru() //过去最久未使用算法,过去最久未被使用的页面就是距离被此页面调度最远的nczx数组元素
{
int i,o,u;
int a=0; //最久未使用页面指针
for(i=0; i<12; i++)
{
int zjwsyjc=nczx2[a]; //最久未使用的页面是nczx[a],默认nczx[0]
if( ncc2[0]!=nczx2[i] && ncc2[1]!=nczx2[i] && ncc2[2]!=nczx2[i] ) //将下一个元素放在在optsf中被置零的位置
{
zdcs2++; //该页面不在内存中发生一次页面中断
if(ncc2[0]==0) ncc2[0]=nczx2[i]; //内存中有空闲区
else if(ncc2[1]==0) ncc2[1]=nczx2[i];
else if (ncc2[2]==0) ncc2[2]=nczx2[i];
else //内存中不存在空闲区,用现在的页面替换过去最久未使用的页面
{
if(ncc2[0]==zjwsyjc) ncc2[0]=nczx2[i];
if(ncc2[1]==zjwsyjc) ncc2[1]=nczx2[i];
if(ncc2[2]==zjwsyjc) ncc2[2]=nczx2[i];
a++; //已用nczx[i]页面替换最久未使用页面后不再是最久未使用页面,需计算下个最久未使用页面
}
}
else //nczx[i]页面已经在内存中,已经被使用一次,不再是最久未使用的页面,计算新的最久未使用页面
{
a++;
}
bs2[0][i]=ncc2[0];
bs2[1][i]=ncc2[1];
bs2[2][i]=ncc2[2];
zdl2=100*zdcs2/12;
}
for(o=0;o<3;o++)
{
for(u=0;u<12;u++)
printf("%d ",bs2[o][u]); //将页面置换过程表示出来
printf("\n");
}
}
void print()
{
int i;
printf("页面走向为:");
for(i=0;i<12;i++)
{
printf("%d ",nczx0[i]);
}
printf("\n");
}
prin()
{
printf("中断次数为 ");
}
void main()
{
print();
opt();
prin();
printf("%d",zdcs0);
printf("次 ");
printf("最佳置换算法的中断率:");
printf("%d%c",zdl0,'%');
printf("\n");
print();
fifo();
prin();
printf("%d",zdcs1);
printf("次 ");
printf("先进先出置换算法的中断率:");
printf("%d%c",zdl1,'%');
printf("\n");
print();
lru();
prin();
printf("%d",zdcs2);
printf("次 ");
printf("最久未使用置换算法的中断率:");
printf("%d%c",zdl2,'%');
}
运行结果如下图: