上海电力学院课程设计报告课程名称:操作系统原理题目名称:采用可变分区存储管理,模拟主存空间的分配和回收姓名: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、空闲分区表的定义publicclassfenqu{publicintfenquno,fenqusize,fenqustart;publicStringprocname;publicstaticintcofenqusize=0;//创建起始分区基址publicfenqu(intfenquno,intfenqusize){this.fenquno=fenquno;this.fenqusize=fenqusize;this.fenqustart=cofenqusize;cofenqusize+=fenqusize;procname=null;}publicfenqu(intfenquno,intfenqusize,intfenqustart){this.fenquno=fenquno;this.fenqusize=fenqusize;this.fenqustart=fenqustart;procname=null;}}已分配分区表的定义publicstaticvoidcreatefenqu(){intintRe[]=newint[5];//fenquno的随机数intintREE[]=newint[5];//fenqusize的随机数产生;intintRd;//存放随机数intintRDD;intcount=0,count1=0;//产生的随机数的个数,count是fenquno,count1是fenqusizeintflag=0;//是否产生过随机数Randomrdm=newRandom();while(countintRe.length){intRd=Math.abs(rdm.nextInt())%5;for(inti=0;icount;i++){if(intRe[i]==intRd){flag=1;break;}elseflag=0;}if(flag==0){intRe[count]=intRd;count++;}}while(count1intREE.length){intRDD=(int)(Math.random()*(60+1-30))+30;for(inti=0;icount1;i++){if(intREE[i]==intRDD){flag=1;break;}elseflag=0;}if(flag==0){intREE[count1]=intRDD;count1++;}}for(inti=0;i5;i++){alist.add(newfenqu(intRe[i],intREE[i]));ll.add(newdoubleNode(null,null,intRe[i],intREE[i],0));}System.out.println(区号+内存+地址+原分区+原大小+分配);for(inti=0;ialist.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);}}内存分配publicstaticvoidfenpeineicun(processp){booleanre=true;for(intk=0;kalist.size();k++){if(p.JCname==alist.get(k).procname)re=false;}if(re){inti=0,j;ll.comparefenqusize(p.JCsize,maxfenquno);if(alist.size()ll.theSize){for(i=0;ialist.size();i++){for(j=0;jll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusize!=ll.get(j).fenqusize){alist.get(i).fenqusize=ll.get(j).fenqusize;fenqufe=newfenqu(ll.get(i+1).fenquno,ll.get(i+1).fenqusize,alist.get(i).fenqustart+alist.get(i).fenqusize);alist.add(fe);alist.get(i).procname=p.JCname;maxfenquno++;}}}}else{for(i=0;ialist.size();i++){for(j=0;jll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusize==p.JCsize){alist.get(i).procname=p.JCname;}}}}}elseSystem.out.println(有同名进程,不能分配内存);}publicstaticvoidFF(processp){sortaddress();fenpeineicun(p);}publicstaticvoidBF(processp){sortmintomax();fenpeineicun(p);}publicstaticvoidWF(processp){sortmaxtomin();fenpeineicun(p);}1、内存回收publicstaticvoiddropprocess(Stringname){booleanre=true;for(inti=0;ill.theSize;i++){if(ll.get(i).re==1){for(intj=0;jalist.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)算法(流程图)内存分配:从头开始查表检索完否?m.size>u.size?m.size-u.size≤size?从该分区中划出u.size大小的分区将该分区分配给请求者修改有关数据结构返回返回继续检索下一个表项将该分区从链中移出YNNYYNpublicstaticvoidfenpeineicun(processp){booleanre=true;for(intk=0;kalist.size();k++){if(p.JCname==alist.get(k).procname)re=false;}if(re){inti=0,j;ll.comparefenqusize(p.JCsize,maxfenquno);if(alist.size()ll.theSize){for(i=0;ialist.size();i++){for(j=0;jll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusize!=ll.get(j).fenqusize){alist.get(i).fenqusize=ll.get(j).fenqusize;fenqufe=newfenqu(ll.get(i+1).fenquno,ll.get(i+1).fenqusize,alist.get(i).fenqustart+alist.get(i).fenqusize);alist.add(fe);alist.get(i).procname=p.JCname;maxfenquno++;}}}}else{for(i=0;ialist.size();i++){for(j=0;jll.theSize;j++){if(alist.get(i).fenquno==ll.get(j).fenquno&&alist.get(i).fenqusize==p.JCsize){alist.get(i).procname=p.JCname;}}}}}elseSystem.out.println(有同名进程,不能分配内存);}1、首次适应算法=开始j:=j+1查看空闲区表是否有空闲区j:=0申请主存区长度所需要的吗?长度=长度-XK起址=起址+XK是否为未分配状态是否为最后的分区块此区已满输出分配情况否是实现算法主要代码:publicstaticvoidsortaddress(){fenqud;ll.removeAll();for(inti=0;ialist.size();i++){for(intj=i+1;jalist.size();j++){if(alist.get(i).fenqustartalist.get(j).fenqustart){d=alist.get(i);alist.set(i,alist.get(j));alist.set(j,d);}}}for(inti=0;ialist.size();i++){if(alist.get(i).procname!=null)ll.add(newdoubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1));elsell.add(ne