位示图实验报告.docx
- 文档编号:7347372
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:23
- 大小:100.84KB
位示图实验报告.docx
《位示图实验报告.docx》由会员分享,可在线阅读,更多相关《位示图实验报告.docx(23页珍藏版)》请在冰点文库上搜索。
位示图实验报告
合肥学院
计算机科学与技术系
实验报告
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)所示:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
1
1
0
0
0
1
1
1
0
0
1
0
1
1
1
0
1
0
0
0
1
1
1
1
1
1
0
0
0
0
1
1
1
2
1
1
1
0
0
0
1
1
1
1
1
1
0
0
0
0
3
┇
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];
LinkedList
q=(int[][])session.getAttribute("a");
list=(LinkedList
StoreClasssc=newStoreClass();
Stores=newStore();
n=s.surplus(q);
if(n request.getRequestDispatcher("/error1.jsp").forward( request,response); } else{ for(inti=0;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;i<64;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"); LinkedList list=(LinkedList StoreClassstore=newStoreClass(); for(inti=0;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"); LinkedList list=(LinkedList StoreClassstore=newStoreClass(); for(inti=0;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{ %> 该作业的页表情况为 页号-----------块号----------详细 <% 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);%> <%} } } %> 查看成功后可选择返回到main.jsp页面,即主界面。 3.3各算法流程图 3.3.1盘块的分配如下流程图 (2): 否 是 否 是 图 (2)分配流程图 3.3.2盘块的回收如下流程图(3): 否 是 否是 图(3)回收流程图 3.3.3查看作业信息如下流程图(4) 否 是 图(4)作业流程图 3.4调试分析以及运行结果 3.4.1主界面 通过网页我们看到的如下所示,这是程序初始化时出现的界面图(5): 图(5)主界面 3.4.2测试添加 添加数据作业名os,块数6;如图(6) 添加数据作业o,块数9: 如图(7) 图(6)添加数据1页面 图(7)添加数据2页面 运行结果如图(8)图(9) 图(8)添加结果1 图(9)添加结果2 3.4.3测试查看 查看数据作业名o;图(10) 图(10)查看数据 运行结果为图(11) 图(11)查看结果 3.4.4测试删除 测试数据: 作业名o如图(12) 图(12)删除作业 运行结果如图(13) 图(13)删除运行结果 小结: 运行结果和理论结果相同并符合实验要求,结果满足位示图法基本原理。 四实验总结 在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间。 如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半。 做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。 做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛。 实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。 在这里我深深体会到理论对实践的指导作用: 懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。 我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。 五附录 主要源代码 LoginServlet.java packagehkk.domain; importjava.io.IOException; importjava.util.LinkedList; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; publicclassLoginServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=-8271620964273835730L; @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ this.doPost(req,resp); } @Override protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ //跳转到登录页面 LinkedList int[][]a=newint[8][8]; for(inti=0;i<=7;i++){ for(intj=0;j<=7;j++){ a[i][j]=0; } } HttpSessionsession=req.getSession(); session.setAttribute("a",a); session.setAttribute("list",list); req.getRequestDispatcher("/main.jsp").forward(req,resp); } } StoreClass.java packagehkk.domain; publicclassStoreClass{ Stringid; int[]ye=newint[64]; publicStringgetId(){ returnid; } publicvoidsetId(Stringid){ this.id=id; } publicint[]getYe(){ returnye; } publicvoidsetYe(int[]ye){ this.ye=ye; } } Addpro.jsp <%@pagelanguage="java"import="java.util.*,hkk.domain.*"pageEncoding="UTF-8"%> <% Stringpath=request.getContextPath(); StringbasePath=request.getScheme()+": //"+request.getServerName()+": "+request.getServerPort()+path+"/"; %> DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> -- --> <% Stringid=request.getParameter("id"); intnum=Integer.parseInt(request.getParameter("num")); booleanflag=false; intn=0; int[][]q=newint[8][8]; LinkedList q=(int[][])session.getAttribute("a"); list=(LinkedList StoreClasssc=newStoreClass(); Stores=newStore(); n=s.surplus(q); if(n request.getRequestDispatcher("/error1.jsp").forward( request,response); } else{ for(inti=0;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;i<64;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); } } %> Deletepro.jsp <%@pagelanguage="java"import="java.util.*,hkk.domain.*"pageEncoding="UTF-8"%> <% Stringpath=request.getContextPath(); StringbasePath=request.getScheme()+": //"+request.getServerName()+": "+request.getServerPort()+path+"/"; %> DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 位示图 实验 报告