资源描述
运行平台:MyEclipse
使用方法:新建一个Distribution1类,粘贴代码即可
package mypackage;
import javax.swing.JOptionPane;
public class Distribution1 {
int size=0;
public int j;//用于记录内存分块数
int[] part=new int[1000];//用于记录内存分块的大小
int[] address=new int[1000];//用于记录内存分块的起始地址
int[] flag=new int[1000];//用于记录内存分块的分配情况
String Suggestion;
Distribution1(){
for(int i=0;i<1000;i++)
{
part[i]=0;
address[i]=0;
flag[i]=0;
}
}// end Distribution1()
void Input(){
Suggestion=JOptionPane.showInputDialog("请输入可分配内存的大小:");
size=Integer.parseInt(Suggestion);
}//end Input()
void Output(){
Suggestion="| "+"分区号"+" | "+"分区大小"+" | "+"起始地址"+" | "+"状态"+" |";
for(int k=0;k<=j;k++)
{
Suggestion+="\n| "+k+" | ";
Suggestion+=part[k]+" | ";
Suggestion+=address[k]+" | ";
Suggestion+=flag[k]+" |";
}
JOptionPane.showMessageDialog(null, Suggestion,"内存分配情况",JOptionPane.INFORMATION_MESSAGE);
}//end Output()
void Begin(){
char s='y';
int i=0;
int count=0;
Suggestion=JOptionPane.showInputDialog("请输入内存的起始地址:");
address[i]=Integer.parseInt(Suggestion);//记录首地址
Suggestion=JOptionPane.showInputDialog("请输入第0块分区的大小:");
part[i]=Integer.parseInt(Suggestion);//记录第0块分区的大小
count=part[i];
flag[i]=1;
i++;
j++;
Suggestion=JOptionPane.showInputDialog("是否继续分块,是请输入'y'或'Y',否请输入任意字符:");
s=Suggestion.charAt(0);
while(s=='y'||s=='Y')
{
Suggestion=JOptionPane.showInputDialog("请输入第"+i+"块分区的大小");
part[i]=Integer.parseInt(Suggestion);
if(size-count<part[i]){
JOptionPane.showMessageDialog(null, "剩余空间不足以分配!");
}
else
{
address[i]=address[i-1]+part[i-1];
flag[i]=1;
count=count+part[i];
i++;
j++;
}
Suggestion=JOptionPane.showInputDialog("是否继续,是请输入'y'或'Y',否则请输入任意的字符:");
s=Suggestion.charAt(0);
}//while(s=='y'||s=='Y')
part[i]=size-count;
address[i]=address[i-1]+part[i-1];
flag[i]=0;
}//end Begin()
void Restore(){//可作改进,在Suggestion中输入所有要回收的内存块,再将其解析出来。
char s;
int i;
int k=0;
int count=0;
int tag=0;
int number[]={'0','1','2','3','4','5','6','7','8','9'};
Suggestion=JOptionPane.showInputDialog("是否要回收内存,是请输入'y'或'Y',否请输入任意的字符:");
s=Suggestion.charAt(0);
if(s=='y'||s=='Y'){
Suggestion=JOptionPane.showInputDialog("请输入要回收的内存块号,中间以空格相间并以空格结尾:");
for(i=0;i<Suggestion.length();i++)
{
if(Suggestion.charAt(i)!=' ')//
{
for(k=0;k<10;k++)
{
if(Suggestion.charAt(i)==number[k])
{
tag=k+tag*10;//提取字符串中的整数
}//if
}//for
}//if
else{
if(tag>j){
JOptionPane.showMessageDialog(null,"输入的内存号不存在,请重新输入!","Warning",JOptionPane.INFORMATION_MESSAGE);
continue;
}
else{
flag[tag]=0;
tag=0;
}
}
}//for
}//if
for(i=1;i<=j;i++)//合并连续的空闲空间
{
if(flag[i-1]==0&&flag[i]==0)
{
part[i-1]=part[i-1]+part[i];
count++;
for(k=i;k<=j;k++)
{
part[k]=part[k+1];
address[k]=address[k+1];
}//for
}//if
}//for
for(i=1;i<=j;i++)//移动flag数组的元素
{
if(flag[i-1]==0&&flag[i]==0)
{
for(k=i;k<=j;k++)
{
flag[k]=flag[k+1];
}//for
}//if
}//for
j=j-count;
}//end Restore()
public static void main(String arg[]){
JOptionPane.showMessageDialog(null, "\t\t\t\t\t可变分区首次适应算法","Title",JOptionPane.INFORMATION_MESSAGE);
Distribution1 distribute=new Distribution1();
distribute.Input();
distribute.Begin();
distribute.Output();
distribute.Restore();
distribute.Output();
System.exit(0);
}
}
展开阅读全文