您好,欢迎访问三七文档
合肥学院计算机科学与技术系实验报告2014~2015学年第一学期课程操作系统原理实验名称用先进先出(FIFO)页面调度算法处理缺页中断学生姓名陈信耀、夏威胡飞、宋俊专业班级12级软件工程指导教师屠菁2014年12月1.实验目的熟悉、掌握先进先出FIFO算法,并实现用先进先出FIFO算法页面调度算法处理缺页中断.理解基于先进先出FIFO的内存管理调度算法,更好的掌握算法的思想,结合实验理解算法更直观,深刻具体。通过对先进先出FIFO的调度算法的模拟实验可以清楚的了解内存管理是如何调度的,以及加深对内存管理的了解。2.实验内容算法思想:该算法总是淘汰最先进入内存的页面,既选择内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需要把一个进程已调入内存的页面,按照先后测序链接成一个队列,并设置一个指针,使他总是指向最老的页面。编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写JSP页面对所作工作进行显示,并进行相关测试。假定主存的每块长度为128个字节;现有一个共七页的作业,其中第0页至第3页已经装入主存,其余三页尚未装入主存;该作业的页表如表1-1所示:表1-1初始页表015011118012219013311021400225002360121该作业的初始操作序列如表1-2所示:表1-2初始操作序列表操作页号单元号操作页号单元号+070移位4053+150+5023×215存1037存321取2078取056+4001-640存6084运行设计的地址转换程序,显示或打印运行结果。3.实验步骤任务分析当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已没有空闲块,则用FIFO页面调度算法把作业中最先进入主存的一页调出,存放在外存上,然后把要访问的页装入该块。调入和装入后都要修改页表中对应页的标志,然后进行地址转换。InitialiseAction类完成了对页表信息和初始操作信息的初始化,OperateAction类完成了对缺页中断的判断、处理以及后来的地址转换。本次实验的模拟算法流程图如图1-1所示:开始YNNYNYNY图1-1模拟算法流程图概要设计:首先定义三个bean类用于封装页表信息、操作序列信息和需要显示的信息,取一条指令得到该指令要访问的页号(lPageNum)查页表页标志是否为1?形成绝对地址是否为“存”指令?置lPageNum页修改标志为1输出绝对地址是否有后继指令?取下一条指令结束输出页号replacedPage=p[k]replacedPage页的修改标志是否为1?输出淘汰页号输出调入页号P[k]=lPageNum,k=(k+1)modm修改页表这三个bean类分别是PageInfoBean类、OperateInfoBean类以及ShowInfoBean类,然后定义两个action类,一个action类InitialiseAction用于初始化页表信息和操作序列信息(即为他们赋上初值),另一个action类OperateAction用于模拟发出缺页中断、处理缺页中断以及转换地址等。详细设计:本次模拟程序我们共定义了五个类和两个JSP页面,分别介绍如下:PageInfoBean类中的先是申明相关属性的范围,然后生成了每个属性的get和set方法(此处省略)以供后续调用。publicclassPageInfoBean{//封装页面信息privatelongpageNum;//页号privateintflag;//标志privatelongblock;//块号privateintmodify;//修改标志privatelonglocation;//在磁盘中位置}OperateInfoBean类中也是先申明了相关属性,然后生成了各自属性的get和set方法(此处省略)以供后续调用。publicclassOperateInfoBean{//封装指令序列privateStringoperate;//操作privateintpageNum;//页号privatelongunitNum;//单元号}ShowInfoBean类中申明了相关属性(即显示的内容),以及生成了它的get和set方法(此处省略)以供后续调用。publicclassShowInfoBean{//封装最后显示的信息privateStringoperate;//操作privateintpageNum;//页号privateintflag;//标志privatelongblock;//块号privateintmodify;//修改标志privateStringlocationOne;//绝对地址privateStringpageChange;//页号改变方向privatelonglocation;//在磁盘中位置privateintarrayValue;}InitialiseAction类只负责将页表信息和操作序列表进行初始化即可,无其他功能。OperateAction类中先是初始化需要用到的各类,然后定义相关变量,然后利用for()循环逐步对操作序列表进行操作,每次查序列表时先是获得待操作的页号,再到页表中获取对应页号的标志位,然后使用if()语句对标志位进行判断,当标志位为0时,说明该页不在主存,则,发出缺页中断,利用先入先出算法(FIFO)淘汰最先进入主存的页,然后调入需要装载进主存的页,分别获取需要显示的信息并封装在ShowInfoBean类中,将页表中淘汰的页号改为0,装入的页号改为1,块号改为-1以及修改标志置为0;如何最后计算转换地址,并对判断操作是否为“存”是的话,将修改标志置为1,然后判断标志是否为0,进行页号转换的输出和绝对地址的输出形式,最后将所以的信息放入List()集合,返回list集合。编写JSP页面显示初始化的页表和操作序列信息,以及模拟缺页中断程序执行后的结果信息。程序的输入如图1-2和图1-3所示:图1-2页表初始信息图1-3操作序列初始信息程序的输出如图1-4所示:图1-4模拟缺页中断输出4.实验总结本次实验是通过模拟FIFO(先进先出)调度算法处理缺页中断,主要思想是先把进程调入页面,按次序链接成一个队列,并设置指针一直指向最先进入主存的页面。然后将该页面调出,调入输入的页面。通过对先进先出FIFO算法的模拟实现,加深了对内存管理调度的理解,理解了其如何分配内存的过程,本程序较简单但在实现过程中遇到很多问题,一开始总是出错,程序无法运行,通过调试后在运行过程中每发生缺页中断就发生错误无法继续运行。这次的程序是我们几个同学一起研究探讨出来的,在设计的过程中也出现了一些分歧,最后采用了谁最优最简的标准。为以后团队工作也算是一个基础。5.附录程序源代码PageInfoBean类packagecn.edu.hfuu.pagebean;publicclassPageInfoBean{//封装页面信息privatelongpageNum;//页号privateintflag;//标志privatelongblock;//块号privateintmodify;//修改标志privatelonglocation;//在磁盘中位置publiclonggetPageNum(){returnpageNum;}publicvoidsetPageNum(longpageNum){this.pageNum=pageNum;}publicintgetFlag(){returnflag;}publicvoidsetFlag(intflag){this.flag=flag;}publiclonggetBlock(){returnblock;}publicvoidsetBlock(longblock){this.block=block;}publicintgetModify(){returnmodify;}publicvoidsetModify(intmodify){this.modify=modify;}publiclonggetLocation(){returnlocation;}publicvoidsetLocation(longlocation){this.location=location;}}OperateInfoBean类packagecn.edu.hfuu.pagebean;publicclassOperateInfoBean{//封装指令序列privateStringoperate;//操作privateintpageNum;//页号privatelongunitNum;//单元号publicintgetPageNum(){returnpageNum;}publicvoidsetPageNum(intpageNum){this.pageNum=pageNum;}publicStringgetOperate(){returnoperate;}publicvoidsetOperate(Stringoperate){this.operate=operate;}publiclonggetUnitNum(){returnunitNum;}publicvoidsetUnitNum(longunitNum){this.unitNum=unitNum;}}ShowInfoBean类packagecn.edu.hfuu.pagebean;publicclassShowInfoBean{//封装最后显示的信息privateStringoperate;//操作privateintpageNum;//页号privateintflag;//标志privatelongblock;//块号privateintmodify;//修改标志privateStringlocationOne;//绝对地址privateStringpageChange;//页号改变方向privatelonglocation;//在磁盘中位置privateintarrayValue;publicintgetArrayValue(){returnarrayValue;}publicvoidsetArrayValue(intarrayValue){this.arrayValue=arrayValue;}publicStringgetLocationOne(){returnlocationOne;}publicvoidsetLocationOne(StringlocationOne){this.locationOne=locationOne;}publicStringgetOperate(){returnoperate;}publicvoidsetOperate(Stringoperate){this.operate=operate;}publicintgetPageNum(){returnpageNum;}publicvoidsetPageNum(intpageNum){this.pageNum=pageNum;}publicintgetFlag(){returnflag;}publicvoidsetFlag(intflag){this.flag=flag;}publiclonggetBlock(){returnblock;}publicvoidsetBlock(longblock){this.block=block;}publicintgetModify(){returnmodify;}publicvoidsetModify(intmodify){this.modify=modify;}publicStringgetPageChange(){returnpageChange;}publicvoidsetPageChange(StringpageChange){this.pageChange=pageChange;}publiclonggetLocat
本文标题:操作系统大实验
链接地址:https://www.777doc.com/doc-3369772 .html