设计程序模拟FIFO和LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,并计算每种算法缺页次数和缺页率。
代码实现:
#include<stdio.h>
#define n 12
void FIFO()
{
int m;
printf("请输入物理块的数目:");
scanf("%d",&m);
int ym[n],i,j,q,mem[m]={0},table[m][n];
char flag,f[n];
printf("请输入页面访问序列\n");
for(i=0;i<n;i++)
scanf("%d",&ym[i]);
printf("\n");
for(i=0;i<n;i++) //查页表,看是否缺页
{
q=0;
while((ym[i]!=mem[q])&&(q!=m)) q++;
if(q==m) flag='*'; //缺页,则置标志flag为‘*’
else flag=' ';
if(flag=='*')
{
for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的
mem[j]=mem[j-1];
mem[0]=ym[i];
}
for(j=0;j<m;j++)
table[j][i]=mem[j];
f[i]=flag;
}
printf("输出结果为下表(0代表为空,*代表有缺页):\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%3d",table[i][j]);
printf("\n");
}
for(i=0;i<n;i++)
printf("%3c",f[i]);
}
void LUR()
{
int m;
printf("请输入物理块的数目:");
scanf("%d",&m);
int ym[n],i,j,q,mem[m]={0},table[m][n];
char flag,f[n];
printf("请输入页面访问序列\n");
for(i=0;i<n;i++)
scanf("%d",&ym[i]);
printf("\n");
for(i=0;i<n;i++) //查页表,看是否缺页
{
q=0;
while((ym[i]!=mem[q])&&(q!=m)) q++;
if(q==m) flag='*'; //缺页,则置标志flag为'*'
else flag=' ';
for(j=q;j>0;j--)
mem[j]=mem[j-1];
mem[0]=ym[i];
for(j=0;j<m;j++)
table[j][i]=mem[j];
f[i]=flag;
}
printf("输出结果为下表(0代表为空,*代表有缺页):\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%3d",table[i][j]);
printf("\n");
}
for(i=0;i<n;i++)
printf("%3c",f[i]);
}
int main()
{
int a;
printf("**********请选择调用的算法**********\n");
printf("1.FIFO\t\t2.LUR\n");
printf("************************************\n");
scanf("%d",&a);
if(a==1)
{
FIFO();
}
else
{
LUR();
}
return 0;
}
运行结果: