温馨提示:下面代码我使用的是含有c++的标准模板库(STL)vector的知识,还有文件读取的知识,如果没有学习过相关知识的同学,请先移步搜索相关视频或者帖子学习一下,我知道你的破学校或许不会教这些标准模板库的东西,但是你必须得学会,因为这才是C++的重中之重的知识。
【实验目的】
用高级语言模拟页面置换算法LRU,加深对LRU算法的认识。要求输出栈的变化序列。
【实验原理】
其基本原理为:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间 不被访问,再最近未来是不大可能被访问的。
此处使用计算机操作系统(第四版)汤小丹 梁红兵 哲凤屏 汤子瀛 编著第五章5.3节参考数据,结果一样
在项目目录下应该先有存好数据的input.txt文件
测试数据通过input.txt输入
4 7 0 7 1 0 1 2 1 2 6 2 4 1 3 0 1 2
代码逻辑:
代码中的N代表你要测试的物理块大小
创建栈调度算法中首先需要依次遍历页面号序列,通过search函数找到栈中是否存在这个页面号序列,
如果找不到,只有两种情况,要么栈没有满,要么栈已经满了,如果栈没有满,就把新的页面号序列压入栈中,如果栈已经满了,需要把栈底的数据清除,然后把新的页面号序列压入栈中
如果找到了,就把该页面号序列移到栈顶,把之后的序列往底部都移一位
代码如下:
#include< iostream>
#include<fstream>
#include<vector>
#include<string>
#define N 5//物理块大小
using namespace std;
ifstream ifs;
vector<int> iNum;
vector<int> stack;
vector<string> str;
void initialOutputStr()
{
for (int i = 0; i < N; i++)
{
string a = " ";//最大支持30个页面号序列显示,若要添加请按空格填充
str.push_back(a);
}
}
//读取文件input.txt的数值
void read()
{
int num;
while (ifs >> num)
{
iNum.push_back(num);
}
}
//遍历打印数组的数字
void print(vector<int> a)
{
for (int num : a)
{
cout << num << " ";
}
cout << endl;
}
//寻找当前栈中是否有目标‘页’,有就返回下标,没有返回-1
int search(int num)
{
for (unsigned j = 0; j < stack.size(); j++)
{
if (num == stack[j])
return j;
}
return -1;
}
//最终横向输出的函数
void finalOutput()
{
for (int num : iNum)
{
cout << num << " ";
}
cout << endl;
cout << endl;
for (int t = N-1; t >= 0; t--)//从高到低,为方便记录字符,我在function函数是从低到高记录每次栈变化后的数字,故这里输出是从低到高输出
{
cout << str[t] << endl;
}
}
//LRU调换主要功能函数
void function()
{
for (unsigned k = 0; k < iNum.size(); k++)
{
int index = search(iNum[k]);
if (index >= 0)//找到了
{
int temp = stack[index];
for (unsigned m = index + 1; m <= stack.size() - 1; m++)
{
stack[m - 1] = stack[m];
}
*(stack.rbegin()) = temp;//把数组末尾的数字换成找到的目标‘页’
}
else//找不到
{
if (stack.size() < N)//栈未满
{
stack.push_back(iNum[k]);
}
else//栈已经满了
{
stack.erase(stack.begin());
stack.push_back(iNum[k]);
}
}
//cout << iNum[k] << " : ";//注释的这两行是横向输出
//print(stack);
for (unsigned q = 0; q < stack.size(); q++)
{
str[q][k * 2] = stack[q]+ '0';//k×2是为了字符串奇数位留出空格方便观看
}
}
}
int main()
{
ifs.open("input.txt", ios::in);
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return 0;
}
read();
//print(iNum);
initialOutputStr();
function();
finalOutput();
return 0;
}