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