分页系统模拟实验设计文档文档格式.docx
《分页系统模拟实验设计文档文档格式.docx》由会员分享,可在线阅读,更多相关《分页系统模拟实验设计文档文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
源程序代码20
1.绪论
1.1设计思想
本设计实现进程的分页式内存分配和地址转换过程并进一步实现请求分页式存储分配和地址转换过程。
再通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
请求分页调度是仅当需要访问程序和数据时,通过发生缺页中断并由缺页中断处理程序分配页框再把所在页面装入主存。
分页式虚拟存储系统排除了主存储器实际容量的约束,能使更多的作业同时多道运行,从而,提高了系统的效率。
但缺页中断的处理要付出相当大的代价,由于页面的调入、调出要增加I/O的负担而且影响系统效率,因此应尽可能的减少缺页中断的次数。
实现虚拟存储器能给用户提供一个容量很大的存储空间,但当贮存已装满而又要装入新页时,必须按一定的算法把已在内存的一些页面掉出去,这个工作称页面替换。
所以,页面替换就是用来确定应该淘汰哪页的算法。
算法的选择是很重要的。
1.2设计目的
1.通过模拟实现对请求分页虚拟存储器管理中的硬件地址变换的算法,熟练使用所学知识完成地址转换过程。
通过硬件地址转换加深对请求分页系统的原理和实现过程的理解。
2.通过模拟实现请求分页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点。
掌握虚拟存储中请求页式存储管理的几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
1.3设计要求
在页式虚拟存储管理中,如果访问的页面在内存,计算出相应的物理地址,如果访问的页面不在内存,产生缺页中断,将所缺页从外存调入,如果内存没有空间需要将内存的一页淘汰,再将所缺页调入,然后计算出相应的物理地址。
设计一个地址转换程序来模拟硬件的地址转换。
在页式虚拟存储管理中,设计一个虚拟存储区和内存工作区,编辑程序演示FIFO和LRU算法的具体实现过程,并计算访问命中率。
演示页面置换的两种算法。
通过随机数产生一个指令序列,将指令序列转换成为页地址流。
计算并输出各种算法在不同内存容量下的缺页率。
1.4解决方案
(一)硬件地址变换算法
请求分页虚拟存储管理技术是把作业地址空间的全部信息存放在磁盘上。
当作业被选中运行时,先把作业的开始几页装入主存并启动运行。
为此在为作业建立页表时,应说明哪些页已在主存,哪些页不在主存。
页表的格式如表1-1所示,其中,”标志”表示对应页是否已经装入主存:
(1)“1”表示对应页已经装入主存;
(2)“0”表示对应页未装入主存;
(3)“主存快号”表示该页对应的主存快号;
(4)“修改位”指示该页调入主存后是否修改过的标志。
(5)“外存地址”指示该页所在的外存地址。
(6)自己设计一个主存分块表。
表1-1页表
页号
标志
主存号
外存地址
修改位
1
5
011
8
012
2
9
013
3
10
015
4
017
025
6
212
7
213
(二)FIFO页面置换算法
先用boolIsExit()函数判断请求页面是否在内存中,在内存中就直接运行,不在的话,就通过Simulate[x][y%M]算出先进来的页面,比如假如第6个数内存中没有,那置换时第6行第1列数一定是第一个进来的,我y的值这时候是6,然后y除以m取余,就是6除以5取余也就是1,然后将第一个置换出来,下面的就是重复上面的过程了。
每次要置换时LackNum的值就会加1,最后输出页面的置换的过程,算出缺页率。
(三)LRU页面置换算法
先用intIsExitLRU()函数判断请求页面是否在内存中,在内存中就直接运行,不在的话,intCompare()算出需要置换的页面,这个功能的实现需要数组PageCount[]来实现。
PageCount[]这个数组记录着内存里5个物理块使用情况,找出需要置换的页面的列数,然后赋值给k,在通过Simulate[x][k]=PageOrder语句置换,每次要置换时LackNum的值就会加1,最后输出页面的置换的过程,算出缺页率。
2.概要设计
2.1总体设计模块
在对分页系统模拟的需求分析基础上,对系统整体结构进行了设计,此系统总体结构包括以下几个模块:
开始界面,硬件地址变换界面,页面置换算法界面,输入逻辑地址指令界面,产生物理地址界面,产生随机序列指令界面,LRU算法界面,FIFO算法界面,显示缺页次数和缺页率界面,退出界面。
因此,其总体设计模块图如图3.1所示:
图3.1总体设计模块图
2.2结构说明
(1)作业在执行时,指令中的逻辑地址指出参加运算的操作数(或指令)地址中的页号和页内偏移量。
硬件地址转换机构按页号查页表。
(2)若该页的标志为1,则表示该页已在主存,从而找到该页对应的主存块号。
(3)根据关系式:
绝对地址=块号*块的长度+页内偏移量
(4)计算出欲访问的主存地址。
由于页号为2的整次幂,所以只要将块号与页内偏移量相拼接,放入主存地址寄存器即可。
按照该地址取指令或取操作数,完成指定的操作。
(1)在分配内存页面数小于进程页面数时,当然是最先运行的页面放入内存。
(2)这时有需要处理新的页面,则将原来内存中的页面最先进入的调出(是以称为FIFO),然后将新页面放入。
(3)以后如果再有新页面需要调入,则都按
(2)的规则进行。
(1)当分配内存页面数小于进程页面数时,当然是把最先执行的页面放入内存。
(2)当需要调页面进入内存,而当前分配的内存页面全部不空闲时,选择将其中最长时间没有用到的那个页面调出,以空出内存来放置新调入的页面(称为LRU)。
(3)以后如果再有新页面需要调入,则都按⑵的规则进行。
2.3数据结构
定义的变量:
#definebsize4//物理块大小
#definepsize16//进程大小
intyemianliu[32]={0};
//全局变量数组,地址流
voidchangeaddr(structPagep[],intlogaddr)//地址变换
srand(time(0));
//随机产生指令序列
yemianliu[i]=t;
//将随机产生的指令数存入页面流
intPageOrder[MaxNum];
//页面请求
intSimulate[MaxNum][M];
//页面访问过程
intPageCount[M],LackNum;
//PageCount用来记录LRU算法中最久未使用时间,LackNum记录缺页数
floatPageRate;
//命中率
函数说明:
boolIsExit(inti)//FIFO算法中判断新的页面请求是否在内存中
intIsExitLRU(inti)//LRU算法中判断新的页面请求是否在内存中
intCompare()//LRU算法找出内存中需要置换出来的页面
voidInit()//初始化页框
voiddesignBy()//给自己加的一个标题
voidOutPut()//输出
voidFIFO()//FIFO算法
voidLRU()//LRU算法
voidYourChoice(intchoice)//实现你选择哪个算法的功能
3.详细设计
从分页系统模拟总体设计图可以看出,系统体系结构是由多个特殊模块组成的。
为了进一步说明系统的体系框架,对系统的各个功能模块进行详细的设计,各模块函数说明及设计流程图如下。
3.1主函数声明及硬件地址变换实现
主函数包括以下模块:
菜单模块,随机产生序列号函数模块,查找空闲物理块,查找相同进程,初始化内存,先进先出页面置换算法模块,最近最久未使用算法模块。
先定义主函数,voidmain(),再进行初始化函数,调用voidchushihua(),定义全局变量数组,地址流—intyemianliu[32]={0},其功能是先由Srand()和Rand()函数定义和随机产生指令序列,然后将指令序列变换成相应的页地址流存入地址流数组里。
进行页面定义:
structPage{intpno;
//页号intflag;
//标志位intcno;
//主存号intmodf;
//修改位intaddr;
//外存地址}Page;
进行主菜单定义:
调用voidmenu(),随机产生一个进程序列号。
输入有误,则重新输入,break返回选择界面。
再进行硬件地址变换的调用,voiddizhizhuanhuan(),定义指令的逻辑地址,intins。
Cout合法输入逻辑地址,调用地址变换函数voidchangeaddr(structPagep[],intlogaddr),其功能是实现模拟请求分页虚拟存储管理中的硬件地址变化过程。
形成正确的页面号,主存号,偏移量,判断该页是否产生缺页中断。
形成物理地址,cout<
<
“物理地址为:
”<
addr<
endl,再形成详细信息cout<
"
详细信息。
输入有误则调用default:
cout<
“输入有误,请重新输入!
“<
endl;
break。
其流程图如图3.1所示:
图3.1硬件地址变换算法流程图
3.2设计页面置换算法实现分页管理的缺页调度
先进先出页面置换算法的基本思想:
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
该算法实现简单只需把一个进程已调入内存的页面,按先后次序存入一个时间数组,并将其中时间值最大的页面进行淘汰,并替换入新的页面就可以实现。
最近最久未使用页面置换算法的基本思想:
当需要淘汰某一页时,选择离当前时间最近的一段时间内最久没有使用过的页先淘汰。
该算法的主要出发点是,如果某页被访问了,则它可能马上还被访问。
或者反过来说,如果某页很长时间未被访问,则它在最近一段时间不会被访问。
先调用页面置换函数,voidymzh(),包括页面置换算法的具体实现yemianzhihuan(),先随机产生一个进程序列号printf("
随机产生一个进程序列号为:
\n"
)。
定义的主函数中包含intwang()进行页面置换算法的实现。
先使用先进先出页面置换算法,调用函数voidFIFO(),找flag的最大值,判断是否存在相同进程和空闲物理块,计算缺页次数。
再使用最近最久未使用页面置换算法,调用voidLRU()取得在内存中停留最久的页面,默认状态下为最早调入的页面,判断页面是否已在内存中,记录调入页面记录当前的内存单元中的页面,输出缺页次数和缺页率。
其流程图分别如图3.2和3.3所示:
图3.2FIFO算法流程图
图3.3LRU算法流程图
4.调试分析
使用VisualC++6.0对分页模拟实验系统进行调试。
对硬件地址变换模块和页面置换模块分别进行调试,输入不同的指令,如输入指令的逻辑地址,观察期物理地址及详细信息。
或者输入产生随机序列指令,在用最近最久未使用法和先进先出法分别计算缺页率和缺页次数。
可以随时选择退出中断程序系统。
再输入数据不符合要求时,显示输入有误,则需要重新输入合法数据。
总之,这个程序系统达到了预期的效果,并且加入了一些相应的界面与功能,可以进行不同类型的选择。
4.1开始运行分页模拟实验系统
(1)选择1进入下一个界面
图4.1开始界面
4.2进入硬件地址变换界面
(2)选择输入指令进入下一个界面
图4.2硬件地址变换界面
4.3输入指令的逻辑地址
(3)输入合法逻辑地址
图4.3输入逻辑地址
4.4显示物理地址和详细信息
(4)选择2进入下一个界面
图4.4显示界面
4.5进入页面置换算法界面
(5)选择1产生随机序列
图4.5页面置换算法界面
4.6随机产生一个进程序列号
(6)选择2使用LRU算法
图4.6产生随机序列
4.7使用LRU算法计算缺页次数和缺页率
(7)选择3使用FIFO算法
图4.7使用LRU算法
4.8使用FIFO算法计算缺页次数
(8)选择0退出
图4.8使用FIFO算法
4.9测试结果分析
这次设计中,当逻辑地址对应的页面在主存中时,地址变换完全正确,符合要求。
当页面不在主存中时,仅输出“页面中断”,没有进行页面替换算法的操作,与真实情况相差较大。
而且页面置换算法设计有一定的难度,关键是在页面调度算法的编写上,在FIFO算法中,算法的思想是先进先出,这样的算法相当于有一个队列,用来保存页面,在队列的对头出队列,在队尾进入队列,而在中间过程判断有没有此页面已经存在是核心。
而在LRU算法中,要求我们能够体会LRU算法的精髓。
在本算法中,我们要能够计算空间中各页面的最久未使用的时间。
所以增加了一定的难度,我在本次的实验中,用了一个函数,来返回需要置换的页面的上个页面地址。
5.设计总结
这次操作系统课程设计,让我们对操作系统有了更深的认识,首先操作系统是一管理电脑硬件与软件资源的程序,同时也是计算机系统内核与基石。
操作系统是一个庞大的管理控制程序,大致包括5个方面的管理功能:
进程与处理机管理、作业管理、存储管理、设备管理、文件管理。
我们这次课程设计的题目是分页系统模拟实验,是属于存储器管理。
设计的系统中使用的地址变换机构可通过逻辑地址与主存块长度作取整运算获得逻辑地址对应的页面号,再通过求余运算获得页内偏移地址。
在进程运行过程中,若其访问的页面不在内存而需把它们调入内存,但内存以无空闲空间时,为了保证该进程能正常的运行,系统必须从内存中调出一页程序或数据送磁盘的兑换区中,但应将哪个页面调出,需根据一定的算法来确定。
通常,把选择换成页面的算法称为页面置换算法。
通过本次课程设计,我们对页面置换算法的了解更加的深刻。
每种算法都有各自的优缺点,FIFO算法与进程实际运行的规律不相适用,因为在进程中,有些页面经常被访问;
LRU算法是根据页面调入内存后的使用情况进行决策的。
在这次课程设计中,遇到了一些困难,例如怎么实现各种算法,如何进行函数调用及对数据的限制操作等,在遇到这些困难的时候,我们会去查阅资料,仔细看书,尝试用不同的方法解决,在各种方法中选择一种最好的方法,有的时候会碰到不知道如何实现的函数,我们会查看MSDN,这次是用的C++语言做的,每一步都是自己独立完成的,这次课程设计我最大的收获是学以致用,通过这次设计我们看到了自己学习的能力,我们相信在以后的学习中,会更加的努力上进。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》[M].西安:
西安电子科技大学学出版社.1996年
2.王万森.《计算机操作系统原理》[M].北京:
高等教育出版社.2001年
3.周长林,左万历.《计算机操作系统教程》[M].北京:
高等教育出版社.1994年
4.黄廷辉,王宇英.《计算机操作系统实践教程》[M].北京:
清华大学出版社.2007年5月
5.殷兆麟.《计算机操作系统》[M].北京:
清华大学出版社.2007年3月
6.张尧学,史美林,张高.《计算机操作系统教程》[M].北京:
清华大学出版社.1993年
致谢
在两个星期的课程设计中,我遇到了不少的问题,但在我个人的努力和大家的帮助下,最后终于成功完成了所要求的课程设计题目。
在这次课程设计中,我们得到了马老师和陈老师的精心指导以及孜孜不倦的教诲,在老师的指导下,我们的能力得到了提高,同时养成了科学、严谨的作风和习惯,在此,我们对老师的精心栽培表示衷心的感谢!
感谢我们小组同学对我的帮助和指点,尤其感谢我的舍友在非常时期,在生活和学习上帮我许多忙。
在课程设计完成之际,我的心情无法平静,从开始进入课题到课设的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意。
源程序代码
#include<
iostream>
process.h>
stdlib.h>
#include<
ctime>
conio.h>
stdio.h>
string.h>
usingnamespacestd;
#defineMyprintfprintf("
|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n"
)/*表格控制*/
voidchushihua();
//初始化函数
voidymzh();
voidyemianzhihuan();
voidchangeaddr(structPagep[],intlogaddr);
voiddizhizhuanhuan();
voidmenu();
intwang();
intyemianliu[32]={0};
intp;
structPage{
intpno;
//页号
intflag;
//标志位
intcno;
//主存号
intmodf;
//修改位
intaddr;
//外存地址
}Page;
//全局变量p是一共有多少地址流
typedefstructpage1
{
intnum;
/*记录页面号*/
inttime;
/*记录调入内存时间*/
}Page1;
/*页面逻辑结构,结构为方便算法实现设计*/
Page1b[bsize];
/*内存单元数*/
intc[bsize][psize];
/*暂保存内存当前的状态:
缓冲区*/
intqueue[100];
/*记录调入队列*/
intK;
/*调入队列计数变量*/
intphb[bsize]={0};
//物理块标号
intpro[psize]={0};
//进程序列号
intflag[bsize]={0};
//进程等待次数(存放最久未被使用的进程标志)
inti=0,j=0,k=0;
//i表示进程序列号,j表示物理块号
intm=-1,n=-1;
//物理块空闲和进程是否相同判断标志
intmax=-1,maxflag=0;
//标记替换物理块进程下标
intcount=0;
//统计页面缺页次数
voidchushihua()//初始化函数
{
intt;
srand(time(0));
p=12+rand()%32;
cout<
地址流序列:
;
endl;
for(inti=0;
i<
p;
i++)
{
t=1+rand()%9;
yemianliu[i]=t;
}
for(i=p-1;
i>
=0;
i--)
cout<
yemianliu[i]<
"
}
voidymzh()
chushihua();
yemianzhihuan();
voidyemianzhihuan()
inta;
printf("
------------------------------------------\n"
);
☆☆^-^欢迎使用分页模拟实验系统^-^☆☆\n"
☆☆☆☆☆☆☆☆☆☆☆☆\n"
☆1.进入硬件地址变换算法☆\n"
☆-------------------------------☆\n"
☆2.进入页面置换算法☆\n"
请输入您的选择:
switch(a)
{
case1:
ymzh();
break;
case2:
wang();
default:
cout<
输入有误,请重新输入!
}
voidchangeaddr(structPagep[],intlogaddr){//地址变换
intj=logaddr/64;
//对应的块号
intk=logaddr%64;
//对应的偏移量
intflag=0;
8;
{
if(p[i].pno==j)//找到对应的页号
if(p[i].flag==1)//页面标志为1
{
addr=p[i].cno*64+k;
cout<
物理地址为:
详细信息:
\t页面号:
p[i].pno<
\t主存号:
p[i].cno<
\t偏移量:
k<
flag=1;
break;
}