操作系统存储管理实验:最近最少使用LRU(Least Recently Used)

1. 设计思路

使用c++栈函数
最近使用的放在栈顶,最久未使用的处于栈底。

  1. 判断栈内是否为空(判断当前页框中有没有页面)
  2. 为空->直接入栈
  3. 不为空->通过辅助栈对主栈内容进行遍历
  4. 有相同的,将原栈中的页面删除,将新进的页面放在栈顶,从而确保最近使用过的页面处于栈顶
  5. 没有相同的,将栈底元素删除,将新进页面放在栈顶,从而将最久未使用的删除并确保最近使用过的页面处于栈顶

2. 代码

/*最近最少使用LRU
* 将最近使用的放在栈顶
*/
#include <iostream>
#include<stack>
#include<vector>
using namespace std;

int main()
{
	int physical_block_num; // 物理块数量
	int page_num; //页面数
	int page_no;  //页面号
	stack<int, vector<int>>s1;  //主栈
	stack<int, vector<int>>s2;  //辅助栈
	cout << "请输入物理块数量:";
	cin >> physical_block_num;
	cout << "请输入页面数量:";
	cin >> page_num;
	for (int i = 0; i < page_num; i++)
	{
		int state = 0;  //标记栈中有没有相同的
		cin >> page_no;
		if (s1.empty())  //为空直接入栈
		{
			s1.push(page_no);
			cout << "*";
		}
		else {
			while (!s1.empty())
			{
				if (page_no == s1.top()) {   //有相同的
					cout << "-";
					s1.pop();  //把相同的丢掉
					while (!s2.empty())
					{
						s1.push(s2.top()); //把s2中的放回来
						s2.pop();
					}
					s1.push(page_no); //把最新加入的放到栈顶,保证最新使用过的在上面
					state = 1;
					break;
				}
				else {
					s2.push(s1.top());   //把s1中的元素放入s2中
					s1.pop();  //把换到s2中的,删除
				}
			}
			if (state == 0) {  //如果没有相同的,s1中的元素会被全部换到s2中
				if (s2.size() == physical_block_num)  //判断需不需要把原来栈中的内容删除
				{
					s2.pop();  //先把s2中的第一个删除,第一个是最久未使用的
					while (!s2.empty()) {
						s1.push(s2.top());  //把s2中的其他元素放入s1中
						s2.pop();           //把s2中放入s1中的元素删除
					}
					s1.push(page_no);  //把最新添加进来的放在最上面
					cout << "*";
				}
				else {
					while (!s2.empty()) {
						s1.push(s2.top());  //把s2中的其他元素放入s1中
						s2.pop();  //把s2中放入s1中的元素删除
					}
					s1.push(page_no);  //把最新添加进来的放在最上面
					cout << "*";
				}
			}
			
		}
		while (!s1.empty())
		{
			cout << s1.top();
			s2.push(s1.top());
			s1.pop();
		}
		while (!s2.empty())
		{
			s1.push(s2.top());
			s2.pop();
		}
		cout << endl;
	}
}
/*test data
3
20
9 2 3 4 2 5 2 6 4 5 2 5 4 3 4 2 3 9 2 3
*/

3. 测试数据

3
20
9 2 3 4 2 5 2 6 4 5 2 5 4 3 4 2 3 9 2 3
在这里插入图片描述

实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值