#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int numbers[20]={7,0,1,
2,0,3,
0,4,2,
3,0,3,
2,1,2,
0,1,7,
0,1
};
int num=0;//输入栈的个数,为了方便使用
int stack[20][8]={-1};
void begin();
void randomnum();//用于产生随机数
void init();//初始化
void FIFO();//FIFO算法
void LRU();//LRU算法
void OPT();//最优页面置换算法(OPT)
void print();//输出
void randomnum()
{
srand(time(NULL));
for(int i=0;i<20;i++)
{
numbers[i]=rand() % 10;
}
}
void init()
{
for(int i=0;i<20;i++)
{
for(int j=0;j<num;j++)
{
stack[i][j]=-1;
}
}
}
void begin()
{
printf("请输入页面帧数:(1~8)\n");
scanf("%d",&num);
getchar();
printf("是否生产随机引用串(Y/N)Y:使用随机引用串 N:不使用随机引用串\n");
char c;
scanf("%c",&c);
switch(c)
{
case 'Y':
randomnum();
break;
case 'N':
break;
}
printf("20个引用的串为:\n");
for(int i=0;i<20;i++)
{
printf("%d ",numbers[i]);
}
putchar('\n');
init() ;
}
void Printf()
{
int i,j;
for(i=0;i<num;i++)
{
for(j=0;j<20;j++)
{
if(stack[j][i]!=-1)
{
printf("%d ",stack[j][i]);
}
else
{
printf("* ");
}
}
putchar('\n');
}
}
void FIFO()
{
putchar('\n');
printf("FIFO算法:\n");
init();
int i,y=-1,n=0,swap[20],count=0;
for(int p=0;p<20;p++)
{
swap[p]=10;
}
for(i=0;i<20;i++)
{
int flag=0;
if(i!=0)
{
for(int k=0;k<num;k++)
{
stack[i][k]=stack[i-1][k];
}
}
int equal=0;
for(int x=0;x<num;x++)
{
if(numbers[i]!=stack[i][x])
{
equal++;
if(equal==num)
{
n++;
flag=1;
break;
}
}
}
if(flag==1)
{
y++;
if(count>=num)
{
swap[i]=stack[i][y];//记录换出页码
}
stack[i][y]=numbers[i];
count++;
}
if(y==num-1)
{
y=-1;
}
}
printf("换出页号\n");
for(int t=0;t<20;t++)
{
if(swap[t]!=10)
{
printf("%d ",swap[t]);
}
}
putchar('\n');
printf("缺页次数%d :\n",n);
printf("缺页率:%.0lf%%\n",n / 20.0 * 100);
putchar('\n');
Printf();
}
void LRU()
{
putchar('\n');
printf("LRU算法:\n");
init();
int cot=0,i,swap[20],n=0,y=-1;
for(i=0;i<20;i++)
{
swap[i]=10;
}
for(i=0;i<20;i++)
{
int flag=0;
if(i!=0)
{
for(int j=0;j<num;j++)
{
stack[i][j]=stack[i-1][j];
}
}
int equal=0;
for(int x=0;x<num;x++)
{
if(numbers[i]!=stack[i][x])
{
equal++;
if(equal==num)
{
n++;
flag=1;
break;
}
}
}
if(cot<num)
{
if(flag==1)
{
y++;
stack[i][y]=numbers[i];
cot++;
}
if(y==num-1)
{
y=-1;
}
}
else if(cot>=num)
{
if(flag==1)
{
int z,m,index_min=30,index;
for(z=0;z<num;z++)
{
for(m=i-1;m>=0;m--)
{
if(stack[i][z]==numbers[m])
{
index=m;
break;
}
}
if(index_min>=index)
index_min=index;
}
for(int f=0;f<num;f++)
{
if(numbers[index_min]==stack[i][f])
{
swap[i]=stack[i][f];
stack[i][f]=numbers[i];
cot++;
}
}
}
}
}
printf("换出页号\n");
for(int t=0;t<20;t++)
{
if(swap[t]!=10)
{
printf("%d ",swap[t]);
}
}
putchar('\n');
printf("缺页次数%d :\n",n);
printf("缺页率:%.0lf%%\n",n / 20.0 * 100);
putchar('\n');
Printf();
}
void OPT()
{
putchar('\n');
printf("OPT算法:\n");
init();
int cot=0,i,swap[20],n=0,y=-1,j=0,a=0;
int s[num];
for(i=0;i<20;i++)
{
swap[i]=10;
}
for(i=0;i<20;i++)
{
for(int w=0;w<num;w++)
{
s[w]=-1;
}
int flag=0;
if(i!=0)
{
for(int j=0;j<num;j++)
{
stack[i][j]=stack[i-1][j];
}
}
int equal=0;
for(int x=0;x<num;x++)
{
if(numbers[i]!=stack[i][x])
{
equal++;
if(equal==num)
{
n++;
flag=1;
break;
}
}
}
if(cot<num)
{
if(flag==1)
{
y++;
stack[i][y]=numbers[i];
cot++;
}
if(y==num-1)
{
y=-1;
}
}
else if(cot>=num)
{
j=0;
if(flag==1)
{
int z,m,index_max=0,index;
for(z=0;z<num;z++)
{
for(m=i+1;m<=20;m++)
{
if(stack[i][z]==numbers[m])
{
s[z]=stack[i][z];
index=m;
j++;
break;
}
}
if(index_max<=index)
index_max=index;
}
if(j<num-1)
{
int m;
for(m=0;m<num;m++)
{
if(stack[i][m]!=s[m])
{
index_max=m;
}
}
for(m=0;m<num;m++)
{
swap[i]=stack[i][index_max];
stack[i][index_max]=numbers[i];
cot++;
}
}
if(j==num-1)
{
int v;
for(v=0;v<num;v++)
{
if(stack[i][v]!=s[v])
{
index_max=v;
}
}
for(v=0;v<num;v++)
{
swap[i]=stack[i][index_max];
stack[i][index_max]=numbers[i];
cot++;
}
}
if(j==num)
{
for(int f=0;f<num;f++)
{
if(numbers[index_max]==stack[i][f])
{
swap[i]=stack[i][f];
stack[i][f]=numbers[i];
cot++;
}
}
}
}
}
}
printf("换出页号\n");
for(int t=0;t<20;t++)
{
if(swap[t]!=10)
{
printf("%d ",swap[t]);
}
}
putchar('\n');
printf("缺页次数%d :\n",n);
printf("缺页率:%.0lf%%\n",n / 20.0 * 100);
putchar('\n');
Printf();
}
int main()
{
begin();
FIFO();
LRU();
OPT();
return 0;
}
实验目的:编写一个程序,实现第九章所述的FIFO、OPT和LRU页面置换算法。
要求:
- 首先,生成一个随机的页面引用串,其中页码的范围为0~9。
- 将这个随机页面引用串应用到每个算法,记录每个算法引起的缺页次数,列出每次页面置换的换出页序号,计算缺页率。
系统分配给用户的页面帧的数量可选:3~7,具体分配策略可自行定义。(4)假设采用请求分页(按需调页)。(5)若实现可视化效果(图形、动画展示等)有加分。