packagememory;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Scanner;public classMain {static ArrayList list = new ArrayList(); //建立一个链表,来表示内存的使用情况
static Scanner sc = newScanner(System.in);//首次适应算法
static voidfenPei(){
Date date= newDate();
System.out.println("输入请求分配进程的名称:");
date.name=sc.next();
System.out.println("输入分配的内存大小:");
date.length=sc.nextInt();inti;for ( i = 0; i < list.size(); i++) {if (date.length <= ((Date)list.get(i)).length && ((Date)list.get(i)).flag == 0) {//当有适合的内存,且未被使用
break;
}
}if (i ==list.size()) {
System.out.println("没有足够的内存进行分配");
}if (((Date)list.get(i)).length - date.length <= 4 && i != list.size() - 1 ) {//当内存比进程所占的内存在4kB以内的话,就不进行分片
((Date)list.get(i)).name =date.name;
((Date)list.get(i)).flag= 1;
}else{//分片分配内存
date.flag = 1;
((Date)list.get(i)).length-=date.length;
date.startAddress=((Date)list.get(i)).startAddress;
((Date)list.get(i)).startAddress+=date.length;
list.add(i, date);
}
}//最佳适应算法
static voidfenPei1(){
Date date= newDate();
System.out.println("输入请求分配进程的名称:");
date.name=sc.next();
System.out.println("输入分配的内存大小:");
date.length=sc.nextInt();intm, j;
Date target= newDate();for (m = 1; m < list.size()-1; m++){
j=m;
target.name=((Date)list.get(m)).name;
target.flag=((Date)list.get(m)).flag;
target.length=((Date)list.get(m)).length;
target.startAddress=((Date)list.get(m)).startAddress;while(j>0 && ((Date)list.get(j-1)).length>target.length){
((Date)list.get(j)).name= ((Date)list.get(j-1)).name;
((Date)list.get(j)).flag= ((Date)list.get(j-1)).flag;
((Date)list.get(j)).length= ((Date)list.get(j-1)).length;
((Date)list.get(j)).startAddress= ((Date)list.get(j-1)).startAddress +((Date)list.get(j)).length;
j--;
}
((Date)list.get(j)).name=target.name;
((Date)list.get(j)).length=target.length;
((Date)list.get(j)).flag=target.flag;
((Date)list.get(j)).startAddress= target.startAddress-((Date)list.get(j+1)).length;
}inti;for ( i = 0; i < list.size(); i++) {if (date.length <= ((Date)list.get(i)).length && ((Date)list.get(i)).flag == 0) {//当有适合的内存,且未被使用
break;
}
}if (i ==list.size()) {
System.out.println("没有足够的内存进行分配");
}if (((Date)list.get(i)).length - date.length <= 4 && i != list.size() - 1) {
((Date)list.get(i)).name=date.name;
((Date)list.get(i)).flag= 1;
}else{//分片分配内存
date.flag = 1;
((Date)list.get(i)).length-=date.length;
date.startAddress=((Date)list.get(i)).startAddress;
((Date)list.get(i)).startAddress+=date.length;
list.add(i, date);
}
}//回收部分
static voidhuiShou(){
System.out.println("请输入要回收的进程:");
String name=sc.next();inti;for ( i = 0; i < list.size(); i++) {if(name.equals(((Date)list.get(i)).name)) {break;
}
}if (i ==list.size()) {
System.out.println("没有找到该进程。");return;
}
System.out.println("找到的是====>"+i);int hui =((Date)list.get(i)).length;if (i == 0 && ((Date)list.get(i+1)).flag == 0) { //回收第一个进程,且第二个内存位置空闲,合并这两者
((Date)list.get(i)).flag = 0;
((Date)list.get(i)).length+= ((Date)list.get(i+1)).length;
((Date)list.get(i)).name= "";
list.remove(1);
}else if (i == 0 && ((Date)list.get(i+1)).flag == 1) { //回收第一个进程,但第二个内存位置被占用
((Date)list.get(i)).name = "";
((Date)list.get(i)).flag= 0;
}else if (((Date)list.get(i-1)).flag == 0 && ((Date)list.get(i+1)).flag == 0) {//回收位置的进程左右两边的内存空间都空闲
((Date)list.get(i)).name = "";
((Date)list.get(i)).flag= 0;
((Date)list.get(i-1)).length += ((Date)list.get(i)).length + ((Date)list.get(i+1)).length;
list.remove(i);
list.remove(i+1);
}else if (((Date)list.get(i-1)).flag == 0 && ((Date)list.get(i+1)).flag == 1) {//回收位置左边的内存空闲,而右边的内存被占用
((Date)list.get(i)).name = "";
((Date)list.get(i)).flag= 0;
((Date)list.get(i-1)).length +=((Date)list.get(i)).length;
list.remove(i);
}else if (((Date)list.get(i-1)).flag == 1 && ((Date)list.get(i+1)).flag == 0) {//回收位置右边的内存空闲,而左边的内存被占用
((Date)list.get(i)).name = "";
((Date)list.get(i)).flag= 0;
((Date)list.get(i)).length+= ((Date)list.get(i+1)).length;
list.remove(i+1);
}else {//左右两边的内存都被占用
((Date)list.get(i)).name = "";
((Date)list.get(i)).flag= 0;
}
System.out.println("成功回收进程"+i+"的"+hui+"kb的空间");
}static voiddisPlay(){
System.out.println("=============================================");for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("=============================================");
}public static voidmain(String[] args){
Date date= new Date("", 0, 640, 0);
list.add(date);intchoice0;intchoice1;while(true){
System.out.println("请选择:内存分配方式");
System.out.println("1.首次适应算法");
System.out.println("2.最佳适应算法");
System.out.println("3.退出");
choice0=sc.nextInt();switch(choice0) {case 1:while(true){
System.out.println("请选择:");
System.out.println("1.分配内存");
System.out.println("2.回收内存");
System.out.println("3.查看内存");
System.out.println("4.退出");
choice1=sc.nextInt();switch(choice1) {case 1:
fenPei();break;case 2:
huiShou();break;case 3:
disPlay();break;case 4:
System.exit(0);break;default:
System.out.println("请正确输入");break;
}
}case 2:while(true){
System.out.println("请选择:");
System.out.println("1.分配内存");
System.out.println("2.回收内存");
System.out.println("3.查看内存");
System.out.println("4.退出");
choice1=sc.nextInt();switch(choice1) {case 1:
fenPei1();break;case 2:
huiShou();break;case 3:
disPlay();break;case 4:
System.exit(0);break;default:
System.out.println("请正确输入");break;
}
}case 3:
System.exit(0);break;default:
System.out.println("请正确输入:");
}
}
}
}