位示图实验报告Word文件下载.docx
《位示图实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《位示图实验报告Word文件下载.docx(23页珍藏版)》请在冰点文库上搜索。
3实验步骤
3.1位示图说明
位示图算法是利用二进制的一位来表示磁盘中的一个盘块的使用情况。
在外存上建立一张位示图(bitmap),记录文件存储器的使用情况。
每一位仅对应文件存储器上的一个物理块,取值0和1分别表示空闲和占用。
文件存储器上的物理块依次编号为:
0、1、2、…。
通常可用m*n个位数来构成位示图,并使m*n等于磁盘的总块数。
位示图也可描述为一个二维数组map[m*n],如图
(1)所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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<
StoreClass>
list=newLinkedList<
();
q=(int[][])session.getAttribute("
a"
list=(LinkedList<
)session.getAttribute("
list"
StoreClasssc=newStoreClass();
Stores=newStore();
n=s.surplus(q);
if(n<
num){
request.getRequestDispatcher("
/error1.jsp"
).forward(
request,response);
}
else{
for(inti=0;
i<
list.size();
i++){
if(((StoreClass)list.get(i)).getId().equals(id)){
flag=true;
break;
}
if(flag){
/error2.jsp"
).forward(request,response);
sc.setId(id);
intk=0;
int[]temp=newint[64];
for(inti=0;
i<
64;
i++){
temp[i]=-1;
}
sc.setYe(temp);
=7;
for(intj=0;
j<
j++){
if(q[i][j]==0){
q[i][j]=1;
sc.getYe()[k]=i*8+j;
k++;
if(k==num){//跳出循环
break;
list.add(sc);
request.getRequestDispatcher("
/main.jsp"
分配成功后跳转到main.jsp页面,即主界面。
3.2.2.2、回收空间算法
回收时首先要输入作业名,判断是否存在该作业,若该作业不存在则报错;
回收的时候要将作业占用的内存块归还,简单来说就是将分配时的作业块收回,体现在位示图上就是状态由“1”变成“0”。
程序中对应的deletepro.jsp是从delete.jsp获取id(作业名),再进回收操作,回收算法如下:
inttempi=-1,tempj=-1;
StoreClassstore=newStoreClass();
for(inti=0;
store=(StoreClass)list.get(i);
if(!
flag){
/error3.jsp"
list.remove(store);
=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页面,即主界面。
3.2.2.3、查看位示图信息
输入作业名即可查看作业在位示图中的信息,若不存在该作业则报错;
主要查看作业的页号(即作业在位示图中的位置)和块号,块号的计算公式也一并给出。
程序中对应的Findpro.jsp是从Find.jsp获取id(作业名),再进行查看位示图信息操作,查看算法如下:
intx=0,y=0;
i++){
if(list.get(i).getId().equals(id)){
flag=true;
break;
}
%>
该作业的页表情况为<
br/>
页号-----------块号----------详细<
<
%
=-1){
x=store.getYe()[i]/8;
y=store.getYe()[i]%8;
out.println(i+"
---------------"
+store.getYe()[i]+"
--------------8*"
+x+"
+"
+y);
%>
<
<
%}
}
%>
ahref="
main.jsp"
>
返回主界面<
/a>
查看成功后可选择返回到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);
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
//跳转到登录页面
int[][]a=newint[8][8];
for(inti=0;
for(intj=0;
a[i][j]=0;
}
HttpSessionsession=req.getSession();
session.setAttribute("
a);
list);
req.getRequestDispatcher("
).forward(req,resp);
}
StoreClass.java
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"
html>
head>
basehref="
%=basePath%>
title>
MyJSP'
AddPro.jsp'
startingpage<
/title>
metahttp-equiv="
pragma"
content="
no-cache"
cache-control"
expires"
0"
keywords"
keyword1,keyword2,keyword3"
description"
Thisismypage"
--
linkrel="
stylesheet"
type="
text/css"
href="
styles.css"
-->
/head>
body>
Stringid=request.getParameter("
/body>
/html>
Deletepro.jsp
DeletePro.jsp'