[c++]代码库
#include<stdio.h>
#include<string.h>
#include<iostream.h>
/************************************************************
页面调度算法主要有:FIFO,最近最少使用调度算法(LRU),最近最不常用调度算法(LFU),最佳算法(OPT)
此程序包括 :FIFO ,最近最少使用调度算法( LRU ),最近最不常用调度算法( LFU ) 第二次机会算法
************************************************************/
const int MAXSIZE=1000;//定义最大页面数
const int MAXQUEUE=3;//定义页框数
typedef struct node
{
int loaded;
int hit;
} page;
page pages[MAXQUEUE]; //定义页框表
int queue[MAXSIZE];
int quantity;
//初始化结构函数
void initial()
{
int i;
for ( i=0; i<MAXQUEUE; i++ )
{
pages[i].loaded=-1;
pages[i].hit=0;
}
for ( i=0; i<MAXSIZE; i++ )
{
queue[i]=-1;
}
quantity=0;
}
//初始化页框函数
void init()
{
int i;
for ( i=0; i<MAXQUEUE; i++ )
{
pages[i].loaded=-1;
pages[i].hit=0;
}
}
//读入页面流
void readData()
{
FILE *fp;
char fname[20];
int i;
cout<<"请输入页面流文件名:";
cin>>fname;
if ( ( fp=fopen ( fname,"r" ) ) ==NULL )
{
cout<<"错误,文件打不开,请检查文件名";
}
else
{
while ( !feof ( fp ) )
{
fscanf ( fp,"%d ",&queue[quantity] );
quantity++;
}
}
cout<<"读入的页面流:";
for ( i=0; i<quantity; i++ )
{
cout<<queue[i]<<" ";
}
}
//FIFO调度算法
void FIFO()
{
int i,j,p,flag;
int absence=0;
p=0;
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"FIFO调度算法页面调出流:";
for ( i=0; i<quantity; i++ )
{
flag=0;
for ( j=0; j<MAXQUEUE; j++ )
{
if ( pages[j].loaded==queue[i] )
{
flag=1;
}
}
if ( flag==0 )
{
if ( absence>=MAXQUEUE )
{
cout<<pages[p].loaded<<" ";
}
pages[p].loaded=queue[i];
p= ( p+1 ) %MAXQUEUE;
absence++;
}
}
absence-=MAXQUEUE;
cout<<endl<<"总缺页数:"<<absence<<endl;
}
//最近最少使用调度算法(LRU)
void LRU()
{
int absence=0;
int i,j;
int flag;
for ( i=0; i<MAXQUEUE; i++ )
{
pages[i].loaded=queue[i];
}
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"最近最少使用调度算法(LRU)页面流:";
for ( i=MAXQUEUE; i<quantity; i++ )
{
flag=-1;
for ( j=0; j<MAXQUEUE; j++ )
{
if ( queue[i]==pages[j].loaded )
{
flag=j;
}
}
//CAUTION pages[0]是队列头
if ( flag==-1 )
{
//缺页处理
cout<<pages[0].loaded<<" ";
for ( j=0; j<MAXQUEUE-1; j++ )
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1].loaded=queue[i];
absence++;
}
else
{
//页面已载入
pages[quantity]=pages[flag];
for ( j=flag; j<MAXQUEUE-1; j++ )
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1]=pages[quantity];
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
//最近最不常用调度算法(LFU)
void LFU()
{
int i,j,p;
int absence=0;
int flag;
for ( i=0; i<MAXQUEUE; i++ )
{
pages[i].loaded=queue[i];
}
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"最近最不常用调度算法(LFU)页面流:";
for ( i=MAXQUEUE; i<quantity; i++ )
{
flag=-1;
for ( j=0; j<MAXQUEUE; j++ )
{
if ( pages[j].loaded==queue[i] )
{
flag=1;
pages[j].hit++;
}
}
if ( flag==-1 )
{
//缺页中断
p=0;
for ( j=0; j<MAXQUEUE; j++ )
{
if ( pages[j].hit<pages[p].hit )
{
p=j;
}
}
cout<<pages[p].loaded<<" ";
pages[p].loaded=queue[i];
for ( j=0; j<MAXQUEUE; j++ )
{
pages[j].hit=0;
}
absence++;
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
//第二次机会算法
void second()
{
int i,j,t;
int absence=0;
int flag,temp;
for ( i=0; i<MAXQUEUE; i++ )
{
pages[i].loaded=queue[i];
}
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"第二次机会算法页面流:";
for ( i=MAXQUEUE; i<quantity; i++ )
{
flag=-1;
for ( j=0; j<MAXQUEUE; j++ )
{
if ( pages[j].loaded==queue[i] )
{
flag=1;
pages[j].hit=1;
}
}
if ( flag==-1 )
{
//缺页处理
t=0;
while ( t==0 )
{
if ( pages[0].hit==0 )
{
cout<<pages[0].loaded<<" ";
for ( j=0; j<MAXQUEUE-1; j++ )
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1].loaded=queue[i];
pages[MAXQUEUE-1].hit=0;
t=1;
}
else
{
temp=pages[0].loaded;
for ( j=0; j<MAXQUEUE-1; j++ )
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1].loaded=temp;
pages[MAXQUEUE-1].hit=0;
}
}
absence++;
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
//显示版权信息函数
void version()
{
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 虚拟存储管理器的页面调度 ┃"<<endl;
cout<<" ┠───────────────────────┨"<<endl;
cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
cout<<" ┃ sony006@163.com ┃"<<endl;
cout<<" ┃ version 2004 build 1122 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main()
{
version();
initial();
readData();
FIFO();
init();
LRU();
init();
LFU();
init();
second();
}