存储管理
- 实验目的
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
- 实验内容
(1) 通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。
页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。
在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。
(2) produce_addstream通过随机数产生一个指令序列,共320条指令。
A、 指令的地址按下述原则生成:
1) 50%的指令是顺序执行的
2) 25%的指令是均匀分布在前地址部分
3) 25%的指令是均匀分布在后地址部分
B、 具体的实施方法是:
1) 在[0,319]的指令地址之间随机选取一起点m;
2) 顺序执行一条指令,即执行地址为m+1的指令;
3) 在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m;
4) 顺序执行一条指令,地址为m+1的指令
5) 在后地址[m+2,319]中随机选取一条指令并执行;
6) 重复上述步骤1)~5),直到执行320次指令
C、 将指令序列变换称为页地址流
在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
。。。。。。
第310条~第319条指令为第31页(对应虚存地址为[310,319]);
按以上方式,用户指令可组成32页。
(3) 计算并输出下属算法在不同内存容量下的命中率。
1) 先进先出的算法(FIFO);
2) 最近最少使用算法(LRU)
- 实验要求
- 实验代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> Available;
int finish[100];
int m, n;
class bankerAlgorithm
{
public:
int Max[100];
int Allocation[100];
int need[100];
};
void Banker(vector<bankerAlgorithm> banker);
void show(vector<bankerAlgorithm> banker);
bool lower(bankerAlgorithm a, vector<int>work);
bool safe(vector<bankerAlgorithm> banker);
void initialize();
class random //取随机数
{
public:
static inline int getRandom(const int min, const int max, int match)
{
srand(time(0) + match);
return rand() % (max - min - 1) + min;
}
static inline int getRandom(const int min, const int max, int match1,int match2)
{
srand(time(0) + match1+match2);
return rand() % (max - min - 1) + min;
}
};
void Banker(vector<bankerAlgorithm> banker)
{
int t = 1;
while(1)
{
cout << "请输入需要申请资源的进程:" << endl;
cin >> t;
if (t <= n && t >= 1)
{
t--;
cout << "请输入各资源申请量:" << endl;
vector<int>request;
for (int i = 0; i < m; i++)
{
int temp1;
cin >> temp1;
request.push_back(temp1);
}
if (lower(banker[t], request))
{
cout << "数据出错" << endl;
continue;
}
for (int i = 0; i < m; i++)
{
if (request[i] > Available[i])
{
cout << "数据出错" << endl;
continue;
}
}
for (int j = 0; j < m; j++)
{
Available[j] -= request[j];
banker[t].Allocation[j] += request[j];
banker[t].need[j] += request[j];
}
if (safe(banker) == true)
{
cout << "系统安全,允许分配" << endl;
}
else
cout << "系统不安全,不允许分配" << endl;
}
else
break;
}
if(t > n || t < 1)
{
cout << "您选择终止程序" << endl;
return;
}
}
void show(vector<bankerAlgorithm> banker)
{
cout << endl << endl << endl;
cout << "系统可分配资源:" << endl;
cout << "Available== ";
for (int i = 0; i < m; i++)
{
cout << Available[i] << " ";
}
cout << endl;
for (int i = 0; i < n; i++)
{
cout << "第" << i + 1 << "个进程的资源情况为:" << endl;
cout << "Max== ";
for (int j = 0; j < m; j++)
{
cout << banker[i].Max[j] << " ";
}
cout << endl;
cout << "Allocation== ";
for (int j = 0; j < m; j++)
{
cout << banker[i].Allocation[j] << " ";
}
cout << endl;
cout << "need== ";
for (int j = 0; j < m; j++)
{
cout << banker[i].need[j] << " ";
}
cout << endl;
}
}
bool lower(bankerAlgorithm a, vector<int>work)
{
for (int j = 0; j < m; j++)
{
if (a.need[j] > work[j])
return false;
}
return true;
}
bool safe(vector<bankerAlgorithm> banker)
{
vector<int>work = Available;
vector<bool>finish;
vector<int>num;
for (int i = 0; i < n; i++)
{
finish.push_back(false);
}
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
if (finish[i] == false)
{
if (lower(banker[i], work) == true)
{
num.push_back(i);
finish[i] = true;
for (int j = 0; j < m; j++)
{
work[j] = work[j] + banker[i].Allocation[j];
}
}
}
}
}
for (int i = 0; i < n; i++)
{
if (finish[i] == false)
{
cout << "该序列不安全" << endl;
return false;
}
}
cout << "安全序列为:";
for (int i = 0; i < n; i++)
cout << num[i] + 1 << " ";
cout << endl;
return true;
}
void initialize()
{
vector<bankerAlgorithm> banker;
cout << "请输入资源数:" << endl;
cin >> m;
cout << "请输入进程数:" << endl;
cin >> n;
for (int i = 0; i < n; i++)
{
bankerAlgorithm a;
for (int j = 0; j < m; j++)
{
a.Max[j] = random::getRandom(10, 20, i, j);
}
for (int j = 0; j < m; j++)
{
a.Allocation[j] = random::getRandom(0, 5, i, j);
}
for (int j = 0; j < m; j++)
{
a.need[j] = a.Max[j] - a.Allocation[j];
}
banker.push_back(a);
}
int t = rand() % n;
for (int j = 0; j < m; j++)
{
Available.push_back(random::getRandom(2, 6, j) + banker[t].need[j]);
}
show(banker);
if (safe(banker) == true)
{
Banker(banker);
}
}
int main()
{
initialize();
return 0;
}