?? 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 + -