虚拟存储器管理(C++实现)

算法思想:

  1. 请求分页虚拟存储管理技术,是把作业地址空间的全部信息存放在磁盘上。当作业被选中运行时,先把作业的开始几页装入主存,并启动运行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页不在主存。其中标志表示对应页是否已经装入主存。1表示对应页已经装入主存;0表示对应页未装入主存;主存块号表示该页对应的主存块号;修改位指示该页调入主存后是否修改过的标志;外存地址指示该页所在的外存地址。
  2. 作业执行时,指令中的逻辑地址指出参加运算的操作数(或指令)地址中的页号和页内偏移量。硬件地址转换机构按页号查页表。若该页的标志为1,则表示该页已在主存,从而找到该页对应的主存块号。计算关系式,绝对地址等于块号*块的长度+页内偏移量。计算出预访问的主存地址。由于页长为2的整次幂。所以只要将块号和页内偏移量相拼接。放入主存地址寄存器即可。按照该地址取指令或取操作数,完成指定的操作。
  3. 设计一个地址变换程序,模拟硬件地址变换过程,当访问的页在主存时,则形成绝对地址后,不去模拟指令的执行,而是输出被转换的地址,当访问的页不在主存时,则输出该页不在主存,产生缺页中断,以表示产生了一次缺页中断。

进行缺页中断处理,中断返回后,重新执行该指令。假定主存的每块长度为64个字节,现有一个具有8页的作业系统,为其分配的4个主存块(即m=4),且最多分四块。其中第0页至第3页已经装入主存。

(4)当采用LRU算法时。则淘汰最近很少访问的页。

代码:

#include
#include
#include
#include
using namespace std;

typedef struct pageTable{
	int pageNumber;
	int sign=0;
	int mainStorageBlockNumber;
	int modifiedBit=0;
	int externalAddress;
}pageTable;

typedef struct instructionTable{
	string operation;
	int pageNumber;
	int unitNumber;
}instructionTable;

void initPageTable(vector&p){
	int pageNumber[]={0,1,2,3,4,5,6,7};
	int sign[]={1,1,1,1,0,0,0,0};
	int mainStorageBlockNumber[]={5,8,9,10,-1,-1,-1,-1};
	int modifiedBit[]={1,1,0,0,-1,-1,-1,-1};
	int externalAddress[]={11,12,13,15,17,025,212,213};
	pageTable s;
	for(int i=0;i<8;i++){
		s.pageNumber=pageNumber[i];
		s.sign=sign[i];
		s.mainStorageBlockNumber=mainStorageBlockNumber[i];
		s.modifiedBit=modifiedBit[i];
		s.externalAddress=externalAddress[i];
		p.push_back(s);
	}
}

void initInstructionTable(vector&p){
	string operation[]={"+","+","*","存","取","-","移位","+","存","取","+","取"};
	int pageNumber[]={0,1,2,3,0,6,4,5,1,7,4,6};
	int unitNumber[]={40,50,16,22,54,40,52,22,34,56,2,76};
	instructionTable s;
	for(int i=0;i<12;i++){
		s.operation=operation[i];
		s.pageNumber=pageNumber[i];
		s.unitNumber=unitNumber[i];
		p.push_back(s);
	}
}

void printPageTable(vectorp){
	cout<<"页表中的内容如下:"<::iterator it=p.begin();it!=p.end();it++){
		cout<pageNumber<<"\t"<sign<<"\t"<mainStorageBlockNumber<<"\t\t"<externalAddress<<"\t\t"<modifiedBit<p){
	cout<<"指令表的内容如下:"<::iterator it=p.begin();it!=p.end();it++)
		cout<operation<<"\t"<pageNumber<<"\t"<unitNumber<&p,vector&q){
	int absoluteAddress;
	vectorl;
	bool flag;
	for(vector::iterator it=q.begin();it!=q.end();it++){
		cout<<"当前指令:"<operation<<"\t"<pageNumber<<"\t"<unitNumber<::iterator it2;
		for(it2=p.begin();it2!=p.end();it2++)
			if(it->pageNumber==it2->pageNumber)
				break;
		if(it2->sign==1){
			absoluteAddress=it2->mainStorageBlockNumber*64+it->unitNumber;
			cout<<"绝对地址:"<operation=="存")
				it2->modifiedBit=1;
			flag=true;
			for(vector::iterator it3=l.begin();it3!=l.end();it3++)
				if(it->pageNumber==*it3){
					l.erase(it3);
					l.insert(l.begin(),it->pageNumber);
					flag=false;
					break;
				}
			if(flag){
				if(l.size()<4)
					l.insert(l.begin(),it->pageNumber);
				else{
					l.pop_back();
					l.insert(l.begin(),it->pageNumber);
				}
			}
		}
		else{
			cout<<"该页不在主存,产生缺页中断"<pageNumber);
			vector::iterator i;
			for(i=p.begin();i!=p.end();i++)
				if(i->pageNumber==t){
					i->sign=0;
					i->modifiedBit=-1;
					it2->sign=1;
					it2->mainStorageBlockNumber=i->mainStorageBlockNumber;
					i->mainStorageBlockNumber=-1;
					break;
				}
			absoluteAddress=it2->mainStorageBlockNumber*64+it->unitNumber;
			cout<<"绝对地址:"<::iterator i=l.begin();i!=l.end();i++)
			cout<<*i<<"";
		cout<p;
	vectorq;
	cout<<"初始化页表和指令表:"<

结果:

虚拟存储器管理(C++实现)_第1张图片

虚拟存储器管理(C++实现)_第2张图片

虚拟存储器管理(C++实现)_第3张图片

虚拟存储器管理(C++实现)_第4张图片

虚拟存储器管理(C++实现)_第5张图片

虚拟存储器管理(C++实现)_第6张图片

虚拟存储器管理(C++实现)_第7张图片

 

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