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

本文介绍了一个基于FIFO算法的简单页面置换过程实现。通过定义页表结构和指令结构,模拟了进程运行中页面的调入和调出流程,并展示了如何处理不在内存中的页面以确保程序能够正确执行。

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

#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; }

结果如下:


完整虚拟存储管理实验报告!一、实验目的请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。二、实验环境 Turbo C 2.0/3.0或VC++6.0三、实验内容本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。四、实验说明 1.设计中虚页和实页的表示本设计利用C语言的结构体来描述虚页和实页的结构。pnpfntimepnpfnnext 虚页结构 实页结构在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。在实页结构中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。2.关于缺页次数的统计为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。3.LRU算法中“最近最久未用”页面的确定为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。4.算法中实页的组织因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问的一个虚页不在实页中时,将产生缺页中断。此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:对于FIFO算法要将busy_head 所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。~
实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值