1、 课 程 设 计 报 告 ( 2016--2017年度第二学期) 课程名称: 操作系统实验 课设题目: 用位示图管理磁盘空间的分配与回收 院 系: 控制与计算机工程学院 班 级: 信安1401 姓 名: 黄竞昶 指导教师: 贾静平
2、 设计周数: 一周 成 绩: 2015年7月9 日 一、需求分析 要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。 (1)假定现有一个磁盘组,共40个柱面。每个柱面4个磁道,每个磁道又划分成4个物理记录。磁盘的空间使用情况用位示图表示。位示图用若干个字构成,每一位对应一个磁盘块。1表示占用,0
3、表示空闲。为了简单,假定字长为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
4、 图9—1 位示图 (2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出柱面号、磁道号(也即磁头号)和扇区号)。 由位示图计算磁盘的相对块号的公式如下: 相对块号一字号×16+位号 之后再将相对块号转换成磁盘的物理地址: 由于一个柱面包含的扇区数=每柱面的磁道数×每磁道的扇区数=4×4=16,故柱面号=相对块号/16的商,即柱面号=字号 磁道号=(相对块号/16的余数)/4的商,即(位号/4)的商 物理块号=(相对块号/16的余数)/4的余数,即(位号/4)的余数 (3)当释放一个相对物理块时,运行回收程序,计算该块在
5、位示图中的位置,再把相应位置0。计算公式如下: 先由磁盘地址计算相对块号: 相对块号=柱面号×16+磁道号×4+物理块号 再计算字号和位号: 字号=相对块号/16的商,也即字号=柱面号 位号=磁道号×物理块数/每磁道+物理块号 (4)按照用户要求,申请分配一系列磁盘块,运行分配程序,完成分配。然后将分配的相对块号返回用户,并将相对块号转换成磁盘绝对地址,再显示系统各表和用户已分配的情况。 (5)设计一个回收算法,将上述已分配给用户的各盘块释放。并显示系统各表。回收算法框图如图5所示。 二、整体功能及设计 程序整体主要有四个功能模块,分别是:初始化、分配、单独回收以及全
6、部回收。当点击相应按钮时实现其功能。 程序设计了三个方法,分别是初始化init、分配算法dist、单独回收rec、全部回收allrec。 磁盘空间分配框图如图1所示, 磁盘空间回收框图如图2所示. 开 始 由磁盘的三维转为磁盘的相对块号 由相对块号转换成对应位示图的字位号 置位示图相应位为0 空闲盘个数+1 输出位示图等 返 回 释放一个磁盘块 开始 申请一个磁盘块 还有空闲块? 申请者等待 返 回 查位示图 找第一个为0的字位号 找到了? 返回,磁盘已满本次无法分配 返 回 N Y Y N N 由字
7、位号计算相对块号,柱面号,磁道号,物理记录号,并输出这些参数 位置示图相应位为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;
8、 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("“位示图管理磁盘空间的分配与回收”系统模拟");
9、 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);
10、 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());
11、 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 J
12、Button("回收全部磁盘块"); 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")
13、 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.a
14、dd(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.se
15、tVisible(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()//功能:得出
16、可用块号与不可用块号的集合 { 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 {
17、 a = i*16+j;//得到相对块号
used[c] = a;
H++;
c++;//写入不可用块号集合
}
}
}
public void allrec()//全部回收
{
ta.setText("");
String str="回收结果:\n";
for(int i=0;i 18、sed[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++)
19、
{
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();
get 20、avail();
String str6=""+A;
ta.append("初始化完成!\n");
tf3.setText(str6);
}
if(e.getSource()==b2){
if(A==640)
{
ta.setText("");
String str7="没有资源可回收";
ta.append(str7);
}
el 21、se
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 22、 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






