位示图实验报告
合肥学院
计算机科学与技术系
实验报告
2014 ~2015 学年第一学期
课程操作系统原理
实验名称编写用位示图法管理文件存储
空间的分配与回收程序学生姓名侯康康13
章涛15
张德天32
何天龙10
专业班级12计本(3)
指导教师屠菁
2014 年11 月
1实验目的(字体四号,宋体,行距倍,段前段后行)
理解文件存储空间的分配与回收的基本概念,掌握产生文件存储空间的分配与回收的几种方法,体会位示图算法是管理文件存储空间的分配与回收的一种行之有效的方法。
通过编写程序实现位示图算法,进一步理解位示图算法的原理和执行过程,掌握位示图算法的描述和应用,进一步熟练掌握文件存储空间的分配与回收的方法。
2 实验内容
程序首先要给出位示图初态。分配时,参数为文件名及需要分配的块数。回收时,参数为文件名。
回答信息:分配时,能够分配时,给出文件名和分配的具体块号。否则,给出无法分配的信息。显示位示图。
回收时:给出回收的具体块号。显示位示图。
3 实验步骤
位示图说明
位示图算法是利用二进制的一位来表示磁盘中的一个盘块的使用情况。在外存上建立一张位示图(bitmap),记录文件存储器的使用情况。每一位仅对应文件存储器上的一个物理块,取值0和1分别表示空闲和占用。文件存储器上的物理块依次编号为:0、1、2、…。通常可用m*n个位数来构成位示图,并使m*n 等于磁盘的总块数。位示图也可描述为一个二维数组map[m*n],如图(1)所示:
概要设计
封装属性
在新建作业时,我们需要知道的是作业名和作业块数。所以新建一个,里面封装两个属性,一个是作业名id;一个是作业块数,我们定义成一位数组ye.用来记录输入作业块数输入时在位示图中的位置。
各功能的实现
存储空间的分配算法
首先要输入作业名和大小,若作业名已存在则报错;若没有,则比较空闲区中空闲块数是否大于欲分配的块数。有的话分配;没有的话报错;分配的时候该作业要记录下自己所占盘块的其实盘号和所占用的盘快数。并修改对应盘块的位示图的值。程序中对应的是从获取id(作业名)和num(块数),再进行分配操作,分配算法如下:
String id=("id");
int num=("num"));
boolean flag=false;
int n=0;
int[][] q=new int[8][8];
LinkedList
list=(LinkedList
StoreClass sc=new StoreClass();
Store s=new Store();
n=(q);
if(n ("/").forward( request, response); } else{ for(int i=0;i<();i++){ if(((StoreClass) (i)).getId().equals(id)){ flag =true ; break; } } if(flag){ ("/").forward(request, response); } else{ (id); int k=0; int[] temp = new int[64]; for (int i = 0; i < 64; i++) { temp[i] = -1; } (temp); for (int i = 0; i <= 7; i++) { for (int j = 0; j <= 7; j++) { if (q[i][j] == 0) { q[i][j] = 1; ()[k] = i * 8 + j; k++; } if (k == num) {orward(request, response); } } 分配成功后跳转到页面,即主界面。 、回收空间算法 回收时首先要输入作业名,判断是否存在该作业,若该作业不存在则报错;回收的时候要将作业占用的内存块归还,简单来说就是将分配时的作业块收回,体现在位示图上就是状态由“1”变成“0”。程序中对应的是从获取id(作业名),再进回收操作,回收算法如下: String id=("id"); boolean flag=false; int tempi = -1, tempj = -1; int[][] q=new int[8][8]; q=(int[][])("a"); LinkedList list=(LinkedList StoreClass store=new StoreClass(); for(int i=0;i<();i++){ if(((StoreClass) (i)).getId().equals(id)){ store = (StoreClass) (i); flag =true ; break; } } if(!flag){ ("/").forward(request, response); } else{ (store); for(int i = 0; i <= 63; i++) { if ()[i] != -1) { orward(request, response); } 回收成功后跳转到页面,即主界面。 、查看位示图信息 输入作业名即可查看作业在位示图中的信息,若不存在该作业则报错;主要查看作业的页号(即作业在位示图中的位置)和块号,块号的计算公式也一并给出。程序中对应的是从获取id(作业名),再进行查看位示图信息操作,查看算法如下: String id=("id"); boolean flag=false; int x = 0, y = 0; int[][] q=new int[8][8]; q=(int[][])("a"); LinkedList list=(LinkedList StoreClass store=new StoreClass(); for(int i=0;i<();i++){ if (i).getId().equals(id)) { flag =true ; store = (StoreClass) (i); break; } } if(!flag){ ("/").forward(request, response); } else{ %> 该作业的页表情况为 页号-----------块号---------- 详细 <% for (int i = 0; i <= 63; i++) { if ()[i] != -1) { x = ()[i] / 8; y = ()[i] % 8; (i + "---------------" + ()[i] + "-------------- 8 *" + x + "+" + y);%> <%} } } %> 查看成功后可选择返回到页面,即主界面。 各算法流程图 盘块的分配如下流程图(2): 图(2)分配流程图盘块的回收如下流程图(3): 图(3)回收流程图查看作业信息如下流程图(4) 否 图(4)作业流程图 调试分析以及运行结果 主界面 通过网页我们看到的如下所示,这是程序初始化时出现的界面图(5): 图(5)主界面 测试添加 添加数据作业名os,块数6;如图(6) 添加数据作业o,块数9:如图(7) 图(6)添加数据1页面 图(7)添加数据2页面运行结果如图(8)图(9) 图(8)添加结果1 图(9)添加结果2 测试查看 查看数据作业名o;图(10) 图(10)查看数据运行结果为图(11) 图(11)查看结果 测试删除 测试数据:作业名o如图(12) 图(12)删除作业 运行结果如图(13) 图(13)删除运行结果 小结:运行结果和理论结果相同并符合实验要求,结果满足位示图法基本原理。四实验总结 在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间。如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半。做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛。 实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。在这里我深深体会到理论对实践的指导作用:懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。 我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。 五附录 主要源代码 package ; import class LoginServlet extends HttpServlet { private static final long serialVersionUID = -827730L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { (req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { orward(req, resp); } } package ; public class StoreClass { String id; int[] ye = new int[64]; public String getId() { return id; } public void setId(String id) { = id; } public int[] getYe() { return ye; } public void setYe(int[] ye) { = ye; } } <%@page language="java"import=".*,.*"pageEncoding="UTF-8"%> <% String path = (); String basePath = ()+":orward( request, response); } else{ for(int i=0;i<();i++){ if(((StoreClass) (i)).getId().equals(id)){ flag =true ; break; } } if(flag){ ("/").forward(request, response); } else{ (id); int k=0; int[] temp = new int[64]; for (int i = 0; i < 64; i++) { temp[i] = -1; } (temp); for (int i = 0; i <= 7; i++) { for (int j = 0; j <= 7; j++) { if (q[i][j] == 0) { q[i][j] = 1; ()[k] = i * 8 + j; k++; } if (k == num) {orward(request, response); } } %>