#include <stdlib.h>
#include<stdio.h>
#include<math.h>
#include<time.h>
#define MAXSIZE 50
typedef struct Block
{
int num;
int order;
}Block;
void init_mem(Block mem[],int m)
{
for(int i=1;i<=m;i++)
{
mem[i].num=-1;
mem[i].order=-1;
}
}
void init_page(Block page[],int k)
{
for(int i=1;i<=k;i++)
{
page[i].num=i;
page[i].order=-1;
}
}
void init_task(int task[],int l)
{
for(int i=1;i<=l;i++)
{
task[i]=-1;
}
}
void generate(int task[],int l)
{
int x;
srand(time(0));
printf("页码串序列如下:\n");
for(int i=1;i<=l;i++)
{
x=rand()%l+1;
task[i]=x;
printf("%d ",task[i]);
}
printf("\n");
}
void FIFO(int task[],int l,Block mem[],int m){
int find;
int lack_page=0;
int block=0;
int x;
for(int i=1;i<=l;i++)
{
find=0;
for(int j=1;j<=m;j++)
{
if(task[i]==mem[j].num)
find=1;
}
if(find==1)
{
}
else{
if(block<m)
{
mem[++block].num=task[i];
}
else{
lack_page++;
for(x=1;x<=m;x++)
{
mem[x-1].num=mem[x].num;
}
mem[x-1].num=task[i];
}
}
for(int y=1;y<=m;y++)
{
printf("%d ",mem[y].num);
}
printf("\n");
}
printf("缺页率为:%.2f%\n",((float)lack_page/(float)l*100));
}
void LRU(int task[],int l,Block mem[],int m){
int find;
int lack_page=0;
int block=0;
int x;
for(int i=1;i<=l;i++)
{
find=0;
for(int j=1;j<=m;j++)
{
if(task[i]==mem[j].num)
{
find=1;
if(find==1)
{
int t=mem[j].num;
for(int x=j;x<m;x++)
{
mem[x].num=mem[x+1].num;
}
mem[x].num=t;
for(int y=1;y<=m;y++)
{
printf("%d ",mem[y].num);
}
printf("\n");
break;
}
}
}
if(find==0){
if(block<m)
{
mem[++block].num=task[i];
}
else{
lack_page++;
for(x=1;x<=m;x++)
{
mem[x-1].num=mem[x].num;
}
mem[x-1].num=task[i];
}
for(int y=1;y<=m;y++)
{
printf("%d ",mem[y].num);
}
printf("\n");
}
}
printf("缺页率为:%.2f%\n",((float)lack_page/(float)l*100));
}
int main()
{
int m;
int l;
int k;
printf("请输入可用内存块个数:");
scanf("%d",&m);
printf("请输入页面走向长度:");
scanf("%d",&l);
printf("请输入页表的长度:");
scanf("%d",&k);
int task[l+1];
Block mem[m+1];
Block page[k+1];
init_mem(mem,m);
init_page(page,k);
init_task(task,l);
generate(task,l);
printf("FIFO算法结果如下:\n");
FIFO(task,l,mem,m);
init_mem(mem,m);
printf("LRU算法结果如下:\n");
LRU(task,l,mem,m);
}