c++操作系统虚拟操作系统实验FIFO,LRU以及OPT算法实现

该博客详细介绍了如何使用C++编程实现虚拟操作系统中的三种页面调度算法:FIFO(先进先出)、LRU(最近最少使用)和OPT(最佳页面替换)。通过读取页面访问流文件,这些算法被用于计算缺页次数并展示页面调出流。FIFO算法简单地按访问顺序替换页面,LRU算法根据最近使用频率替换页面,而OPT算法则是理论上最优的页面替换策略。
摘要由CSDN通过智能技术生成

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();
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

♛♕♔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值