操作系统实验3 页式地址重定位模拟

 

【实验名称】页式地址重定位模拟                 

 

【实验目的】

1.掌握和理解页式地址重定位模拟的基本思路和实现过程;

2. 理解页式地址重定位技术在多道程序设计中的作用和意义。

 

【实验原理】

页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。

由于一个作业装入到与其地址空间不一致的存储空间所引起的,对有关地址部分的调整过程称为地址的重定位。这个调整过程就是把作业地址空间中使用的逻辑地址变换成主存中物理地址的过程。这种地址变换也称为地址映射。

 

【实验内容】

实验内容:用高级语言编写和调试模拟实现页式地址重定位

代码(详情见代码注释):

#include
#include
#include 
using namespace std;

//页表类
class page_table
{
public:
	friend class address;
	page_table(int page_all);
	void show(int page_all);
private:
	int block_number[100];
};

//随机生成页表
page_table::page_table(int page_all)
{
	cout << "页表随机生成中..." << endl;
	srand((int)time(0));
	for (int i = 0; i < page_all; i++)
	{
		if (i == 0)
		{
			block_number[i] = (rand() % 4) + 1;
		}
		else
		{
			block_number[i] = block_number[i - 1] + (rand() % 4) + 1;
		}
	}
	cout << "页表生成完毕" << endl;
}

//显示页表
void page_table::show(int page_all)
{
	cout << "***************" << endl;
	cout << " 页号    块号" << endl;
	for (int i = 0; i < page_all; i++)
	{
		//setw(3)格式化输出
		cout << setw(3) << i << "  -->  " << setw(2) << block_number[i] << endl;
	}
	cout << "***************" << endl;
}

//地址类
class address
{
public:
	friend class page_table;
	address(int a, int page_all, int page_size);
	int check(int page_all, int page_size);
	void position(page_table Page_table, int page_all, int page_size);
	void show();
private:
	int Log_add;//逻辑地址
	int Mac_add;//物理地址
};

address::address(int a, int page_all, int page_size)
{
	Log_add = a;
}

//检查输入的逻辑地址是否合法
int address::check(int page_all, int page_size)
{
	if (Log_add > page_all*page_size)
	{
		cout << "输入非法,该地址越界!" << endl;
		return 0;
	}
	return 1;
}

//计算物理地址
void address::position(page_table Page_table, int page_all,  int page_size)
{
	int page_num = Log_add / page_size;
	int shifting = Log_add % page_size;
	Mac_add = (Page_table.block_number[page_num]) * page_size + shifting;
}

//显示物理地址
void address::show()
{
	cout << "对应的物理地址为:" << Mac_add << endl;
}

int main()
{
	cout << "****************************" << endl;
	cout << "***    页面地址重定位    ***" << endl;
	cout << "*** 1.显示页表信息       ***" << endl;
	cout << "*** 2.计算物理地址       ***" << endl;
	cout << "*** 3.退出模拟器         ***" << endl;
	cout << "****************************\n" << endl;

	//输入
	int page_size, page_all;
	cout << "请输入页号的长度:";
	cin >> page_all;
	cout << "请输入页面的大小:";
	cin >> page_size;
	page_table Page_table(page_all);
	
	int flag;
	while (true)
	{
		cout << "\n请选择功能:";
		cin >> flag;
		if (flag == 1)
		{
			//显示页表信息
			Page_table.show(page_all);
		}
		else if (flag == 2)
		{
			//检查逻辑地址&计算物理地址
			int AD;
			cout << "请输入逻辑地址:";
			cin >> AD;
			address add(AD, page_all, page_size);
			if (add.check(page_all, page_size))
			{
				add.position(Page_table, page_all, page_size);
				add.show();
			}
		}
		else if (flag == 3)
		{
			//退出
			cout << "成功退出!\n" << endl;
			break;
		}
	}
	return 0;
}

运行演示:

操作系统实验3 页式地址重定位模拟_第1张图片

从实验结果可以看出,实验成功。

 

【小结或讨论】

这次实验和之前的银行家算法实验相比,要简单一些,这次试验主要就是掌握页式地址重定位的基本思路,只要思路通了、过程理解了,通过代码实现的难度就不是很大。

这次实验,我设计了两个类:页表类和地址类,当然用C语言写也是完全可以的,但是我觉得用C++面对对象的方法写会条理清楚很多。关于页表的生成,我并没有采取人工输入的方法,而是采用随机生成。当然这也不是完全纯随机的,每个块号只会在前一个块号的基础上递增1至3之间的随机数,这比较符合我们上课时候例题中的大致情况。

页表确定了,其他就好办了。判断逻辑地址合法后,我们只要分别除以和模上页面大小,就可以得到页号的偏移量。再根据页号和页表就能得到块号。最后根据块号*页面大小+偏移量就能计算出我们要求的对应的物理地址。

 

 

你可能感兴趣的:(操作系统实验)