《2022年2022年计算机操作系统实验内存管理 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年计算机操作系统实验内存管理 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验 3 内存管理( 2 学时)一、实验目的通过实验加强对内存管理方法的理解和掌握。二、实验内容编写程序实现采用可变分区方法管理内存。三、实验要求1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作) 。2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。3、在设计好的数据结构上设计一个主存分配算法。4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和 (或)下邻空闲分区, 要求合并为一个空闲分区登记在空闲分区表的一个表项里。5、 (附加)若需要可以实现程序的浮动,对内存空间进行紧凑。程序代码( java)package
2、wcm3; public class Node public int firstaddress; public int length; public int name; public Node next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - package wcm3; import java.util.Scanner; public class Use public static Node first=null; p
3、ublic 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.leng
4、th=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(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
5、 - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - package wcm3; 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.p
6、rintln( 请输入要释放的内存块名:); 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;iUse.count;i+)/
7、找要释放的内存块if(node.name=a) break; befortail=node; node=node.next; if(count=0)/ 把内存块放到空闲链表first=node; tail=node; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - tail.next=node; tail=node; if(Use.tail!=Free.befortail.next) Free.befortail.ne
8、xt=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 Node100; Node node2=new Node100; int a=0; Node node1=new Node(); node1=first; for(int i=0;icount;i+) if(node1!=null) nodenode1.name=n
9、ode1;/把内存块存到对应位置的数组中node1=node1.next; for(int i=0;i1) for(int i=0;ia-1;i+)/合并if(node2i.firstaddress+node2i.length=node2i+1.firstaddress) node2i+1.firstaddress=node2i.firstaddress; node2i+1.length=node2i.length+node2i+1.length; node2i=null; Free.count-; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
10、- - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - if(node2a-1.firstaddress+node2a-1.length=1000-Free.all)/合并没用的内存Free.all+=node2a-1.length; node2a-1=null; Free.count-; if(Free.count!=0) if(node20!=null) first=node20; else first=node21; for(int i=0;icount;i+)/用链表把内存块连起来if(node2i!=null) bef
11、ortail=node2i; befortail.next=node2i+1; public static void print() System.out.println( 占用内存块表:); System.out.println( 内存块名内存块首地址内存块长 ); Node node=new Node(); node=Use.first; for(int i=0;iUse.count;i+) if(node!=null) System.out.println( +node.name+ +node.firstaddress+ +node.length); node=node.next; Sy
12、stem.out.println( 空闲内存块表:); System.out.println( 内存块名内存块首地址内存块长 ); Node freenode=new Node(); freenode=Free.first; for(int i=0;iFree.count;i+) if(freenode!=null) System.out.println( +freenode.name+ +freenode.firstaddress+ +freenode.length); freenode=freenode.next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
13、- - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - package wcm3; 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. 申请内存;
14、 2 释放内存 ;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. 申请内存; 2 释放内存 ;3 退出程序 ); sc=new Scanner(System.in); a=sc.nextInt(); System.out.println(byebye!); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -