实验5 内存管理(2学时)
一、实验目的
通过实验加强对内存管理方法的理解和掌握。
二、实验内容
编写程序实现采用可变分区方法管理内存。
三、实验要求
1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。
2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。
3、在设计好的数据结构上设计一个主存分配算法(循环首次适应算法)。
4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。
5、(附加)若需要可以实现程序的浮动,对内存空间进行紧凑。
1.Test.java import java.util.Scanner; public class Test { public static void main(String[] args) { Test.begin(); } public static void begin(){ Free f=new Free(); Use u=new Use(); System.out.println("》》》--------------请选择操作----------《《《"); System.out.println("》》》--------------1.申请内存----------《《《"); System.out.println("》》》--------------2.释放内存----------《《《"); System.out.println("》》》--------------3.退出程序----------《《《"); Scanner sc=new Scanner(System.in); int a=sc.nextInt(); while(a!=3){ switch(a){ case 1:u.use();break; case 2:f.free();break; } System.out.println("》》》--------------请选择操作----------《《《"); System.out.println("》》》--------------1.申请内存----------《《《"); System.out.println("》》》--------------2.释放内存----------《《《"); System.out.println("》》》--------------3.退出程序----------《《《"); sc=new Scanner(System.in); a=sc.nextInt(); } System.out.println("系统退出成功!"); } } 2.Use.java import java.util.Scanner; public class Use { public static Node first=null; public static Node tail=null; public static int count=0; public static int name=1; public void use(){ System.out.println("请输入需要的内存空间:"); Scanner sc=new Scanner(System.in); int a=Integer.parseInt(sc.nextLine()); if(a<=Free.all){ Node node=new Node(); if(count==0){ node.firstaddress=0; node.length=a; node.name=name; first=node; tail=node; } else{ node.firstaddress=tail.firstaddress+tail.length; node.length=a; node.name=name; tail.next=node; tail=node; } count++; name++; Free.all=Free.all-a; } else{ System.out.println("内存空间不够!"); } Free.print(); } } 3.Free.java import java.util.Scanner; public class Free { public static Node first=null; public static Node tail=null; public static int count=0; public static Node befortail=null; public static int all=1000; public void free(){ System.out.println("请输入要释放的内存块名:"); Scanner sc=new Scanner(System.in); int a=Integer.parseInt(sc.nextLine()); Node node=new Node(); node=Use.first; if(a==Use.first.name){ if(count==0){ first=node; tail=node; } else{ tail.next=node; tail=node; } Use.first=node.next; } else { for(int i=0;i<Use.count;i++){ if(node.name==a){ break; } befortail=node; node=node.next; } if(count==0){ first=node; tail=node; } else{ tail.next=node; tail=node; } if(Use.tail!=Free.befortail.next){ Free.befortail.next=node.next; } else{ Use.tail=Free.befortail; Use.tail.next=null; } } count++; Use.count--; Free.merge(); Free.print(); } public static void merge(){ Node[] node=new Node[100]; Node[] node2=new Node[100]; int a=0; Node node1=new Node(); node1=first; for(int i=0;i<count;i++){ if(node1!=null){ node[node1.name]=node1; node1=node1.next; } } for(int i=0;i<100;i++){ if(node[i]!=null){ node2[a]=node[i]; node2[a].next=null; a++; } } if(count>1){ for(int i=0;i<a-1;i++){ if(node2[i].firstaddress+node2[i].length==node2[i+1].firstaddress){ node2[i+1].firstaddress=node2[i].firstaddress; node2[i+1].length=node2[i].length+node2[i+1].length; node2[i]=null; Free.count--; } } } if(node2[a-1].firstaddress+node2[a-1].length==1000-Free.all){ Free.all+=node2[a-1].length; node2[a-1]=null; Free.count--; } if(Free.count!=0){ if(node2[0]!=null){ first=node2[0]; } else{ first=node2[1]; } for(int i=0;i<count;i++){ if(node2[i]!=null){ befortail=node2[i]; befortail.next=node2[i+1]; } } } } public static void print(){ System.out.println("占用内存块表:"); System.out.println("内存块名 内存块首地址 内存块长"); Node node=new Node(); node=Use.first; for(int i=0;i<Use.count;i++){ if(node!=null){ System.out.println(" "+node.name+" "+node.firstaddress+" "+node.length); node=node.next; } } System.out.println("空闲内存块表:"); System.out.println("内存块名 内存块首地址 内存块长"); Node freenode=new Node(); freenode=Free.first; for(int i=0;i<Free.count;i++){ if(freenode!=null){ System.out.println(" "+freenode.name+" "+freenode.firstaddress+" "+freenode.length); freenode=freenode.next; } } } } 4.Node.java public class Node { public int firstaddress; public int length; public int name; public Node next; }