c++操作系统虚拟操作系统实验FIFO,LRU以及OPT算法实现
#include<stdio.h>
#include<string.h>
#include<iostream.h>
const int MAXSIZE=1000;//定义页访问流的最大长度
const int MAXQUEUE=3;//定义可用页面数
typedef struct node
{ int loaded; int hit;
}page;
page pages[MAXQUEUE],pl[MAXQUEUE]; //定义页面表
int queue[MAXSIZE];
int quantity;
//初始化结构函数
void initial()
{
int i;
for(i=0;i<MAXQUEUE;i++)
{
pages[i].loaded=-1;
pages[i].hit=0;
pl[i].loaded=-1;
pl[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;
pl[i].loaded=-1;
pl[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++;
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
//最近最少使用调度算法(LRU)
void LRU()
{
int absence=0;
int i,j;
int flag;
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"最近最少使用调度算法(LRU)页面调出流:";
for(i=0;i<quantity;i++)
{ flag=-1;
for(j=0;j<MAXQUEUE;j++)
{
if(queue[i]==pages[j].loaded)
{ flag=j; }
}
if(flag==-1)
{
//缺页处理
if(absence>=MAXQUEUE)
{cout<<pages[0].loaded<<" "; }// pages[0]是队列头
for(j=0;j<MAXQUEUE-1;j++)
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1].loaded=queue[i];
absence++; }
else
{
//页面已载入
page temp=pages[flag];
for(j=flag;j<MAXQUEUE-1;j++)
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1]=temp;
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
//最近最少使用理想算法(OPT)
void OPT()
{
int absence=0;
int i,j,max,k,m,n=MAXQUEUE;
int flag; //标记是否缺页
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"最远使用调度算法(OPT)页面调出流:";
for(i=0; i<quantity; i++) {
flag=-1; //表示缺页
for(j=0; j<MAXQUEUE; j++) {
if(pages[j].loaded==queue[i]) {
flag=j; //未缺页
}
}
//缺页
if(flag==-1) {
max=0; //最远距离变量
m=0; //最远距离的页目前处于内存中的页面索引
if(absence>=MAXQUEUE) { //判断内存中页面是否已满
for(j=0; j<MAXQUEUE; j++) {
pl[j].hit=0; //用来计算下一次使用该页面距此的距离
pl[j].loaded=pages[j].loaded;//用来存储占用内存页面的页号
for(k=i+1; k<=quantity; k++) {//遍历即将调用的页面序列
if(pl[j].loaded==queue[k]) {//找到下一次调用的位置
break;
}
else{ //没找到则距离+1
pl[j].hit++;
}
}
if(max<pl[j].hit) {//更新最远距离
max=pl[j].hit;
m=j; //通过最远距离来确定页号及页面号
}
}
// cout<<"页面一:"<<pl[0].loaded<<"||"<<pl[0].hit<<" "<<"页面二:"<<pl[1].loaded<<"||"<<pl[1].hit<<" "<<"页面三:"<<pl[2].loaded<<"||"<<pl[2].hit<<"m="<<m<<endl;
cout<<pages[m].loaded<<" ";//输出要弹出的页号
pages[m].loaded=queue[i];调入新的页
} else { //若内存中还有空闲页面
pages[n-MAXQUEUE].loaded=queue[i];//将新调入的页放入空闲页面
n++;
}
// cout<<"缺页A:"<<pages[0].loaded<<" "<<"B:"<<pages[1].loaded<<" "<<"C:"<<pages[2].loaded<<endl;
absence++; //缺页数量加一
}else{ //未缺页则不做处理
// cout<<"未缺页A:"<<pages[0].loaded<<" "<<"B:"<<pages[1].loaded<<" "<<"C:"<<pages[2].loaded<<endl;
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
cout<<"*********************************************"<<endl;
}
//显示
void version()
{
cout<<" /*******************虚拟存储管理器的页面调度****************/"<<endl;
cout<<endl;
}
void main()
{
version();
initial();
readData();
FIFO();
init();
LRU();
init();
OPT();
}
运行结果: