用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

c++ 虚拟存储管理器的页面调度(FIFO LRU LFU OPT)

2013-03-09 作者: 小蜜锋举报

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

}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...