合肥学院计算机科学与技术系实验报告2014~2015学年第一学期课程操作系统原理实验名称编写用位示图法管理文件存储空间的分配与回收程序学生姓名侯康康1204013013章涛1204013015张德天1204013032何天龙1204013010专业班级12计本(3)指导教师屠菁2014年11月1实验目的(字体四号,宋体,行距1.2倍,段前段后0.5行)1.1理解文件存储空间的分配与回收的基本概念,掌握产生文件存储空间的分配与回收的几种方法,体会位示图算法是管理文件存储空间的分配与回收的一种行之有效的方法。1.2通过编写程序实现位示图算法,进一步理解位示图算法的原理和执行过程,掌握位示图算法的描述和应用,进一步熟练掌握文件存储空间的分配与回收的方法。2实验内容2.1程序首先要给出位示图初态。分配时,参数为文件名及需要分配的块数。回收时,参数为文件名。2.2回答信息:分配时,能够分配时,给出文件名和分配的具体块号。否则,给出无法分配的信息。显示位示图。2.3回收时:给出回收的具体块号。显示位示图。3实验步骤3.1位示图说明位示图算法是利用二进制的一位来表示磁盘中的一个盘块的使用情况。在外存上建立一张位示图(bitmap),记录文件存储器的使用情况。每一位仅对应文件存储器上的一个物理块,取值0和1分别表示空闲和占用。文件存储器上的物理块依次编号为:0、1、2、…。通常可用m*n个位数来构成位示图,并使m*n等于磁盘的总块数。位示图也可描述为一个二维数组map[m*n],如图(1)所示:01234567891011121314150110001110010111010001111110000111211100011111100003┇15图(1)位示图3.2概要设计3.2.1封装属性在新建作业时,我们需要知道的是作业名和作业块数。所以新建一个storeclass.java,里面封装两个属性,一个是作业名id;一个是作业块数,我们定义成一位数组ye.用来记录输入作业块数输入时在位示图中的位置。3.2.2各功能的实现3.2.2.1存储空间的分配算法首先要输入作业名和大小,若作业名已存在则报错;若没有,则比较空闲区中空闲块数是否大于欲分配的块数。有的话分配;没有的话报错;分配的时候该作业要记录下自己所占盘块的其实盘号和所占用的盘快数。并修改对应盘块的位示图的值。程序中对应的addpro.jsp是从add.jsp获取id(作业名)和num(块数),再进行分配操作,分配算法如下:Stringid=request.getParameter(id);intnum=Integer.parseInt(request.getParameter(num));booleanflag=false;intn=0;int[][]q=newint[8][8];LinkedListStoreClasslist=newLinkedListStoreClass();q=(int[][])session.getAttribute(a);list=(LinkedListStoreClass)session.getAttribute(list);StoreClasssc=newStoreClass();Stores=newStore();n=s.surplus(q);if(nnum){request.getRequestDispatcher(/error1.jsp).forward(request,response);}else{for(inti=0;ilist.size();i++){if(((StoreClass)list.get(i)).getId().equals(id)){flag=true;break;}}if(flag){request.getRequestDispatcher(/error2.jsp).forward(request,response);}else{sc.setId(id);intk=0;int[]temp=newint[64];for(inti=0;i64;i++){temp[i]=-1;}sc.setYe(temp);for(inti=0;i=7;i++){for(intj=0;j=7;j++){if(q[i][j]==0){q[i][j]=1;sc.getYe()[k]=i*8+j;k++;}if(k==num){//跳出循环break;}}if(k==num){//跳出循环break;}}list.add(sc);request.getRequestDispatcher(/main.jsp).forward(request,response);}}分配成功后跳转到main.jsp页面,即主界面。3.2.2.2、回收空间算法回收时首先要输入作业名,判断是否存在该作业,若该作业不存在则报错;回收的时候要将作业占用的内存块归还,简单来说就是将分配时的作业块收回,体现在位示图上就是状态由“1”变成“0”。程序中对应的deletepro.jsp是从delete.jsp获取id(作业名),再进回收操作,回收算法如下:Stringid=request.getParameter(id);booleanflag=false;inttempi=-1,tempj=-1;int[][]q=newint[8][8];q=(int[][])session.getAttribute(a);LinkedListStoreClasslist=newLinkedListStoreClass();list=(LinkedListStoreClass)session.getAttribute(list);StoreClassstore=newStoreClass();for(inti=0;ilist.size();i++){if(((StoreClass)list.get(i)).getId().equals(id)){store=(StoreClass)list.get(i);flag=true;break;}}if(!flag){request.getRequestDispatcher(/error3.jsp).forward(request,response);}else{list.remove(store);for(inti=0;i=63;i++){//将作业占用的内存块归还,将要撤销的进程是经过查找后的“m”.if(store.getYe()[i]!=-1){//页表存放的数字是内存块的地址(8*i+j)tempi=store.getYe()[i]/8;tempj=store.getYe()[i]%8;q[tempi][tempj]=0;}}request.getRequestDispatcher(/main.jsp).forward(request,response);}回收成功后跳转到main.jsp页面,即主界面。3.2.2.3、查看位示图信息输入作业名即可查看作业在位示图中的信息,若不存在该作业则报错;主要查看作业的页号(即作业在位示图中的位置)和块号,块号的计算公式也一并给出。程序中对应的Findpro.jsp是从Find.jsp获取id(作业名),再进行查看位示图信息操作,查看算法如下:Stringid=request.getParameter(id);booleanflag=false;intx=0,y=0;int[][]q=newint[8][8];q=(int[][])session.getAttribute(a);LinkedListStoreClasslist=newLinkedListStoreClass();list=(LinkedListStoreClass)session.getAttribute(list);StoreClassstore=newStoreClass();for(inti=0;ilist.size();i++){if(list.get(i).getId().equals(id)){flag=true;store=(StoreClass)list.get(i);break;}}if(!flag){request.getRequestDispatcher(/error3.jsp).forward(request,response);}else{%该作业的页表情况为br/页号-----------块号----------详细br/%for(inti=0;i=63;i++){if(store.getYe()[i]!=-1){x=store.getYe()[i]/8;y=store.getYe()[i]%8;out.println(i+---------------+store.getYe()[i]+--------------8*+x+++y);%br/%}}}%ahref=main.jsp返回主界面/a查看成功后可选择返回到main.jsp页面,即主界面。3.3各算法流程图3.3.1盘块的分配如下流程图(2):否是否是顺序将作业分配到位示图中,修改位示图中的状态输入文件名,和块数.判断空间是否足够判断作业是否存在返回图(2)分配流程图3.3.2盘块的回收如下流程图(3):否是否是图(3)回收流程图是否删除此作业输入id是否存在此作业删除此作业,修改位示图中的状态返回显示提示信息3.3.3查看作业信息如下流程图(4)否是图(4)作业流程图3.4调试分析以及运行结果3.4.1主界面通过网页我们看到的如下所示,这是程序初始化时出现的界面图(5):查找作业输入id显示作业信息内容返回显示没找到图(5)主界面3.4.2测试添加添加数据作业名os,块数6;如图(6)添加数据作业o,块数9:如图(7)图(6)添加数据1页面图(7)添加数据2页面运行结果如图(8)图(9)图(8)添加结果1图(9)添加结果23.4.3测试查看查看数据作业名o;图(10)图(10)查看数据运行结果为图(11)图(11)查看结果3.4.4测试删除测试数据:作业名o如图(12)图(12)删除作业运行结果如图(13)图(13)删除运行结果小结:运行结果和理论结果相同并符合实验要求,结果满足位示图法基本原理。四实验总结在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间。如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半。做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛。实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。在这里我深深体会到理论对实践的指导作用:懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。五附录主要源代码LoginServlet.javapackagehkk.domain;importjava.io.IOException;importjava.util.LinkedList;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.s