【作者:孟祥月 博客:http://blog.csdn.net/mengxiangyue】
下面的代码模拟的是操作系统动态分区的过程。这里简单的介绍一下动态分区,在pc中有一定大小的内存,开始的时候这些内存都没有使用。我们可以在这个内存上去分配内存给对应的进程,这里的进程名字和进程的所需要的内存大小是我们自己输入的。我们模拟的是在内存的开始寻找能够分配给该进程的空闲区域分配给该进程,如果分配给该进程后剩余的内存小于4,那么就不在分片,而是将这个整个空闲内存,全部分配给该进程。
有分配内存,就对应的有回收内存。在某个进程运行结束之后,我们需要回收它的内存,以便后面的进程分配的时候使用。回收的时候需要注意,如果前面或者后面有空闲的内存,需要将其与回收的内存合并成为一块更大的内存。在回收内存的时候总共是八种情况。
以上就是这个程序的基本思路。
public class Data
{
String name;
int starAddress;
int length;
int flag;
public Data(){};
public Data(String name, int starAddress, int length, int flag)
{
this.name = name;
this.starAddress = starAddress;
this.length = length;
this.flag = flag;
}
@Override
public String toString()
{
return "Data [name=" + name + ", starAddress=" + starAddress
+ ", length=" + length + ", flag=" + flag + "]";
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class Main
{
static ArrayList l = new ArrayList();
static Scanner s = new Scanner(System.in);
static void fenPei()//分配内存空间
{
Data d = new Data();
System.out.println("请输入分配内存的名字");
d.name = s.next();
System.out.println("请输入分配内存的大小");
d.length = s.nextInt();
int i = 0;
for(i = 0;i<l.size();i++)
{
if(d.length<=((Data)l.get(i)).length&&((Data)l.get(i)).flag == 0)
break;
}
if(i == l.size())
{
System.out.println("没有足够空间可以分配");
return ;
}
if(((Data)l.get(i)).length - d.length<=4&&i!= l.size()-1)//不产生碎片
{
((Data)l.get(i)).name = d.name;
((Data)l.get(i)).flag = 1;
}
else
{
d.flag = 1;
((Data)l.get(i)).length -= d.length;
d.starAddress = ((Data)l.get(i)).starAddress;
((Data)l.get(i)).starAddress += d.length;
l.add(i, d);
}
System.out.println("分配成功!");
}
static void huiShou()//回收内存空间
{
String name;
System.out.println("请输入要回收的进程名字:");
name = s.next();
int i = 0; ;
for(i = 0;i<l.size();i++)
if(name.equals(((Data)l.get(i)).name))
break;
System.out.println("找到的是"+i);
if(i == l.size())
{
System.out.println("没有当前的进程,请核对输入名字");
return;
}
if(i == 0&&((Data)l.get(i+1)).flag ==0)
{
((Data)l.get(i)).length += ((Data)l.get(i+1)).length;
((Data)l.get(i)).flag = 0;
((Data)l.get(i)).name = "";
l.remove(1);
}
else if(i == 0&&((Data)l.get(i+1)).flag ==1)
{
((Data)l.get(i)).name = "";
((Data)l.get(i)).flag = 0;
}
else if(((Data)l.get(i-1)).flag == 0&&((Data)l.get(i+1)).flag ==0)//前后都是没有使用的
{
((Data)l.get(i-1)).length =((Data)l.get(i-1)).length + ((Data)l.get(i)).length + ((Data)l.get(i+1)).length;
((Data)l.get(i-1)).name = "";
l.remove(i);
l.remove(i);
}
else if(((Data)l.get(i-1)).flag == 0&&((Data)l.get(i+1)).flag ==1)//前面未使用后面使用
{
((Data)l.get(i-1)).length += ((Data)l.get(i)).length;
((Data)l.get(i-1)).name = "";
l.remove(i);
}
else if(((Data)l.get(i-1)).flag == 1&&((Data)l.get(i+1)).flag ==0)//前面使用后面未使用
{
((Data)l.get(i)).length += ((Data)l.get(i+1)).length;
((Data)l.get(i)).flag = 0;
((Data)l.get(i)).name = "";
l.remove(i+1);
}
else
{
((Data)l.get(i)).flag = 0;
((Data)l.get(i)).name = "";
}
System.out.println("回收成功");
}
static void display()
{
for(int i = 0;i<l.size();i++)
System.out.println(l.get(i));
}
public static void main(String[] args)
{
Data d = new Data("",0,1024,0);
l.add(d);
int choice;
while(true)
{
System.out.println("请选择:");
System.out.println("1 分配内存");
System.out.println("2 回收内存");
System.out.println("3 查看内存分配情况");
System.out.println("4 退出 ");
choice = s.nextInt();
switch(choice)
{
case 1:fenPei();break;
case 2:huiShou();break;
case 3:display();break;
case 4:System.exit(0);
default:System.out.println("输入错误请重新输入");
}
}
}
}