用位示图管理磁盘空间的分配与回收.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
袇课程设计报告
螈(2016--2017年度第二学期)
:操作系统实验
薆课程名称
:用位示图管理磁盘空间的分配与回收袃课设题目
:控制与计算机工程学院
羇院系
:信安1401
羅班级
:黄竞昶
羃姓名
:贾静平
薂指导教师
:一周
肇设计周数
:
莆成绩
年 7月 9日
螅2015
莀一、需求分析
蒁要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。
螆( 1)假定现有一个磁盘组,共 40 个柱面。
每个柱面 4 个磁道,每个磁道又划分成 4 个物理记录。
磁盘的空间使用情况用位示图表示。
位示图用若干个字构成,每一位对应一个磁盘块。
1 表示占用, 0 表示空闲。
为了简单,假定字长为 16 位,其位示图如图 9— 1 所示。
系统设一个变量 S,记录磁盘的空闲块个数。
莃
蒁 1 膇 2 袅 3 膂 4 薁 5 薈 6 莃 7 羁 8 蚀 9 蚅肅蚀螀肆薃
膃位
10 11 12 13 14 15
袀
螃字 0 蒇 1 芅 1 薂 1 羀 1 袈 1 蚂 0 芁 1 肀 0 羄 0 莄 1 聿 1 肀 1 莅 1 袂 1 肂 0
1
膀 1
袆 2
....
袁 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 磁盘空间回收框图
羂由相对块号转换成对应
蒃三、编程实现
N
薂 importjava.awt.*;
蒅返回,磁盘已满本
膀 import.*;
薆 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,"North");
p3.add(p7,"South");
p3.add(sp2,"Center");
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,"North");p6.add(p5,"Center");
this.setLayout(newBorderLayout());
肁 this.add(p1,"West");
蒁 this.add(p3,"Center");
膆 this.add(p6,"South");
膆 this.pack();
蒂 this.setVisible(true);
羈 }
腿publicvoidinit()//功能:初始化
芆 {
袃 intk;
蚀 for(inti=0;i<40;i++)
羇 for(intj=0;j<16;j++)
莆 {
芃k=(int)(Math.random()*2);//0与1两数中进行随机肈data[i][j]=""+k;
蚆table.setValueAt(""+k,i,j);
蒆}
蒀}
薆publicvoidgetavail()//功能:得出可用块号与不可用块号的集合蒅 {
芁 inta;
薇 intb=0,c=0;
芈 A=0;
芄 H=0;
莁 for(inti=0;i<40;i++)
羈 for(intj=0;j<16;j++)
螆 {
羃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;i<H;i++)
{
聿芅膄蚆芆蚃虿螆莃膁蒈袆螄袃蒁羆inta=used[i]/16;
intb=used[i]%16/4;
intc=used[i]%16%4;
data[a][4*b+c]="0";
table.setValueAt("0",a,4*b+c);//位示图相应位置置零str+=" 柱面 "+a+" 磁道 "+b+" 扇区 "+c+" 盘块号: "+used[i]+"\n"; used[i]=0;//位示图相应位置置零
}
for(inti=0;i<40;i++)
for(intj=0;j<16;j++)
{
table.setValueAt("0",i,j);
}
H=0;
getavail();
ta.append(str);
膅}
芀 publicstaticvoidmain(String[]args){
芀newbitmap();
羆 }
薆 publicvoidactionPerformed(ActionEvente){ 肂if(e.getSource()==b1){
羈 init();
肆 getavail();
羆 Stringstr6=""+A;
蒀 ta.append(" 初始化完成 !\n");
肁 tf3.setText(str6);
膆}
膃if(e.getSource()==b2){
膂 if(A==640)
螀 {
芆 ta.setText("");
薄 Stringstr7="没有资源可回收"; 羄 ta.append(str7);
蕿 }
肁 else
蚁 allrec();
肈 Stringstr8=""+A;
肄 tf3.setText(str8);
膁肂袀肇芁腿芈袆莁}
if(e.getSource()==b3){
intn;
(tf1.getText());
n=Integer.parseInt(tf1.getText()); tf1.setText("");
if(A<n)
{
ta.setText("");
薀罿Stringstr1="空闲块不足 \n"; //ta.append(str1);
蚅JOptionPane.showMessageDialog(null,"空闲块不足","提示",JOptionPane.PLAIN_MESSAGE);
蚅羀蒇蚇螅莁腿蒆袅螂蚇膅return;
}
else
{
intj,k;
ta.setText("");
Stringstr="分配结果\n";
intx=H;
for(inti=0;i<n;i++)
{
j=sp[i]/16;
k=sp[i]-j*16;
羅used[x+i]=sp[i];//可用块相对地址转为已用块相对地址
薂data[j][k]="1";
羂table.setValueAt("1",j,k);//将位示图对应位置写 1
薇str+="柱面"+sp[i]/16+"磁道"+(sp[i]%16)/4+"扇区"+(sp[i]%16)%4+"盘块号:"+sp[i]+"\n";
蚈羃莀蚀螈莄肂荿袈螅薀膈
A--;
H++;
}
for(intt=0;t<A;t++)
{
sp[t]=sp[t+n];//删除可用块中的已用块
}
ta.append(str);
}
Stringstr2=""+A;
tf3.setText(str2);
tf1.setText("");
袇袂节羇羇芃螀羀肇蚄膈蒅}
if(e.getSource()==b4){
intnum;
num=Integer.parseInt(tf2.getText());
ta.setText("");
Stringstr="";
intj,k=0;
inta=num/16;//柱面
intb=num%16/4;//磁道
intc=num%16%4;//扇区
if(data[a][4*b+c].equals("0"))
{
袃JOptionPane.showMessageDialog(null,"不可回收空闲块","提示",JOptionPane.PLAIN_MESSAGE);
袁//tf2.setText("");
蚅return;
芃羃芁莇
}
else
{
data[a][4*b+c]="0";
table.setValueAt("0",a,4*b+c);
str+=" 柱面 "+a+" 磁道 "+b+" 扇区 "+c+" 盘快号: "+num+"\n";
A++;
H--;
for(inti=0;i<H;i++)
{
if(used[i]==num)
{
k=i;
break;
}
}
for(j=k;j<H;j++)
used[j]=used[j+1];//将回收的块号从“已用”中删除ta.append("回收结果 :\n");
ta.append(str);
}
getavail();
Stringstr5=""+A;
tf3.setText(str5);
tf2.setText("");
}
}
}
四、使用说明
程序运行后的运行界面如图 3 所示:
图 3 程序运行界面
单击“初始化”按扭初使化程序。
初使化后位示图分配情况图如图 4 所示。
图 4 初使化后位示图分配情况图
输入所需分配的块数并单击“确认分配”按钮,系统从第一个盘块到最后一个盘块,寻找第一个不为1 的盘块,并为用户连续分配相应个数盘块,并显示分配情况和位示图情况,如图
5 所示 ( 以分配量 20 为例) 。
图 5 点击分配按钮后信息
输入回收的盘块号,单击“确认回收”按钮,系统回收已分配给用户的盘块,如图 6 所示
图 6 回收的提示信息
当空闲块不足时,会弹出提示信息,如图7 所示。
图 7 提示信息
单击“全部回收”按钮,所有盘块在位示图上位置置“0”,表示已经回收,如图8 所示
单击“确认回收” ,若该块已经处于回收状态,则弹出对话框进行提醒,如图9 所示
五、结果分析
基本满足要求,位示图初始化、单个分配、单个回收、全部回收等功能均可实现。