import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class Wesitu implements ActionListener{
JFrame f;
JTextField tf1,tf2;
JTable table;
JScrollPane pane1,pane2;
JPanel p1,p2,p3,p4;
JTextArea ta;
JLabel l1,l2;
JButton b1,b2,b3,b4;
String data[][]; // 位示图二维数组
String name[];
int empty[]; // 空闲盘块相对块号数组
int used[]; // 已分配盘块相对块号数组
int S,T; // 空闲盘块数,已分配盘块数
public Wesitu()
{
f = new JFrame("位示图");
data = new String[40][16];
name = new String[16];
for(int i=0;i<16;i++) //位标号
{
name[i]=""+i;
}
S = 0;T = 0;
empty = new int[640];
used = new int[640];
table = new JTable(data,name);
tf1 = new JTextField(5);
tf2 = new JTextField(5);
ta = new JTextArea(24,26);
pane1 = new JScrollPane(table); //滚动面板,显示table和文字框
pane2 = new JScrollPane(ta);
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel(new GridLayout(2,3,2,2));
l1 = new JLabel("磁盘分配块数");
l2 = new JLabel("要回收的盘块号");
b1 = new JButton("分配");
b1.addActionListener(this);
b2 = new JButton("回收");
b2.addActionListener(this);
b3 = new JButton("初始化");
b3.addActionListener(this);
b4 = new JButton("全部回收");
b4.addActionListener(this);
f.setSize(800,600);
f.setLocationRelativeTo(null);
f.setLayout(new BorderLayout()); //边界布局
p1.add(pane1);
p2.add(pane2);
p3.add(p4);
p4.add(l1);
p4.add(tf1);
p4.add(b1);
p4.add(b3);
p4.add(l2);
p4.add(tf2);
p4.add(b2);
p4.add(b4);
f.add(BorderLayout.NORTH,p3);
f.add(BorderLayout.EAST,p2);
f.add(BorderLayout.CENTER,p1);
f.setVisible(true);
}
public void newtu() // 图表和位示图二维数组的初始化函数
{
int k;
for(int i=0;i<40;i++)
for(int j=0;j<16;j++)
{
k = (int)(Math.random()*2); //生成一个[0,2)之间的随机数并强制转换成int类型,即随机生成0或1
data[i][j]=""+k;
table.setValueAt(""+k,i,j); //将表格中i行j列的值设置为k
}
T = 0; //初始化时,尚未进行分配任务,因此将T置零
for(int j=0;j<640;j++) //未分配,所以used为0
{
used[j]=0;
}
}
public void find() // 遍历位示图,存储空闲数组和空闲个数
{
int m; //相对块号
int t=0;
S = 0; //空闲盘个数,初始记为0
for(int i=0;i<40;i++)
for(int j=0;j<16;j++)
{
if(data[i][j].equals("0"))
{
m = i*16+j; //相对块号=字号×16+位号
empty[t] = m; //将查找到的空闲盘的相对块号记录入empty数组
S++;
t++;
}
}
}
public void send(int n) // 分配函数
{
int j,k;
ta.setText(" ");
String result="分配结果:\n";
int x=T;
for(int i=0;i<n;i++)
{
j = empty[i]/16; //磁道号 = 相对块号/16的商
k = empty[i]-j*16; //物理块号 = 相对块号/16的余数
used[x+i]=empty[i]; //将空闲盘块进行分配,之前已分配T块,从第T+1块开始分配
if(data[j][k].equals("1")) //由物理地址查询位示图,是否已经分配
{
result+="位置错误"+j+" "+k+" \n";
}
else
{
data[j][k]="1"; //分配过程
table.setValueAt("1",j,k);
result+="柱面"+empty[i]/16+"磁道"+(empty[i]%16)/4+"扇区"+(empty[i]%16)%4+" \n";
}
S--; //空闲减少,分配增加
T++;
}
for(int t=0;t<S;t++) //清除empty中曾记录的,但现在已分配的数据
{
empty[t]=empty[t+n];
}
ta.append(result);
}
public void back(int n,String result) // 单个回收函数
{
int a,b,c;
a=n/16; //计算柱面号
b=n%16/4; //磁道号
c=n%16%4; //扇区号
if(data[a][4*b+c].equals("0")) //柱面号=字号,4b+c=位号
{
ta.append("此块未分配!回收出错!\n");
}
else
{
data[a][4*b+c]="0";
table.setValueAt("0",a,4*b+c);
result+="柱面"+a+"磁道"+b+"扇区"+c+"\n";
S++;
T--;
for(int i=0;i<T;i++)
{
used[i]=used[i+1]; //清除掉已分配的那个
}
ta.append(result);
}
find();
}
public void allback() // 全部回收函数
{
String result="";
ta.setText("");
result+="回收结果:\n";
for(int i=0;i<T;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);
result+="柱面"+a+"磁道"+b+"扇区"+c+"\n";
used[i]=0;
}
T=0;S=S+T;
find();
ta.append(result);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==b1) //单击分配按钮
{
int n;
String result="";
n=Integer.parseInt(tf1.getText());
if(S==1||S-n<0) //空间是否还有剩余
{
ta.setText("");
result+="空间不足";
ta.append(result);
}
else send(n); //空间有剩余,则执行send函数
result+="空闲块个数为:"+S+"\n";
ta.append(result);
}
if(e.getSource()==b2) //单击回收按钮
{
int n;
String result="";
n=Integer.parseInt(tf2.getText());
if(S>640) //判断资源是否有剩余
{
ta.setText("");
result+="没有资源可回收";
ta.append(result);
}
else //资源有剩余,执行back函数
{
ta.setText("");
result+="回收结果:\n";
back(n,result);
}
result+="空闲块个数为:"+S+"\n";
ta.append(result);
}
if(e.getSource()==b3) //初始化过程,执行newtu初始化函数,并遍历位示图,存储空闲数组和空闲个数
{
newtu();
find();
String result="空闲块个数为:"+S+"\n";
ta.append(result);
}
if(e.getSource()==b4) //全部回收
{
String result="";
if(S>640) //判断是否有剩余资源可回收
{
ta.setText("");
result+="没有资源可回收";
ta.append(result);
}
else
allback(); //执行allback回收函数
result+="空闲块个数为:"+S+"\n";
ta.append(result);
}
}
}
public class liumi {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Wesitu();
}
}
用位示图管理磁盘空间的分配与回收
5星 · 超过95%的资源 需积分: 50 38 浏览量
2019-01-06
11:04:49
上传
评论 3
收藏 505KB RAR 举报
duoduobaiyun158
- 粉丝: 0
- 资源: 1
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈