#include <stdio.h>
#include <iostream.h>
struct clock //定义page页面号,flag标记
{
int page;
int flag;
};
int sum[4],input[100];//定义全局数组
void fifo(int n) //先进先出页面替换算法
{
int flog=0,sun=0;
int pagenum=0;
printf("\n您输入的页号是:");
for( int i=0;i<n;i++)
printf("%d",input[i]);
for(i=0;i<4;i++) //sum数组初值都为-1
sum[i]=-1;
printf("\n先进先出算法如下:\n\n\n");
printf("\n ##################################\n");
printf(" ### 先进先出算法 ###\n");
printf(" ##################################\n");
sum[0]=input[0]; //将第一个页面入列
pagenum=pagenum+1;
printf("页面:%d进入内存。\n已进入内存页面号:%d\n",sum[0],sum[0]);
for( i=1;i<n;i++) //进行页面替换
{
flog=0;
sun=0;
for(int j=0;j<4;j++)
if(input[i]==sum[j])
{
flog=1;
pagenum++;
}
if(flog==0) //页面中没有为0,
{
if(i>=4) //页面中没有,依次向后移一位
printf("替换页号:%d \n",sum[3]);
sum[3]=sum[2];
sum[2]=sum[1];
sum[1]=sum[0];
sum[0]=input[i];
printf("入页号:%d \n",input[i]);
}
else
printf("入页号:%d 该页号已有,不用替换!\n",input[i]); //页面中有,页面不动
for(j=0;j<4;j++) //输出页面
if(sum[j]!=-1)
sun++;
printf("已进入内存页面号:");
for(j=0;j<sun;j++)
printf("%d",sum[j]);
printf("\n");
}
cout<<"缺页率:"<<pagenum<<"/"<<n<<"="<<(float)pagenum/n<<endl;
}
void lru(int n) //最近最少用页面替换算法
{
int i,j,k,sun=0,pagenum=0; //定义循环变量
printf("您输入的页号是:");
for(i=0;i<n;i++)
printf("%d",input[i]);
for(i=0;i<4;i++)
sum[i]=-1;
printf("\n ########################################\n");
printf(" ### 最近最少用页面替换算法 ###\n");
printf(" ########################################\n");
sum[0]=input[0]; //第一页面入列
pagenum++;
printf("页面:%d进入内存。\n已进入内存页面号::%d\n",sum[0],sum[0]);
int flog;
for(i=1;i<n;i++)
{
flog=0;
for(j=0;j<4;j++)
if(input[i]==sum[j])
{
for(k=j;k>0;k--)
sum[k]=sum[k-1];
flog=1;
pagenum++;
sum[0]=input[i];
}
if(flog==0)
{
sum[3]=sum[2];
sum[2]=sum[1];
sum[1]=sum[0];
sum[0]=input[i];
printf("入页号:%d\n",input[i]);
}
else
printf("入页号:%d 已有,不用替换!\n",input[i]);
sun=0;
for(j=0;j<4;j++) //输出页面里
if(sum[j]!=-1)
sun++;
printf("已进入内存页面号:");
for(j=0;j<sun;j++)
printf("%d",sum[j]);
printf("\n");
}
cout<<"缺页率:"<<pagenum<<"/"<<n<<"="<<(float)pagenum/n<<endl;
}
void clock(int n) //时钟页面替换算法
{
int i=0,j=0,sun=0;
struct clock p[4];
for(j=0;j<4;j++)
{
p[j].page=-1;
p[j].flag=0;
}
int flag=0,flag1=0,pf=0;
printf("您输入的页面号是:");
for(i=0;i<n;i++)
printf("%d",input[i]);
printf("\n ######################################\n");
printf(" ### 时钟页面替换算法 ###\n");
printf(" ######################################\n");
p[pf].page=input[0];
p[pf].flag=1;
pf=pf+1;
printf("页面:%d 进入内存。\n",p[0].page);
printf("已进入内存页面号:%d\n",p[0].page);
for(i=1;i<n;i++)
{
flag=0;
flag1=0;
for(j=0;j<4;j++)
if(input[i]==p[j].page)
{
flag=1;
printf("入页号:%d 已有,不用替换!\n",input[i]);
}
if(flag==0)
for(j=0;j<4;j++)
if(p[pf].flag==0)
{
printf("页面:%d 进入内存!\n",input[i]);
if(p[pf].page!=-1)
printf("页面:%d 被替换!\n",p[pf].page);
p[pf].flag=1;
p[pf].page=input[i];
flag1=1;
if(pf<3)
pf++;
else
pf=0;
break;
}
else
p[pf].flag=0;
if(flag1==0&&flag==0)
{
printf("页面:%d 进入内存!\n",input[i]);
printf("页面:%d 被替换!\n",p[pf].page);
for(j=0;i<4;j++)
p[j].flag=0;
p[pf].page=input[i];
p[pf].flag=1;
if(pf<3)
pf++;
else
pf=0;
}
sun=0;
for(j=0;j<4;j++) //输出页面里
if(p[j].page!=-1)
sun++;
printf("已进入内存页面号:");
for(j=0;j<sun;j++)
printf("%d",p[j].page);
printf("\n");
}
}
void main() //主函数
{
printf("请输入页号个数:");
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("第%d个数:",i);
scanf("%d",&input[i]);
}
printf("您输入的页号是:");
for( i=0;i<n;i++)
{
printf("%d",input[i]);
}
do
{
printf("\n\n请选择您的操作\n");
printf("************************************************\n");
printf("* 1--FIFO * 2--LRU * 3--CLoCK * 0--EXIT *\n");
printf("************************************************\n");
scanf("%d",&i);
switch(i)
{
case 1:fifo(n);break;
case 2:lru(n);break;
case 3:clock(n);break;
default :cout<<"您的选择有误,请重新选择!"<<endl;
}
}while(i!=0);
printf("\n ^_^ 退出程序 ^_^ \n\n\n\n\n");
}