307-置换策略LRU算法的实现

置换策略LRU算法的实现

最近最少使用(LRU)

LRU策略置换内存中上次使用距当前最远的页
根据局部性原理,这也是最近最不可能访问到的页
实际上,LRU策略的性能接近于OPT策略
该方法的问题在于比较难于实现。一种实现方法是给每一页添加一个最后一次访问的时间标签,并且必须在每次访问存储器时,都更新这个标签。即使有支持这种方案的硬件,开销仍然是非常大的。另一种可选择的方法是维护一个关于访问页的栈,但开销同样很大。
下图给出了关于LRU行为的一个例子。它使用与前面OPT策略的例子相同的页地址顺序。在这个例子中会产生4次缺页中断。
在这里插入图片描述

代码实现及注释

选择距最近的最远的项置换 最近一段时间最长时间没有被访问的页面置换 和OPT类似
2 3 2 1 5 2 4 5 3 2 5 2 测试数据

#include <deque>
#include <cstdio>
#include <algorithm>
#include<iostream>
using namespace std;

struct opt
{
	int value;//值
	int time;//时间
};
const int maxn = 105;
int a[maxn];
int main()
{
	deque<opt>  dq;//定义一个队列
	deque<opt >::iterator pos;//定义一个迭代器
	int numyk, numqueye = 0;
	cout << "请输入物理页框块数:";
	cin >> numyk;//页框的个数

	int n;
	cout << "请输入页面走向个数:";
	cin >> n;//一共访问的页的个数

	for (int i = 0; i < n; i++)//依次访问页
		cin >> a[i];//依次输入页的页号

	for (int i = 0; i < n; i++)//依次遍历页
	{
		int in;
		in = a[i];//提取当前页的页号并赋值给in
		if (dq.size() < numyk)//如果存在多余页框
		{
			int flag = 0;//初始化标记值为0
			for (pos = dq.begin(); pos != dq.end(); pos++)//迭代器遍历队列
				if ((*pos).value == in)//队列中存在元素和它相同
				{
					flag = 1;//标记值记为1
					break;
				}//存在该元素
			if (!flag) //如果不存在此元素
			{
				opt temp;
				temp.value = in;//把要放入的页的页号赋值给temp的value
				temp.time = 0;//初始化时间距离值为0
				dq.push_back(temp);//把当前的temp放入队列
			}
		}
		else//如果不存在多余的页框
		{
			int flag = 0;//标记值初始化为0
			for (pos = dq.begin(); pos != dq.end(); pos++)//迭代器遍历队列
				if ((*pos).value == in)//将访问的页和队列中的某个元素页的页号相同
				{
					flag = 1;//标记值置为1
					break;
				}//存在该元素
			if (!flag)//如果队列中不存在此页号的页
			{
				numqueye++;//缺页数+1
				int m = dq.front().time;//获取队列的第一个元素页的时间距离值
				deque<opt >::iterator mp = dq.begin();//注意此处千万注意初始化 否则有可能erase找不到对象崩溃
				for (pos = dq.begin(); pos != dq.end(); pos++)//迭代器遍历队列
				{
					cout << (*pos).value << (*pos).time << endl;
					if ((*pos).time > m)//找出队列中时间值最大的元素页的位置
					{
						cout << "迭代";
						mp = pos;//时间距离值最大的页的位置
						m = (*pos).time;
					}
				}
				cout << "此时队列中所剩时间最长的元素为" << (*mp).value << endl;
				opt temp;
				temp.value = in;//把要换入的页的页号给temp的value
				dq.erase(mp);//把时间最长的元素的页从队列中移除
				temp.time = 0; //加进来之后,重置为0
				dq.push_back(temp);//把当前的temp入队列
			}
		}
		//每次之后重计算各对象的time
		for (pos = dq.begin(); pos != dq.end(); pos++)//迭代器遍历队列
		{
			cout << "队列中的元素为:" << (*pos).value << endl;
			for (int j = i; j >= 0; j--)//往前遍历页
				if (a[j] == (*pos).value)//如果前面的页的页号和当前页的页号相同
				{
					(*pos).time = i - j;//计算出时间距离值
					break;
				}
			cout << "距离上次时间为:" << (*pos).time << endl;
		}
	}
	cout << "LRU缺页次数为:" << numqueye << endl;
	cout << "LRU缺页中断率为:" << (double)numqueye * 1.0 / n << endl;
}

运行截图

在这里插入图片描述
回车!
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林林林ZEYU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值