模拟存储管理-最佳、先进先出、最近最久未使用置换算法

OPTIMAL:最佳置换算法。其所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。
    FIFO:先进先出置换算法。该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。
    LRU:最近最久未使用置换算法。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的的时间T,当须淘汰一个页面时,选择现有页面中其T值最大的给予淘汰。在该实现中是选择Timer值最大的淘汰。

源代码:

#include <stdio.h>
#include <iostream.h>
#include<time.h>
#include<math.h>
#define Bsize 3
#define Psize 20
typedef struct page
{
	int content;//页面号
	int timer;//被访问标记
}page;
page block[Bsize];//物理块
page page[Psize];//页面号串

void Init(void)
{//初始化
	int QString[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
    
	for(int i=0; i<Bsize; i++)
	{
		block[i].content = -1;
		block[i].timer = 0;
	}
	
	for(i=0; i<Psize; i++)
	{
		page[i].content = QString[i];
		page[i].timer = 0;
	}
	
}
int findSpace(void)
{//查找是否有空闲内存
	for(int i=0; i<Bsize; i++)
		if(block[i].content == -1)
			return i;//找到空闲内存,返回BLOCK中位置
		return -1;
}
int findExist(int curpage)
{//查找内存中是否有该页面
	for(int i=0; i<Bsize; i++)
		if(block[i].content == page[curpage].content)
			return i;//找到内存中有该页面,返回BLOCK中位置
		return -1;
}
int  findReplace(void)
{//查找应予置换的页面,被置换的页面的Timer值最大
	int pos = 0; 
	for(int i=0; i<Bsize; i++)
		if(block[i].timer >= block[pos].timer)
			pos = i;//找到应予置换页面,返回BLOCK中位置
		return pos;
}

void  display(void)
{//显示
	for(int i=0; i<Bsize; i++)
		if(block[i].content != -1)
			cout<<block[i].content<<" ";
		cout<<endl;
}
void  Optimal(void)
{//OPTIMAL算法
	int exist,space,position ;
	for(int i=0; i<Psize; i++)
	{    
		exist = findExist(i);
		if(exist != -1)
		{ cout<<"不缺页"<<endl; }
		else
		{   
			space = findSpace();
			if(space != -1)
			{block[space]=page[i];//block[space].content=page[i].content,block[space].timer=page[i].timer
			display();
			}
			else
			{//没有找到空闲分区,需找一个页面进行置换
				for(int k=0; k<Bsize; k++)
					for(int j=i; j<Psize; j++)
					{
						if(block[k].content != page[j].content)
						{ block[k].timer = 1000; }//将来不会用,设置TIMER为一个很大数
						else
						{
							block[k].timer = j;
							break;
						}
					}
					position = findReplace();   
					block[position] = page[i];   
					display();
			}
		}
	}
}
void LRU(void)
{//LRU算法
	int exist,space,position ;
	for(int i=0; i<Psize; i++)
	{    
		exist = findExist(i);
		if(exist != -1)
		{ cout<<"不缺页"<<endl;
		block[exist].timer=0;}
		else
		{   
			space = findSpace();
			if(space != -1)
			{block[space]=page[i];
			
			display();
			}
			else
			{//没有找到空闲分区,需找一个页面进行置换
				
					position = findReplace();   
					block[position] = page[i];   
					display();
			}
		}
		for(int j=0; j<Bsize; j++)
			block[j].timer++;//BLOCK中所有页面TIMER++
	} 
}
void FIFO(void)
{
	
	int exist,space,position ;
	
	for(int i=0; i<Psize; i++)
	{
		exist = findExist(i);
		if(exist != -1)
		{cout<<"不缺页"<<endl;}
		
		else
		{  //找到空闲分区
			space = findSpace();
			if(space != -1)
			{
				block[space] = page[i];  
				display();
			}
			else
			{//没有找到空闲分区,需找一个页面进行置换
				position = findReplace();
				block[position] = page[i];   
				display();
			}
		}
		for(int j=0; j<Bsize; j++)
			block[j].timer++;//BLOCK中所有页面TIMER++
	}
}
void BlockClear(void)
{
	for(int i=0; i<Bsize; i++)
	{
		block[i].content = -1;
		block[i].timer = 0;
	}
}
void main(void){
	Init();
	cout<<"|----------页 面 置 换 算 法----------|"<<endl;
	cout<<"页面号引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1"<<endl;
	cout<<"----------------------------------------------------"<<endl;
	cout<<"选择<1>应用Optimal算法"<<endl;
	cout<<"选择<2>应用FIFO算法"<<endl;
	cout<<"选择<3>应用LRU算法"<<endl;
	cout<<"选择<0>退出"<<endl;
	int select;
	
	
	while(select)
	{
		cin>>select;
		switch(select)
		{
		case 0:
			break;
		case 1:
			cout<<"Optimal算法结果如下:"<<endl;
			Optimal();
			BlockClear();
			cout<<"----------------------"<<endl;
			break;
		case 2: 
			cout<<"FIFO算法结果如下:"<<endl;
			FIFO();
			BlockClear();
			cout<<"----------------------"<<endl;
			break;
			
		case 3: 
			cout<<"LRU算法结果如下:"<<endl;
			LRU();
			BlockClear();
			cout<<"----------------------"<<endl;
			break;
		default:
			cout<<"请输入正确功能号"<<endl;
			break;
		}
		
	}
}

运行截图:

最佳置换算法示例:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值