FIFO 先进先出
1.当页块中没有页号时,轮流替换;当不缺页时,指针位置在此处,不变。
OPI 最佳置换算法
将页面中距离下次出现最久的页面替换掉
LRU 最久未使用
将页面中距离上次出现最久的页面替换掉
#include <stdio.h>
#include <stdlib.h>
#define N 10
int page[N];
int mc[3]= {-1,-1,-1};
int i,j,z;
int flag=0;
int temp=0;//指向
int count=0;
int maxcount=0;
int has_page=0;//缺页数
//测试数据
//1 3 1 5 6 1 4 2 4 5 6 5 3 2 4 5 1 6 2 4 2
//6 0 1 2 0 3 0 4 2 3
int main()
{
int choice;
printf("Please input a choiceber:\n1.---FIFO---\n2.---LRU---\n3.---OPI---\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("1.---FIFO---\n");
break;
}
case 2:
{
printf("2.---LRU---\n");
break;
}
case 3:
{
printf("3.---OPI---\n");
break;
}
}
//common Part
//初始打印
printf("Input pages...\n");
for(i=0; i<N; i++)
scanf("%d",&page[i]);
for(i=0; i<N; i++)
{
//pages
printf("\n");
for(z=0; z<N; z++)
printf("-%d-",page[z]);
printf("\n\n---------------PAGE[%d]=%d---------------",i,page[i]);
for(j=0; j<3; j++)
{
// 不缺页
if(page[i]==mc[j])
{
flag=1;
has_page++;
printf("\n\t\t* * * *\n\t\t hold \n\t\t* * * *\n") ;
break;
}
}
if(choice==1)
{
//---FIFO---
if(flag!=1)
{
printf("\n\t\t# # # #\n\t\t missing \n\t\t# # # #\n");
mc[temp] =page[i];
temp++;
}
//temp初始化
if((temp+1)%4==0)
{
temp=0;
}
}
if(choice==2||choice==3)
{
if(flag!=1)
{
printf("\n\t\t# # # #\n\t\t missing \n\t\t# # # #");
//mc[point] =page[i];
for(j=0; j<3; j++)
{
if(mc[j]==-1)
{
temp=j;
break;
}
else
{
if(choice==2)
{
for(z=i; z>=0; z--)
{
if(mc[j]==page[z])
{
z=-1;
}
else if(mc[j]!=page[z])
{
count++;
}
if(count>maxcount)
{
maxcount=count; //将最久未使用的,在页块中做标记
//temp=mc[j];
temp=j; //记录最久未使用页块位置
}
}
}
if(choice==3)
{
for(z=i; z<N; z++)
{
if(mc[j]==page[z])
{
z=N;
}
else if(mc[j]!=page[z])
{
count++;
}
if(count>maxcount)
{
maxcount=count; //将最久未使用的,在页块中做标记
//temp=mc[j];
temp=j; //记录最久未使用页块位置
}
}
}
count=0; //计数归零,即将进入下一循环
}
//即将进入下一个页块,进行审核
}
mc[temp]=page[i]; //将最久未使用的页块替换掉
maxcount=0; //计数最大值归零
//point++;
}
}
//显示mc[i] ;
for(j=0; j<3; j++)
{
printf("\nmc[%d]=",j);
printf("%d",mc[j]);
}
flag=0;
printf("\n\n");
}
//计算缺页率
printf("Page fault rate:\n%f\n",((N-has_page)*1.0/N));
return 0;
}