动态分区分配方式 java_使用动态分区分配方式的模拟

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("请正确输入:");

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值