操作系统实验——内存管理

实验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;

}

猜你喜欢

转载自blog.csdn.net/qq_33515383/article/details/80761992