📄 diskstore.java
字号:
/*
实习三 磁盘存储空间的分配和回收
第二题:用位示图管理磁盘存储空间
[提示]:
(1) 为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,"1"状态表示相应块已占用,"0"状态表示该块为空闲。位示图的形式与实习二中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用.
(2) 申请一块磁盘空间时,由分配程序查位示图,找出一个为"0"的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态"1",假设现在有一个盘组共8个柱面,每个柱面有2个磁道(盘面),每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某一位为"0"时,这个空闲块对应的磁盘物理地址为:
柱面号=字节号
磁道号= 位数 / 4
物理记录号= 位数 % 4
(3) 归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成"0",按照(2)中假设的盘组,归还块在位示图中的位置计算如下:
字节号=柱面号
位数=磁道号′4+物理记录号
(4) 设计申请磁盘空间和归还磁盘空间的程序。要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。
*/
//<applet code=DiskStore.class width=320 height=450>
//</applet>
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.math.BigInteger;
public class DiskStore extends Applet implements ActionListener
{
public TextArea info;
public Button action1,action2;
public TextField psize,pname;
public Label lb1,lb2;
public Panel panel1,panel2;
public int[][] bitmap = new int[8][8];
public String nowtext;
public int i,j;
public void init()
{
info=new TextArea("位示图管理存储空间程序\n\nIniting...Over\n请在上列方格中输入分配磁盘空间大小或回收的序号(序号为:行列,例如:23,表示第2行第3列)\n\n\n随机生成位示图使用情况成功。",20,40,TextArea.SCROLLBARS_VERTICAL_ONLY);
action1=new Button("分配");
action2=new Button("回收");
psize=new TextField("");
pname=new TextField("");
lb1=new Label("分配请求:(大小)");
lb2=new Label("回收请求:(序号)");
panel1=new Panel(new GridLayout(1,3));
panel2=new Panel(new GridLayout(1,3));
//布局设置
panel1.add(lb1);panel1.add(psize);panel1.add(action1);
panel2.add(lb2);panel2.add(pname);panel2.add(action2);
add(panel1);add(panel2);
add(info);
//监听
action1.addActionListener(this);
action2.addActionListener(this);
//数据初始化,随机生成位示图的使用情况, 若想采用空白磁盘可以改成0
Random r=new java.util.Random();
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
bitmap[i][j] =(r.nextInt() >>> 1) %2;
}
}
showbitmap();
}
//位示图展示函数
public void showbitmap()
{
nowtext=info.getText();
info.setText(nowtext+"\n\n当前位示图如下:\n(横向标号为位数:纵向标号为字节号-柱面号)\n");
String b_temp=" 0 1 2 3 4 5 6 7\n";
for(i=0;i<8;i++)
{
b_temp=b_temp+" "+i;
for(j=0;j<8;j++)
{
b_temp=b_temp+" "+bitmap[i][j];
}
b_temp=b_temp+"\n";
}
nowtext=info.getText();
info.setText(nowtext+b_temp);
}
public void actionPerformed(ActionEvent e)
{
String event=e.getActionCommand();
int psizeNum=0,count=0;
String tempinfo="分配磁盘空间情况如下(物理地址):\n";
String temp1=psize.getText();
String temp2=pname.getText();
nowtext=info.getText();
info.setText("分配前位示图如下(方便对比):\n");
showbitmap();
if(event=="分配")
{
nowtext=info.getText();
//对异常进行处理。
try {
psizeNum=Integer.parseInt(temp1);
} catch (NumberFormatException ex) {
info.setText("输入出错!各个分配的磁盘空间不能为空或0\n\n请重新输入需要分配的磁盘空间(单位1k)\n\n");
showbitmap();
return ;
}
//查找并分配空间
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(bitmap[i][j]==0)
{
tempinfo=tempinfo+"柱面号:"+i+";磁道号:"+(j/4)+";物理记录号:"+(j%4)+" \n";
bitmap[i][j]=1;
count++;
if(count==psizeNum)
{
info.setText(nowtext+"分配"+psizeNum+"个物理块成功!\n"+tempinfo+"");
showbitmap();
return;
}
}
}
}
}
if(event=="回收")
{
nowtext=info.getText();
//对异常进行处理。
try {
psizeNum=Integer.parseInt(temp2);
} catch (NumberFormatException ex) {
info.setText("输入出错!各个分配的磁盘空间不能为空或0\n\n请重新输入需要分配的磁盘空间(单位1k)\n\n");
showbitmap();
return ;
}
int temp_x=psizeNum/10,temp_y=psizeNum%10;
//检测是否此物理块为占用状态 1
if(bitmap[temp_x][temp_y]==0)
{
info.setText("你要归还的物理块("+psizeNum+")未被占用。\n");
showbitmap();
return;
}else{
bitmap[temp_x][temp_y]= 0 ;
info.setText("归还物理块成功! \n您刚归还的字节号为:"+temp_x+"位数:"+temp_y+"\n");
showbitmap();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -