复习操作系统时,心血来潮写了下置换算法的执行代码。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define n 16
#define m 5
int page[n]={0}; //保存需要访问的页面
int i,j,q,mem[m]={0},List[m][n];
char flag,f[n];
int* build()//随机产生序列号函数
{
printf("随机产生一个进程序列号为:\n");
for(i=0; i<n; i++)
{
page[i]=10*rand()/(RAND_MAX+1)+1;
printf("%d ",page[i]);
}
printf("\n");
return(page);
}
void Init() //初始化函数
{
//初始化计算缺页次数的变量
for(int i=0;i<m;i++)
mem[i]=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
List[i][j]=0;
}
void FIFO()
{ int sum=0;
for(i=0;i<n;i++) //查页表,看是否缺页
{
q=0;
while((page[i]!=mem[q])&&(q!=m))
q++;
if(q==m)
flag='*'; //缺页,则置标志flag为'*'
else
flag=' ';
if(flag=='*')
{
for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的
mem[j]=mem[j-1];
mem[0]=page[i];
}
for(j=0;j<m;j++)
List[j][i]=mem[j];
f[i]=flag;
}
printf(" 0代表为空,*代表有缺页:\n");
printf("\n");
printf("-----------FIFO算法结果-----------------------\n");
for(i=0;i<m;i++)
{ if(i==1)
printf("----------------------------------------------\n");
for(j=0;j<n;j++)
{
printf("%d ",List[i][j]);
}
printf("\n");
}
for(i=0;i<n;i++)
{
if(f[i]=='*')
sum++;
printf("%c ",f[i]);
}
printf("\n----------------------------------------------\n");
printf("命中率:%lf\n",1-(double)sum/n);
}
void LRU()
{ int sum=0;
for(i=0;i<n;i++) //查页表,看是否缺页
{
q=0;
while((page[i]!=mem[q])&&(q!=m))
q++;
if(q==m)
flag='*'; //缺页,则置标志flag为'*'
else
flag=' ';
for(j=q;j>0;j--)
mem[j]=mem[j-1];
mem[0]=page[i];
for(j=0;j<m;j++)
List[j][i]=mem[j];
f[i]=flag;
}
printf("\n");
printf("------------LRU算法结果-----------------------\n");
for(i=0;i<m;i++)
{ if(i==1)
printf("----------------------------------------------\n");
for(j=0;j<n;j++)
printf("%d ",List[i][j]);
printf("\n");
}
for(i=0;i<n;i++)
{
if(f[i]=='*')
sum++;
printf("%c ",f[i]);
}
printf("\n----------------------------------------------\n");
printf("命中率:%lf\n",1-(double)sum/n);
}
void main()
{
int sel;
printf("\t\t\t******************** ************\t\t\t\n");
printf("\t\t\t 页面调度算法的模拟实现 \t\t\t\n");
printf("\t\t\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\t\t\t\n");
printf("\t\t\t 1.产生随机序 \t\t\t\n");
printf("\t\t\t 2.FIFO算法 \t\t\t\n");
printf("\t\t\t 3.LUR算法 \t\t\t\n");
do{
printf("请选择所要执行的操作(1 2 3):");
scanf("%d",&sel);
switch(sel)
{
case 1:build();break;
case 2:printf("先进先出算法\n");FIFO();Init();printf("\n");break;
case 3:printf("最少使用算法\n");LRU();Init();printf("\n");break;
default: break;
}
}while(sel!=0);
}