操作系统实验存储管理

存储管理

  1. 实验目的

存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

  1. 实验内容

(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)

  1. 实验要求

在这里插入图片描述

  1. 实验代码
#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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值