最近最久未使用置换算法的模拟LRU(C++实现)

实验要求

1)设计模拟实现OPT、FIFO和LRU页面置换算法中的任意一种。

OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。

FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。

LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

2)完成算法代码。

3)运行程序,算出结果。

设计思路

  模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时使用LRU页面置换的情形。其中内存页面大小可手动输入进行设置,虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以手动输入。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。

LRU算法最近的过去作为最近的将来的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存。

程序进入时可通过程序设定物理块大小

着输入虚页长度,即程序运行时页面号引用串长度

 程序有两种页地址流产生方式,分别为系统随机产生和手动输入

 程序动态显示内存中物理块的分配信息

最后输出总的命中次数和命中率

 

源程序 

 

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1e3 + 10;
int h[N], data[N], temp[N];//分配的物理块  虚页流 存储该页面未来要被访问的时间 
int n, m;//物理块大小  虚页的长度
double sum;//总命中次数 

void init()
{
	cout << "最近最久未使用页面置换算法LRU 请输入物理块大小" << endl;
	cin >> n;
	cout << "请输入虚页长度" << endl;
	cin >> m; 
	cout << "请选择页地址流产生方式\n1.系统随机生成,2.手动输入" << endl;
	int op;
	cin >> op;
	if(op == 1)//随机生成 
	{
		for(int i = 1; i <= m; i ++) 
		{
			data[i] = ( rand() % (9 - 1 + 1 ) ) + 1;//产生[1,9]的随机数 
			cout << data[i] << ' ';	
		}
		cout << endl;
	}  	
	else if(op == 2)//手动输入 
	{
		for(int i = 1; i <= m; i ++) cin >> data[i];
	}
	
	cout << "当前到达页号  ";
	for(int i = 1; i <= n; i ++)
		cout << "物理块 " << i << "  ";
	cout << "       是否产生缺页" << endl; 
} 

void show(int k, bool flag)//当前虚页块位号 是否产生缺页 
{
	cout << data[k] << "           ";
	for(int i = 1; i <= n; i ++)
	{
		if(h[i] == 0) cout << "空           ";
		else cout << h[i] << "           ";	
	} 
	
	if(flag) cout << "未产生缺页";
	else cout << "产生缺页"; 
	
	cout << "\n----------------------------------------------------------------" << endl;
}

int main()
{
	init();//初始化
	
	for(int i = 1; i <= m; i ++)//对虚页流进行处理 
	{
		bool flag = false;//当前内存中是否有该页面 
		
		int j = data[i];//该页面下标
		
		for(int k = 1; k <= n; k ++)//遍历物理块
			if(h[k] == j)//当前内存中有该页面 
			{
				flag = true;
				//cout << "here" << endl;
				//LRU算法核心,将最近使用的页面移动到队列尾 
				int t = h[k];
				for(int q = k + 1; q <= n; q ++) h[q - 1] = h[q];
				h[n] = t; 
				
				sum ++;//命中次数加1 
				break;	
			} 
			
		bool temp_flag = flag;//保存标志位
		 
		if(!flag)//当前内存中无该页面,需调用页面置换算法(先检查有无空白物理块)
		{
			for(int k = 1; k <= n; k ++)
				if(h[k] == 0)//当前有空白物理块,将该页面置于此处 
				{
					h[k] = j;
					//cout << "here" << endl;
					flag = true;//此时flag代表该页面放入内存没 
					break;
				}
		}
		
		if(!flag)//无空白物理块, 采用FIFO算法 
		{
			for(int k = 2; k <= n; k ++) h[k - 1] = h[k];
			h[n] = j;
		}
		
		show(i, temp_flag);//打印输出数据 		
	}
	cout << "命中次数为 " << sum << " 虚页流长度 " << m << " 命中率为 " << sum / m;
	
	return 0;
}

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值