操作系统实验七——模拟虚拟存储管理(下)

本文探讨了程序开发中内存管理的关键概念,并通过具体代码展示了如何实现页面置换算法,包括创建作业、指令集以及FIFO置换策略的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

下面是我的代码(根据实验指导上面的思想做的):

#include<string>
#include<iostream>
using namespace std;
struct Page//页表结构
{
	int numPage;//页号
	bool flagPage;//装入标志
    int numMemory;//内存块号
	bool flagChang;//修改标志
	int hardPosition;//外存地址
};
Page job[7];
int p[4]={0,1,2,3};//已装入内存的页面
int k=0;//指向当前需置换的页面
void creatJob()//创建Job
{
	job[0].numPage=0;
	job[0].flagPage=true;
	job[0].numMemory=5;
	job[0].flagChang=false;
	job[0].hardPosition=011;
	job[1].numPage=1;
	job[1].flagPage=true;
	job[1].numMemory=8;
	job[1].flagChang=false;
	job[1].hardPosition=012;
	job[2].numPage=2;
	job[2].flagPage=true;
	job[2].numMemory=9;
	job[2].flagChang=false;
	job[2].hardPosition=013;
	job[3].numPage=3;
	job[3].flagPage=true;
	job[3].numMemory=1;
	job[3].flagChang=false;
	job[3].hardPosition=021;
	job[4].numPage=4;
	job[4].flagPage=false;
	job[4].numMemory=0;
	job[4].flagChang=false;
	job[4].hardPosition=022;
	job[5].numPage=5;
	job[5].flagPage=false;
	job[5].numMemory=0;
	job[5].flagChang=false;
	job[5].hardPosition=023;
	job[6].numPage=6;
	job[6].flagPage=false;
	job[6].numMemory=0;
	job[6].flagChang=false;
	job[6].hardPosition=121;	
}
struct Command//指令结构(简化版)
{
	string OperateOne;//第一个操作
    int PageOne;//第一个操作数
	int UnitOne;//第一个操作数的单元号
	string OperateTwo;//第二个操作
	int PageTwo;//第二个操作数
	int UnitTwo;//第二个操作数的单元号
};
Command command[6];
void creatCommand()
{
  command[0].OperateOne="+";
  command[0].PageOne=0;
  command[0].UnitOne=70;
  command[0].OperateTwo="移位";
  command[0].PageTwo=4;
  command[0].UnitTwo=53;
  command[1].OperateOne="+";
  command[1].PageOne=1;
  command[1].UnitOne=50;
  command[1].OperateTwo="+";
  command[1].PageTwo=5;
  command[1].UnitTwo=23;
  command[2].OperateOne="*";
  command[2].PageOne=2;
  command[2].UnitOne=15;
  command[2].OperateTwo="存";
  command[2].PageTwo=1;
  command[2].UnitTwo=73;
  command[3].OperateOne="存";
  command[3].PageOne=3;
  command[3].UnitOne=21;
  command[3].OperateTwo="取";
  command[3].PageTwo=2;
  command[3].UnitTwo=78;
  command[4].OperateOne="取";
  command[4].PageOne=0;
  command[4].UnitOne=56;
  command[4].OperateTwo="+";
  command[4].PageTwo=4;
  command[4].UnitTwo=1;
  command[5].OperateOne="-";
  command[5].PageOne=6;
  command[5].UnitOne=40;
  command[5].OperateTwo="存";
  command[5].PageTwo=6;
  command[5].UnitTwo=84;
}
int main()
{
	creatJob();
	creatCommand();
	for(int i=0;i<6;i++)
	{
Loop1:
		if(job[command[i].PageOne].flagPage==true)//如果该页存在则输出,若不存在则按照FIFO算法调入
		{
			if(command[i].OperateOne=="存"||command[i].OperateOne=="移位")//如果是“存”,则“修改标志位”为true
              job[command[i].PageOne].flagChang=true;
            cout<<"页号 "<<command[i].PageOne<<"的绝对地址为:"<<job[command[i].PageOne].numMemory*128+command[i].UnitOne<<"\n";
		}
		else
		{
		  if(job[p[k]].flagChang==true)//如果修改过则先调出
			  cout<<"out "<<p[k]<<"\n";
		  //装入页面:1.打印要装入的页号2.修改要装入页面的装入标志位3.将调出页面的装入标志位置为false4.将当前页面的内存块号赋值给要装入的内存块号5.修改数组p[]6.修改指针k
			  cout<<"in "<<command[i].PageOne<<"\n";//调入		  
			  job[command[i].PageOne].flagPage=true;//装入标志置为true
			  job[p[k]].flagPage=false;
			  job[command[i].PageOne].numMemory=job[p[k]].numMemory;//将要覆盖的页面的内存块号赋值给要装入的内存块号
			  p[k]=command[i].PageOne;
		      k=(k+1)%4;
			  goto Loop1;
		}
Loop2:
		if(job[command[i].PageTwo].flagPage==true)
		{
			if(command[i].OperateTwo=="存"||command[i].OperateTwo=="移位")
              job[command[i].PageTwo].flagChang=true;
           cout<<"页号 "<<command[i].PageTwo<<"的绝对地址为:"<<job[command[i].PageTwo].numMemory*128+command[i].UnitTwo<<"\n";
		}
		else
		{
			if(job[p[k]].flagChang==true)//如果修改过则先调出
			  cout<<"out "<<p[k]<<"\n";
			  cout<<"in "<<command[i].PageTwo<<"\n";//调入
              job[command[i].PageTwo].flagPage=true;//装入标志置为true
			  job[p[k]].flagPage=false;
			  job[command[i].PageTwo].numMemory=job[p[k]].numMemory;//将要覆盖的页面的内存块号赋值给要装入的内存块号
			  job[command[i].PageTwo].flagPage=true;
			  p[k]=command[i].PageTwo;//调入
			  k=(k+1)%4;
			  goto Loop2;
		}
	}
	for(int a=0;a<4;a++)
	   cout<<p[a]<<"  ";
	cout<<"\n";
	return 0;
}

结果如下:


 

实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值