用位示图管理磁盘空间的分配与回收Word文档下载推荐.docx
《用位示图管理磁盘空间的分配与回收Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《用位示图管理磁盘空间的分配与回收Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
9
10
11
12
13
14
15
字0
....
39
图9—1位示图
(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出柱面号、磁道号(也即磁头号)和扇区号)。
由位示图计算磁盘的相对块号的公式如下:
相对块号一字号×
16+位号
之后再将相对块号转换成磁盘的物理地址:
由于一个柱面包含的扇区数=每柱面的磁道数×
每磁道的扇区数=4×
4=16,故柱面号=相对块号/16的商,即柱面号=字号
磁道号=(相对块号/16的余数)/4的商,即(位号/4)的商
物理块号=(相对块号/16的余数)/4的余数,即(位号/4)的余数
(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应位置0。
计算公式如下:
先由磁盘地址计算相对块号:
相对块号=柱面号×
16+磁道号×
4+物理块号
再计算字号和位号:
字号=相对块号/16的商,也即字号=柱面号
位号=磁道号×
物理块数/每磁道+物理块号
(4)按照用户要求,申请分配一系列磁盘块,运行分配程序,完成分配。
然后将分配的相对块号返回用户,并将相对块号转换成磁盘绝对地址,再显示系统各表和用户已分配的情况。
(5)设计一个回收算法,将上述已分配给用户的各盘块释放。
并显示系统各表。
回收算法框图如图5所示。
二、整体功能及设计
程序整体主要有四个功能模块,分别是:
初始化、分配、单独回收以及全部回收。
当点击相应按钮时实现其功能。
程序设计了三个方法,分别是初始化init、分配算法dist、单独回收rec、全部回收allrec。
磁盘空间分配框图如图1所示,磁盘空间回收框图如图2所示.
图1磁盘空间分配框图图2磁盘空间回收框图
三、编程实现
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassbitmapextendsJFrameimplementsActionListener{
JTabletable;
JScrollPanesp1,sp2;
JTextAreata;
JLabell1,l2,l3,l4,l5;
JTextFieldtf1,tf2,tf3;
JButtonb1,b2,b3,b4;
JPanelp1,p2,p3,p4,p5,p6,p7;
Stringdata[][];
Stringcolum[];
intsp[];
//存放(相对)可用块
intused[];
//存放(相对)已用块数
intA,H;
//S为可用块数,T为已用块数
bitmap(){
super("
“位示图管理磁盘空间的分配与回收”系统模拟"
);
data=newString[40][16];
colum=newString[16];
sp=newint[640];
used=newint[640];
A=0;
H=0;
for(inti=0;
i<
16;
i++)
{
colum[i]="
"
+i;
}
table=newJTable(data,colum);
sp1=newJScrollPane(table);
tf1=newJTextField(6);
tf2=newJTextField(6);
tf3=newJTextField(6);
ta=newJTextArea(10,20);
sp2=newJScrollPane(ta);
p1=newJPanel(newBorderLayout());
p2=newJPanel(newFlowLayout());
p3=newJPanel(newBorderLayout());
p4=newJPanel(newFlowLayout());
p5=newJPanel(newFlowLayout());
p6=newJPanel(newBorderLayout());
p7=newJPanel(newFlowLayout());
l1=newJLabel("
位示图如下:
b1=newJButton("
位示图初始化"
b1.addActionListener(this);
b2=newJButton("
回收全部磁盘块"
b2.addActionListener(this);
p2.add(b1);
p2.add(b2);
p1.add(l1,"
North"
p1.add(sp1,"
Center"
p1.add(p2,"
South"
l2=newJLabel("
运行状况:
"
l5=newJLabel("
空闲块数量:
p7.add(l5);
p7.add(tf3);
p3.add(l2,"
p3.add(p7,"
p3.add(sp2,"
l3=newJLabel("
请输入需要分配的块数:
l4=newJLabel("
请输入要回收的盘块号:
b3=newJButton("
确认分配"
b3.addActionListener(this);
b4=newJButton("
确认回收"
b4.addActionListener(this);
p4.add(l3);
p4.add(tf1);
p4.add(b3);
p5.add(l4);
p5.add(tf2);
p5.add(b4);
p6.add(p4,"
p6.add(p5,"
this.setLayout(newBorderLayout());
this.add(p1,"
West"
this.add(p3,"
this.add(p6,"
this.pack();
this.setVisible(true);
publicvoidinit()//功能:
初始化
{
intk;
i<
40;
i++)
for(intj=0;
j<
j++)
k=(int)(Math.random()*2);
//0与1两数中进行随机
data[i][j]="
+k;
table.setValueAt("
+k,i,j);
}
}
publicvoidgetavail()//功能:
得出可用块号与不可用块号的集合
inta;
intb=0,c=0;
if(data[i][j].equals("
0"
))
{
a=i*16+j;
//得到相对块号
sp[b]=a;
//写入可用块号集合
A++;
b++;
else
{
a=i*16+j;
used[c]=a;
H++;
c++;
//写入不可用块号集合
}
}
publicvoidallrec()//全部回收
{
ta.setText("
Stringstr="
回收结果:
\n"
;
for(inti=0;
H;
inta=used[i]/16;
intb=used[i]%16/4;
intc=used[i]%16%4;
data[a][4*b+c]="
a,4*b+c);
//位示图相应位置置零
str+="
柱面"
+a+"
磁道"
+b+"
扇区"
+c+"
盘块号:
+used[i]+"
\n"
used[i]=0;
for(intj=0;
table.setValueAt("
i,j);
}
H=0;
getavail();
ta.append(str);
publicstaticvoidmain(String[]args){
newbitmap();
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==b1){
init();
getavail();
Stringstr6="
+A;
ta.append("
初始化完成!
tf3.setText(str6);
if(e.getSource()==b2){
if(A==640)
ta.setText("
Stringstr7="
没有资源可回收"
ta.append(str7);
else
allrec();
Stringstr8="
tf3.setText(str8);
if(e.getSource()==b3){
intn;
System.out.println(tf1.getText());
n=Integer.parseInt(tf1.getText());
tf1.setText("
if(A<
n)
Stringstr1="
空闲块不足\n"
//ta.append(str1);
JOptionPane.showMessageDialog(null,"
空闲块不足"
"
提示"
JOptionPane.PLAIN_MESSAGE);
return;
intj,k;
ta.setText("
Stringstr="
分配结果\n"
intx=H;
for(inti=0;
n;
{
j=sp[i]/16;
k=sp[i]-j*16;
used[x+i]=sp[i];
//可用块相对地址转为已用块相对地址
data[j][k]="
1"
j,k);
//将位示图对应位置写1
str+="
+sp[i]/16+"
磁道"
+(sp[i]%16)/4+"
扇区"
+(sp[i]%16)%4+"
+sp[i]+"
A--;
H++;
for(intt=0;
t<
A;
t++)
sp[t]=sp[t+n];
//删除可用块中的已用块
ta.append(str);
}
Stringstr2="
tf3.setText(str2);
if(e.getSource()==b4){
intnum;
num=Integer.parseInt(tf2.getText());
ta.setText("
intj,k=0;
inta=num/16;
//柱面
intb=num%16/4;
//磁道
intc=num%16%4;
//扇区
if(data[a][4*b+c].equals("
{
JOptionPane.showMessageDialog(null,"
不可回收空闲块"
//tf2.setText("
return;
else
data[a][4*b+c]="
盘快号:
+num+"
A++;
H--;
for(inti=0;
if(used[i]==num)
{
k=i;
break;
for(j=k;
j++)
used[j]=used[j+1];
//将回收的块号从“已用”中删除
ta.append("
回收结果:
getavail();
Stringstr5="
tf3.setText(str5);
tf2.setText("
四、使用说明
程序运行后的运行界面如图3所示:
图3程序运行界面
单击“初始化”按扭初使化程序。
初使化后位示图分配情况图如图4所示。
图4初使化后位示图分配情况图
输入所需分配的块数并单击“确认分配”按钮,系统从第一个盘块到最后一个盘块,寻找第一个不为1的盘块,并为用户连续分配相应个数盘块,并显示分配情况和位示图情况,如图5所示(以分配量20为例)。
图5点击分配按钮后信息
输入回收的盘块号,单击“确认回收”按钮,系统回收已分配给用户的盘块,如图6所示
图6回收的提示信息
当空闲块不足时,会弹出提示信息,如图7所示。
图7提示信息
单击“全部回收”按钮,所有盘块在位示图上位置置“0”,表示已经回收,如图8所示
单击“确认回收”,若该块已经处于回收状态,则弹出对话框进行提醒,如图9所示
五、结果分析
基本满足要求,位示图初始化、单个分配、单个回收、全部回收等功能均可实现。