上海电力学院课程设计报告课程名称:操作系统原理题目名称:采用可变分区存储管理,模拟主存空间的分配和回收姓名: xxx 学号: xxx班级: 2013054 同组姓名: xxx 课程设计时间: 2015.7.6~2015.7.10 评语:成绩:课程设计题目一、设计内容及要求可变分区存储管理模拟设计内容:编写程序模拟实现可变分区存储管理。
具体要求:编写程序模拟实现可变分区存储管理,实现存储管理的基本功能,包括内存的分配、内存的回收、地址变换等。
输入:1、输入新进程名称及使用内存的大小(可创建多个进程);2、撤销某个指定的进程;3、某个进程的逻辑地址;输出:显示每次创建进程或者撤销进程后内存使用的状况,包括每一个进程占据的内存的位置和大小;计算并输出给定逻辑地址对应的物理地址。
必须分别使用以下分配算法完成模拟:1、首次适应算法;2、最佳适应算法;3、最差适应算法;小组分工:程序设计讨论:程序主体设计:程序调试及修改:实验报告设计:总结:(要求注明小组分工情况)二、详细设计1)原理概述对于可变分区存储管理的内存分配与回收,主要为设计以下几个部分:1、设计动态输入空闲分区表的程序2、设计内存分配的程序3、设计内存回收的程序首次适应算法:FF算法要求空闲分区表或空闲分区链以地址递增的次序链接。
在分配内时,从链首开始查找,直至找到一个大小能满足要求分区为止;然后再按照作业大小,从该分区中划一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。
如从链首直至链尾都不能找到一个能满足要求的分区,则此次分配失败,返回最佳适应算法:BF算法是指每次为作业分配内存,总是把满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。
为了加速寻找,该算法要求所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
这样,第一次找到能满足要求的空闲区,必然是最佳的。
最差适应算法:WF算法要扫描整个空闲分区表或链表,总是挑一个最大的空闲区分割给作业使用,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中、小作业有利,同时最坏适应分配算法查找出效率很高。
该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。
2)主要数据结构1、空闲分区表的定义public class fenqu {public int fenquno,fenqusize,fenqustart;public String procname;public static int cofenqusize=0;//创建起始分区基址public fenqu(int fenquno,int fenqusize){this.fenquno=fenquno;this.fenqusize=fenqusize;this.fenqustart=cofenqusize;cofenqusize+=fenqusize;procname=null;}public fenqu(int fenquno,int fenqusize,int fenqustart){this.fenquno=fenquno;this.fenqusize=fenqusize;this.fenqustart=fenqustart;procname=null;}}已分配分区表的定义public static void createfenqu(){int intRe[]=new int[5];//fenquno的随机数int intREE[]=new int[5];//fenqusize的随机数产生;int intRd;//存放随机数int intRDD;int count=0,count1=0;//产生的随机数的个数,count是fenquno,count1是fenqusizeint flag=0;//是否产生过随机数Random rdm=new Random();while (count<intRe.length){intRd=Math.abs(rdm.nextInt())%5;for(int i=0;i<count;i++){if(intRe[i]==intRd){flag=1;break;}elseflag=0;}if(flag==0){intRe[count]=intRd;count++;}}while(count1<intREE.length){intRDD=(int)(Math.random()*(60+1-30))+30;for(int i=0;i<count1;i++){if(intREE[i]==intRDD){flag=1;break;}elseflag=0;}if(flag==0){intREE[count1]=intRDD;count1++;}}for(int i=0;i<5;i++){alist.add(new fenqu(intRe[i],intREE[i]));ll.add(new doubleNode(null,null,intRe[i],intREE[i],0));}System.out.println("区号"+" 内存"+" 地址"+" 原分区"+" 原大小"+" 分配");for(int i=0;i<alist.size();i++){System.out.println(alist.get(i).fenquno+""+alist.get(i).fenqusize+" "+alist.get(i).fenqustart+" "+ll.get(i).fenquno+""+ll.get(i).fenqusize+" "+ll.get(i).re);}}内存分配public static void fenpeineicun(process p){boolean re=true;for(int k=0;k<alist.size();k++){if(p.JCname==alist.get(k).procname)re=false;}if(re){int i=0,j;parefenqusize(p.JCsize, maxfenquno);if(alist.size()<ll.theSize){for(i=0;i<alist.size();i++){for(j=0;j<ll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusiz e!=ll.get(j).fenqusize){alist.get(i).fenqusize=ll.get(j).fenqusize;fenqu fe=newfenqu(ll.get(i+1).fenquno,ll.get(i+1).fenqusize,alist.get(i).fenqusta rt+alist.get(i).fenqusize);alist.add(fe);alist.get(i).procname=p.JCname;maxfenquno++;}}}}else{for(i=0;i<alist.size();i++){for(j=0;j<ll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusiz e==p.JCsize){alist.get(i).procname=p.JCname;}}}}}elseSystem.out.println("有同名进程,不能分配内存");}public static void FF(process p){sortaddress();fenpeineicun(p);}public static void BF(process p){sortmintomax();fenpeineicun(p);}public static void WF(process p){sortmaxtomin();fenpeineicun(p);}1、内存回收public static void dropprocess(String name){boolean re=true;for(int i=0;i<ll.theSize;i++){if(ll.get(i).re==1){for(int j=0;j<alist.size();j++){if(ll.get(i).fenquno==alist.get(j).fenquno&&alist.get(j).procname .equals(name)){ll.get(i).re=0;alist.get(i).procname=null;re=false;System.out.println("进程撤销成功");}}}}if(re){System.out.println("不存在该进程");}}3)算法(流程图)内存分配:public static void fenpeineicun(process p){boolean re=true;for(int k=0;k<alist.size();k++){if(p.JCname==alist.get(k).procname)re=false;}if(re){int i=0,j;parefenqusize(p.JCsize, maxfenquno);if(alist.size()<ll.theSize){for(i=0;i<alist.size();i++){for(j=0;j<ll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusiz e!=ll.get(j).fenqusize){alist.get(i).fenqusize=ll.get(j).fenqusize;fenqu fe=newfenqu(ll.get(i+1).fenquno,ll.get(i+1).fenqusize,alist.get(i).fenqusta rt+alist.get(i).fenqusize);alist.add(fe);alist.get(i).procname=p.JCname;maxfenquno++;}}}}else{for(i=0;i<alist.size();i++){for(j=0;j<ll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusiz e==p.JCsize){alist.get(i).procname=p.JCname;}}}}}elseSystem.out.println("有同名进程,不能分配内存"); }1、首次适应算法public static void sortaddress(){fenqu d;ll.removeAll();for(int i=0;i<alist.size();i++){for(int j=i+1;j<alist.size();j++){if(alist.get(i).fenqustart>alist.get(j).fenqustart){d=alist.get(i);alist.set(i,alist.get(j));alist.set(j,d);}}}for(int i=0;i<alist.size();i++){if(alist.get(i).procname!=null)ll.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1));elsell.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,0));}}2、最佳适应算法public static void sortmintomax(){fenqu d;ll.removeAll();for(int i=0;i<alist.size();i++){for(int j=i+1;j<alist.size();j++){if(alist.get(i).fenqusize>alist.get(j).fenqusize){d=alist.get(i);alist.set(i,alist.get(j));alist.set(j,d);}}}for(int i=0;i<alist.size();i++){if(alist.get(i).procname!=null)ll.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1));elsell.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,0));}3、最差适应算法public static void sortmaxtomin(){fenqu d;ll.removeAll();for(int i=0;i<alist.size();i++){for(int j=i+1;j<alist.size();j++){if(alist.get(i).fenqusize<alist.get(j).fenqusize){d=alist.get(i);alist.set(i,alist.get(j));alist.set(j,d);}}}for(int i=0;i<alist.size();i++){if(alist.get(i).procname!=null)ll.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1));elsell.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,0));}}4)源程序文件名执行文件名doubleNode.javaFenqu.javaLinkedlist.javaMainproc.java三、实验结果与分析(要有结果截图)随机产生内存分区:输入进程:対进程进行算法执行:首次适应算法:最佳适应算法:最差适应算法:撤销进程操作:四、设计总结为了实现此三种算法,首先需要配置两种数据结构,来描述空闲分区表和空闲分区链,由于对java的数据结构比较熟悉,本次就用了java语言,通过和小组成员的讨论,最后确定了,数组和双链表的结构和内容。