资源描述
课 程 设 计 报 告
( 2016--2017年度第二学期)
课程名称: 操作系统实验
课设题目: 用位示图管理磁盘空间的分配与回收
院 系: 控制与计算机工程学院
班 级: 信安1401
姓 名: 黄竞昶
指导教师: 贾静平
设计周数: 一周
成 绩:
2015年7月9 日
一、需求分析
要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。
(1)假定现有一个磁盘组,共40个柱面。每个柱面4个磁道,每个磁道又划分成4个物理记录。磁盘的空间使用情况用位示图表示。位示图用若干个字构成,每一位对应一个磁盘块。1表示占用,0表示空闲。为了简单,假定字长为16位,其位示图如图9—1所示。系统设一个变量S,记录磁盘的空闲块个数。
位
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
字0
1
1
1
1
1
1
0
1
0
0
1
1
1
1
1
0
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所示.
开 始
由磁盘的三维转为磁盘的相对块号
由相对块号转换成对应位示图的字位号
置位示图相应位为0
空闲盘个数+1
输出位示图等
返 回
释放一个磁盘块
开始
申请一个磁盘块
还有空闲块?
申请者等待
返 回
查位示图
找第一个为0的字位号
找到了?
返回,磁盘已满本次无法分配
返 回
N
Y
Y
N
N
由字位号计算相对块号,柱面号,磁道号,物理记录号,并输出这些参数
位置示图相应位为1
图1 磁盘空间分配框图 图2 磁盘空间回收框图
三、编程实现
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class bitmap extends JFrame implements ActionListener{
JTable table;
JScrollPane sp1,sp2;
JTextArea ta;
JLabel l1,l2,l3,l4,l5;
JTextField tf1,tf2,tf3;
JButton b1,b2,b3,b4;
JPanel p1,p2,p3,p4,p5,p6,p7;
String data [][];
String colum[];
int sp[];//存放(相对)可用块
int used[];//存放(相对)已用块数
int A,H;//S为可用块数,T为已用块数
bitmap(){
super("“位示图管理磁盘空间的分配与回收”系统模拟");
data = new String[40][16];
colum = new String[16];
sp = new int[640];
used = new int[640];
A = 0;
H = 0;
for(int i=0; i<16; i++)
{
colum[i]=""+i;
}
table = new JTable(data,colum);
sp1 = new JScrollPane(table);
tf1 = new JTextField(6);
tf2 = new JTextField(6);
tf3 = new JTextField(6);
ta = new JTextArea(10,20);
sp2 = new JScrollPane(ta);
p1 = new JPanel(new BorderLayout());
p2 = new JPanel(new FlowLayout());
p3 = new JPanel(new BorderLayout());
p4 = new JPanel(new FlowLayout());
p5 = new JPanel(new FlowLayout());
p6 = new JPanel(new BorderLayout());
p7 = new JPanel(new FlowLayout());
l1 = new JLabel("位示图如下:");
b1 = new JButton("位示图初始化");
b1.addActionListener(this);
b2 = new JButton("回收全部磁盘块");
b2.addActionListener(this);
p2.add(b1);p2.add(b2);
p1.add(l1,"North");
p1.add(sp1,"Center");
p1.add(p2,"South");
l2 = new JLabel("运行状况: ");
l5 = new JLabel("空闲块数量:");
p7.add(l5);p7.add(tf3);
p3.add(l2,"North");
p3.add(p7,"South");
p3.add(sp2,"Center");
l3 = new JLabel("请输入需要分配的块数:");
l4 = new JLabel("请输入要回收的盘块号:");
b3 = new JButton("确认分配");
b3.addActionListener(this);
b4 = new JButton("确认回收");
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(new BorderLayout());
this.add(p1,"West");
this.add(p3,"Center");
this.add(p6,"South");
this.pack();
this.setVisible(true);
}
public void init()//功能:初始化
{
int k;
for(int i=0;i<40;i++)
for(int j=0;j<16;j++)
{
k = (int)(Math.random()*2);//0与1两数中进行随机
data[i][j]=""+k;
table.setValueAt(""+k,i,j);
}
}
public void getavail()//功能:得出可用块号与不可用块号的集合
{
int a;
int b=0,c=0;
A = 0;
H = 0;
for(int i=0;i<40;i++)
for(int j=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++;//写入不可用块号集合
}
}
}
public void allrec()//全部回收
{
ta.setText("");
String str="回收结果:\n";
for(int i=0;i<H;i++)
{
int a = used[i]/16;
int b = used[i]%16/4;
int c = 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(int i=0;i<40;i++)
for(int j=0;j<16;j++)
{
table.setValueAt("0",i,j);
}
H=0;
getavail();
ta.append(str);
}
public static void main(String[] args) {
new bitmap();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==b1){
init();
getavail();
String str6=""+A;
ta.append("初始化完成!\n");
tf3.setText(str6);
}
if(e.getSource()==b2){
if(A==640)
{
ta.setText("");
String str7="没有资源可回收";
ta.append(str7);
}
else
allrec();
String str8=""+A;
tf3.setText(str8);
}
if(e.getSource()==b3){
int n;
System.out.println(tf1.getText());
n=Integer.parseInt(tf1.getText());
tf1.setText("");
if(A<n)
{
ta.setText("");
String str1="空闲块不足\n";
//ta.append(str1);
JOptionPane.showMessageDialog(null,"空闲块不足","提示",JOptionPane.PLAIN_MESSAGE);
return;
}
else
{
int j,k;
ta.setText("");
String str="分配结果\n";
int x=H;
for(int i=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(int t=0;t<A;t++)
{
sp[t]=sp[t+n];//删除可用块中的已用块
}
ta.append(str);
}
String str2=""+A;
tf3.setText(str2);
tf1.setText("");
}
if(e.getSource()==b4){
int num;
num=Integer.parseInt(tf2.getText());
ta.setText("");
String str="";
int j,k = 0;
int a=num/16;//柱面
int b=num%16/4;//磁道
int c=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(int i=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();
String str5=""+A;
tf3.setText(str5);
tf2.setText("");
}
}
}
四、使用说明
程序运行后的运行界面如图3所示:
图3程序运行界面
单击“初始化”按扭初使化程序。初使化后位示图分配情况图如图4所示。
图4初使化后位示图分配情况图
输入所需分配的块数并单击“确认分配”按钮,系统从第一个盘块到最后一个盘块,寻找第一个不为1的盘块,并为用户连续分配相应个数盘块,并显示分配情况和位示图情况,如图5所示(以分配量20为例)。
图5点击分配按钮后信息
输入回收的盘块号,单击“确认回收”按钮,系统回收已分配给用户的盘块,如图6所示
图6回收的提示信息
当空闲块不足时,会弹出提示信息,如图7所示。
图7提示信息
单击“全部回收”按钮,所有盘块在位示图上位置置“0”,表示已经回收,如图8所示
单击“确认回收”,若该块已经处于回收状态,则弹出对话框进行提醒,如图9所示
五、结果分析
基本满足要求,位示图初始化、单个分配、单个回收、全部回收等功能均可实现。
17
展开阅读全文