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
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
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
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
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
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
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;
}
实验5 内存管理(2学时)
一、实验目的
通过实验加强对内存管理方法的理解和掌握。
二、实验内容
编写程序实现采用可变分区方法管理内存。
三、实验要求
1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。
2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。
3、在设计好的数据结构上设计一个主存分配算法(循环首次适应算法)。
4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。
5、(附加)若需要可以实现程序的浮动,对内存空间进行紧凑