#include<stdio.h>
int n,nf;
int in[100];
int p[50];
int hit=0;
int i,j,k;
int pgfaultcnt=0;//页面错误计数
void getData()
{
printf("\n输入页面数:");
scanf("%d",&n);
printf("\n输入frame个数:");
scanf("%d",&nf);
printf("\n输入页面序列:");
for(i=0; i<n; i++)
scanf("%d",&in[i]);
}
void initialize()
{
pgfaultcnt=0;
for(i=0; i<nf; i++)
p[i]=9999;
}
int isHit(int data)
{
hit=0;
for(j=0; j<nf; j++)
{
if(p[j]==data)
{
hit=1;
break;
}
}
return hit;
}
int getHitIndex(int data)
{
int hitind;
for(k=0; k<nf; k++)
{
if(p[k]==data)
{
hitind=k;
break;
}
}
return hitind;
}
void dispPages()
{
for (k=0; k<nf; k++)
{
if(p[k]!=9999)
printf(" %d",p[k]);
}
}
void dispPgFaultCnt()
{
printf("\n页面错误总数:%d",pgfaultcnt);
printf("缺页率:%f\n",pgfaultcnt*1.00/n);
}
void fifo()//先进先出
{
initialize();
printf("FIFO:\n");
for(i=0; i<n; i++)
{
printf("\n%d :",in[i]);
if(isHit(in[i])==0)
{
for(k=0; k<nf-1; k++)
p[k]=p[k+1];
p[k]=in[i];
pgfaultcnt++;
dispPages();
}
else
printf("无缺页中断");
}
dispPgFaultCnt();
}
void optimal()//最佳置换
{
initialize();
int near[50];
printf("OPT:\n");
for(i=0; i<n; i++)
{
printf("\n%d :",in[i]);
if(isHit(in[i])==0)
{
for(j=0; j<nf; j++)
{
int pg=p[j];
int found=0;
for(k=i; k<n; k++)
{
if(pg==in[k])
{
near[j]=k;
found=1;
break;
}
else
found=0;
}
if(!found)
near[j]=9999;
}
int max=-9999;
int repindex;
for(j=0; j<nf; j++)
{
if(near[j]>max)
{
max=near[j];
repindex=j;
}
}
p[repindex]=in[i];
pgfaultcnt++;
dispPages();
}
else
printf("无缺页中断");
}
dispPgFaultCnt();
}
void lru()//最近最久未用
{
initialize();
int least[50];
printf("LRU:\n");
for(i=0; i<n; i++)
{
printf("\n%d :",in[i]);
if(isHit(in[i])==0)
{
for(j=0; j<nf; j++)
{
int pg=p[j];
int found=0;
for(k=i-1; k>=0; k--)
{
if(pg==in[k])
{
least[j]=k;
found=1;
break;
}
else
found=0;
}
if(!found)
least[j]=-9999;
}
int min=9999;
int repindex;
for(j=0; j<nf; j++)
{
if(least[j]<min)
{
min=least[j];
repindex=j;
}
}
p[repindex]=in[i];
pgfaultcnt++;
dispPages();
}
else
printf("无缺页中断");
}
dispPgFaultCnt();
}
int main()
{
int choice;
printf("\n页面置换算法\n");
getData();
while(1)
{
printf("\n选择算法:\nf:FIFO\no:OPT\nl:LRU\n其他:exit\n请输入:\n");
char s[2];
char c;
scanf("%1s",s);
c=s[0];
if(c=='f')
fifo();
else if(c=='o')
optimal();
else if(c=='l')
lru();
else
break;
}
return 0;
}
操作系统页面置换算法
最新推荐文章于 2023-11-16 17:23:19 发布