?? mainstore.java
字號:
/*
實習二 主存空間的分配和回收
第一題:可變分區管理方式下采用首次適應算法實現主存分配和回收
[提示]:
(1) 可變分區方式是按作業需要的主存空間大小來分割分區的。當要裝入一個作業時,根據作業需要的主存容量查看是否有足夠的空閑空間,
若有,則按需分配,否則,作業無法裝入。假定內存大小為128K,空閑區說明表格式為:
起始地址——指出空閑區的起始地址;
長度——一個連續空閑區的長度;
狀態——有兩種狀態,一種是“未分配”狀態;另一種是“空表目”狀態,表示該表項目前沒有使用。
(2) 采用首次適應算法分配回收內存空間。運行時,輸入一系列分配請求和回收請求。
要求程序的用戶界面友好,能顯示分區分配及回收后的內存布局情況。
*/
//<applet code=MainStore.class width=320 height=450>
//</applet>
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
public class MainStore extends Applet implements ActionListener
{
public TextArea info;
public Button action1,action2;
public TextField psize,pname;
public Label lb1,lb2;
public Panel panel1,panel2;
public Vector block = new Vector();
public Vector run = new Vector();
public int pNum,i,j;
public String nowtext,temp1,temp2;
public runblock runtemp,isRun;
public free freetemp,ftemp;
//初始化 空閑區數組 128k,
//空閑區數據結構, 0序號、1起始地址、2空閑長度、3狀態
public class free
{
public int no,startAddr,freesize,stat;
public free (int no,int startAddr,int freesize)
{
this.no = no;
this.startAddr = startAddr;
this.freesize = freesize;
this.stat = 0;
}
public free (int no)
{
this.no = no;
this.startAddr = 0;
this.freesize = 0;
this.stat = 0;
}
public void addsize (int size)
{
this.freesize=this.freesize+size;
}
public void decsize (int size)
{
this.freesize=this.freesize-size;
}
public int no()
{
return this.no;
}
public int startAddr()
{
return this.startAddr;
}
public int freesize()
{
return this.freesize;
}
public int stat()
{
return this.stat;
}
}
//主存部分
public class runblock
{
public int rname,rstart,rsize;
public runblock(int rname,int rstart,int rsize)
{
this.rname=rname;
this.rstart=rstart;
this.rsize=rsize;
}
public int rname()
{
return this.rname;
}
public int rstart()
{
return this.rstart;
}
public int rsize()
{
return this.rsize;
}
}
public void init()
{
info=new TextArea("主存調度算法空間分配回收程序\n\nIniting...Over\n請在上列方格中輸入分配進程的大小(單位:1k)或回收的進程序號\n",20,40,TextArea.SCROLLBARS_VERTICAL_ONLY);
action1=new Button("分配");
action2=new Button("回收");
psize=new TextField("");
pname=new TextField("");
lb1=new Label("分配請求:(大小k)");
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);
//數據實例化,默認128k序號1,起始地址0
block.add(new free(1,0,128));
}
//重新排序函數
public void resort(int no,int start,int len)
{
int ii=0,ssum=0;
//獲取位置
for(ii=0;ii<block.size();ii++)
{
free stemp=(free) block.get(ii);
if(len>=stemp.freesize())
{
ssum++;
}else{
break;
}
}
//插入向量
block.add(ssum,new free(no,start,len));
}
//返回內存使用情況 和 空閑區情況
public void showinfo()
{
nowtext=info.getText();
info.setText(nowtext+"內存應用狀況\n進程號 起始地址 塊大小 \n");
//內存使用部分
for(i=0;i<run.size();i++)
{
runtemp=(runblock) run.get(i);
nowtext=info.getText();
info.setText(nowtext+" "+runtemp.rname()+" "+runtemp.rstart()+" "+runtemp.rsize()+"\n");
}
//空閑區部分
nowtext=info.getText();
info.setText(nowtext+"\n空閑區狀況\n序號 起始地址 塊大小 類型\n");
for(i=0;i<10;i++)
{
nowtext=info.getText();
if(i<block.size())
{
ftemp=(free) block.get(i);
info.setText(nowtext+" "+(i+1)+" "+ftemp.startAddr()+" "+ftemp.freesize()+" 未分配\n");
}else{
info.setText(nowtext+" "+(i+1)+" 0 0 空表目\n");
}
}
}
//監聽動作
public void actionPerformed(ActionEvent e)
{
String event=e.getActionCommand();
nowtext=info.getText();
temp1=psize.getText();
temp2=pname.getText();
Integer psizeNum=0,i=0,j=0,freeNum=0,flag=0,pAddr=0,pName=0;
free ftemp=(free) block.get(0);
if(event=="分配")
{
//對異常進行處理。
try {
psizeNum=Integer.parseInt(temp1);
} catch (NumberFormatException ex) {
info.setText("輸入出錯!各個進程需要的空間不能為空或0\n\n請重新輸入各個進程需要的空間(單位1k)\n\n");
showinfo();
return ;
}
//檢查空閑區
//System.out.println(block.size());
for(i=0;i<block.size();i++)
{
ftemp=(free) block.get(i);
//檢測空閑區 空閑區數據結構, 0序號、1起始地址、2空閑長度、3狀態
if(ftemp.freesize()>=psizeNum)
{
//分割空閑區,并重新排列
if(ftemp.freesize()!=psizeNum)
{
ftemp.decsize(psizeNum);
//resort(ftemp);
}
int reno=ftemp.no();
int restart=ftemp.startAddr();
int resize=ftemp.freesize();
block.removeElementAt(i);
resort(reno,restart+psizeNum,resize);
pNum++;
flag=1;
//加入運行隊列
run.add(new runblock(pNum,ftemp.startAddr(),psizeNum));
break;
}
}
//返回顯示
if(flag==1)
{
info.setText("分配成功\n\n");
showinfo();
}else{
info.setText("空閑區無空閑內存塊滿足條件,請先回收部分進程。\n分配失敗\n\n");
showinfo();
}
}
if(event=="回收")
{
if(run.size()==0)
{
info.setText("內存暫時沒有可回收的進程\n\n");
showinfo();
return;
}
int isIn=0;
free isFree = (free) block.get(0);
free isFree2 = (free) block.get(0);
runblock isRun = (runblock) run.get(0);
//對異常進行處理。
try {
pName=Integer.parseInt(temp2);
} catch (NumberFormatException ex) {
info.setText("輸入出錯!各個進程序號不能為空或0\n\n請重新輸入進程序號(單位1k)\n");
return ;
}
//檢測輸入的序號是否在內存內
for(i=0;i<run.size();i++)
{
isRun = (runblock) run.get(i);
if(isRun.rname()==pName)
{
isIn = 1;
break;
}
}
if(isIn==0)
{
info.setText("你輸入的序號不在內存中,請確認輸入\n\n");
showinfo();
}else{
info.setText("序號正確,進程在內存中。\n\n");
//備份并刪除內存中進程
int isName=pName;
int isStart=isRun.rstart();
int isSize=isRun.rsize();
int isFlag=0;
run.removeElementAt(i);
//恢復空閑區,整合連續片段;先檢查是否可以整合,不能整合的話,按大小插入空閑區
for(i=0;i<block.size();i++)
{
j=i+1;
isFree = (free) block.get(i);
//在空閑區前
if(isFree.startAddr()==(isStart+isSize))
{
isSize=isSize+isFree.freesize();
int isNo=isFree.no();
block.removeElementAt(i);
resort(isNo,isStart,isSize);
isFlag = 1;
System.out.println("11111111");
break;
}
//空閑區后
if((isFree.startAddr()+isFree.freesize())==isStart)
{
//原后部分判斷
if(i==block.size())
{
isSize=isSize+isFree.freesize();
int isNo=isFree.no();
isStart=isFree.startAddr();
block.removeElementAt(i);
resort(isNo,isStart,isSize);
isFlag = 1;
break;
}else{
isFree2 = (free) block.get(i+1);
//判斷是否在兩空閑塊之間
if(isFree2.startAddr()==(isStart+isSize))
{
isSize=isSize+isFree.freesize()+isFree2.freesize();
int isNo=isFree.no();
isStart=isFree.startAddr();
block.removeElementAt(i);
block.removeElementAt(i);
resort(isNo,isStart,isSize);
isFlag = 1;
break;
}else{
isSize=isSize+isFree.freesize();
int isNo=isFree.no();
isStart=isFree.startAddr();
block.removeElementAt(i);
resort(isNo,isStart,isSize);
isFlag = 1;
break;
}
}
}
}
if(isFlag==0)
{
resort(8,isStart,isSize);
}
showinfo();
nowtext=info.getText();
info.setText(nowtext+"\n\n 回收成功!");
}
}
pname.setText("");
psize.setText("");
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -