先进先出页面置换算法
#include "iostream.h"
#include "iomanip.h" //使用setw()时用到的头文件
#include "stdio.h"
#include "stdlib.h"
#define Max 30 //某进程调入内存中的最大页面数
#define Size 10 //系统为某进程分配的最大物理块数
void Init(int Block[],int m) //初始化物理块
{ int i;
for(i=0;i
{
Block[i]=-1;
}
}
void creat(int Page[],int n) //输入页面串引用号
{ int i;
for(i=0;i
{
cin>>Page[i];
}
}
void FIFO(int Page[],int Block[],int n,int m)
{//max_stay:比较当前内存中页面驻留的最久时间,count:统计页面置换次数
//get:某物理块是否等待驻入新页面(-1:否)
//flag:标记当前序号页面是否已驻入内存(-1:否)
//block_num:驻留内存时间最长的页面所在的物理块序号
//time[]标记对应序号的物理块中页面驻留时间
int i,j,max_stay=0,count=0;
int get=-1,flag=-1,block_num=-1;
int time[Size];
float p=0.0;
for(i=0;i
{ time[i]=0;
}
for(i=0;i
{ for(j=0;j
{ if(Block[j]==-1)
{
get=j; //物理块j即将(/等待)驻入新页面
break;
}
}
for(j=0;j
{ if(Block[j]==Page[i])//物理块j中页面与当前期望调入内存的页面相同
{
flag=j;
break;
}
}
for(j=0;j
{
if(time[j]>max_stay)
{
max_stay=time[j];
block_num=j; //block_num标记当前序号物理块中页面驻留时间最久
}
}
if(flag==-1) //不存在相同页面
{ if(get!=-1) //物理块即将(/等待)驻入新页面
{
cout
cout
cout
Block[get]=Page[i]; //存入页面
time[get]=0; //当前物理块重新计时
for(j=0;j
{
time[j]++;
}
get=-1;
}
else //页面调度置换,序号block_num的物理块是驻留时间最久的
{
cout
cout
cout
cout
Block[block_num]=Page[i];
time[block_num]=0;
for(j=0;j
{
time[j]++;
}
block_num=-1;
max_stay=0;
count++;
}
}
else //待调入页面与序号flag的物理块中页面相同
{
cout
cout
cout
for(j=0;j
{
time[j]++;
}
flag=-1;
}
for(j=0;j
入情况
{
cout
}
cout
}
p=count*100/n;
cout
}
void main()
{ int n,m,Page[Max],Block[Size];
char p;
cout
cout
cout
while(1)
{
cout
while(1)
{cin>>m;
if(m>Size||m
{
cout
cout
}
else break;
}
Init(Block,m);
cout
cin>>n;
cout
creat(Page,n);
cout
FIFO(Page,Block,n,m);
cout
cin>>p;
cout
if(p=='y' || p=='Y')
continue;
else break;
}
}