模拟先进先出(FIFO)页面置换算法
#include <stdio.h>
#include <stdbool.h>
#define M 3 /*M 为系统分配给作业的主存页面数*/
#define N 20 /*N 为要装入作业的页面总数*/
bool found(int x,int a[M]) /*以下函数判断第 i 个页面是否在内存*/
{
for(int i=0; i<M; i++){
if(a[i] == x)
return true;
}
return false;
}
int main()
{
int i=0,j=0;
int a[M]; /*存放已装入内存的页号序列*/
int b[N]; /*存放作业页号序列*/
int c[N]; /*存放被淘汰的页号序列*/
int count; /*count 为缺页总次数*/
bool flag; /*flag 标识该页是否在内存*/
for(int i=0;i<M;i++){
a[i]=-1;
}
printf("请输入作业序号:\n");
for(int i=0; i<N; i++){
scanf("%d",&b[i]);
}
count=0;
while(i<20)
{
flag=found(b[i],a);
if(flag)
i++;
else{
count++;
if(a[M-1]!=-1){
c[j++]=a[0];
for(int h=0;h<M-1;h++)
a[h]=a[h+1];
a[M-1]=b[i];
i++;
}
else{
for(int h=0;h<M;h++){
if(a[h]==-1){
a[h]=b[i];
i++;
break;
}
}
}
}
}
printf("发生缺页的次数:%d\n",count);
printf("缺页中断率:%.2f%%\n",count*100.0/N);
printf("驻留内存的页号分别为:");
for(int i=M-1;i>=0;i--){
printf("%d ",a[i]);
}
printf("\n被淘汰的页号分别为:");
for(int i=0;i<j;i++){
printf("%d ",c[i]);
}
return 0;
}
测试用例:
/*7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1*/