模拟最近最久未使用(LRU)页面置换算法
代码:
#include <stdio.h>
#define M 3 /*M 为系统分配给作业的主存页面数*/
#define N 20 /*N 为要装入作业的页面总数*/
int a[M]; /*存放已装入内存的页号序列*/
int b[N]; /*存放作业页号序列*/
int c[N]; /*存放被淘汰的页号序列*/
int LRU(int x,int a[M]) /*分别调入页面判断是否需要置换*/
{
for(int i=0;i<M;i++){
if(a[i] == x)
return i;
}
return -1;
}
int main()
{
int j=0,x;
int count = 0; /*count 为缺页总次数*/
for(int i=0;i<M;i++){
a[i]=-1;
}
printf("请输入作业序号:\n");
for(int i=0; i<N; i++){
scanf("%d",&b[i]);
}
for(int i=0; i<N; i++){
x=LRU(b[i],a);
if( x == -1){
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];
}
else{
for(int h=0;h<M;h++){
if(a[h]==-1){
a[h]=b[i];
break;
}
}
}
}
else{
for(int h = x;h<M-1;h++){
a[h]=a[h+1];
}
a[M-1] = b[i];
}
}
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*/