《计算机操作系统原理课程设计.doc》由会员分享,可在线阅读,更多相关《计算机操作系统原理课程设计.doc(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、优质文本上海电力学院课程设计报告课程名称: 操作系统原理 题目名称:采用可变分区存储管理,模拟主存空间的分配和回收 姓 名: xxx 学 号: xxx 班 级: 2013054 同组姓名: xxx 课程设计时间: 2015.7.62015.7.10 评 语: 成 绩: 课程设计题目一、 设计内容及要求可变分区存储管理模拟 设计内容: 编写程序模拟实现可变分区存储管理。具体要求:编写程序模拟实现可变分区存储管理,实现存储管理的根本功能,包括内存的分配、内存的回收、地址变换等。输入:1、输入新进程名称及使用内存的大小可创立多个进程;2、撤销某个指定的进程;3、某个进程的逻辑地址;输出:显示每次创立
2、进程或者撤销进程后内存使用的状况,包括每一个进程占据的内存的位置和大小; 计算并输出给定逻辑地址对应的物理地址。必须分别使用以下分配算法完成模拟:1、首次适应算法;2、最正确适应算法;3、最差适应算法;小组分工:程序设计讨论: 程序主体设计: 程序调试及修改: 实验报告设计: 总结: 要求注明小组分工情况二、 详细设计1) 原理概述 对于可变分区存储管理的内存分配与回收,主要为设计以下几个局部: 1、设计动态输入空闲分区表的程序 2、设计内存分配的程序 3、设计内存回收的程序首次适应算法:FF算法要求空闲分区表或空闲分区链以地址递增的次序链接。在分配内时,从链首开始查找,直至找到一个大小能满足
3、要求分区为止;然后再按照作业大小,从该分区中划一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。如从链首直至链尾都不能找到一个能满足要求的分区,那么此次分配失败,返回最正确适应算法: BF算法是指每次为作业分配内存,总是把满足要求、又是最小的空闲分区分配给作业,防止“大材小用。为了加速寻找,该算法要求所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。这样,第一次找到能满足要求的空闲区,必然是最正确的。最差适应算法: WF算法要扫描整个空闲分区表或链表,总是挑一个最大的空闲区分割给作业使用,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中、小作业有利,同时最坏适应分配算法
4、查找出效率很高。该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。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;thi
5、s.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 int5;/fenquno的随机数
6、int intREE=new int5;/fenqusize的随机数产生;int intRd;/存放随机数int intRDD;int count=0,count1=0;/产生的随机数的个数,count是fenquno,count1是fenqusizeint flag=0;/是否产生过随机数Random rdm=new Random();while (countintRe.length)intRd=Math.abs(rdm.nextInt()%5;for(int i=0;icount;i+)if(intRei=intRd)flag=1;break;elseflag=0;if(flag=0)in
7、tRecount=intRd;count+;while(count1intREE.length)intRDD=(int)(Math.random()*(60+1-30)+30;for(int i=0;icount1;i+)if(intREEi=intRDD)flag=1;break;elseflag=0;if(flag=0)intREEcount1=intRDD;count1+;for(int i=0;i5;i+)alist.add(new fenqu(intRei,intREEi);ll.add(new doubleNode(null,null,intRei,intREEi,0);Syste
8、m.out.println(区号+ 内存+ 地址+ 原分区+ 原大小+ 分配);for(int i=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);内存分配public static void fenpeineicun(process p)boolean re=true;for(int k=0;kalist.s
9、ize();k+)if(p.JCname=alist.get(k).procname)re=false;if(re)int i=0,j;ll parefenqusize(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).
10、fenqusize;fenqu fe=new fenqu(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+;elsefor(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.JCsiz
11、e)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(Stri
12、ng name)boolean re=true;for(int i=0;ill.theSize;i+)if(ll.get(i).re=1)for(int j=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) 算法流程图内存分配:pu
13、blic static void fenpeineicun(process p)boolean re=true;for(int k=0;kalist.size();k+)if(p.JCname=alist.get(k).procname)re=false;if(re)int i=0,j;ll parefenqusize(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&a
14、list.get(i).fenqusize!=ll.get(j).fenqusize)alist.get(i).fenqusize=ll.get(j).fenqusize;fenqu fe=new fenqu(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+;elsefor(i=0;ialist.size();i+)for(j=0;j所需要的吗? 否长度
15、=长度-XK起址=起址+XK是否为最后的分区块输出分配情况 不能输入作业 是结束实现算法主要代码:public static void sortaddress()fenqu d;ll.removeAll();for(int i=0;ialist.size();i+)for(int j=i+1;jalist.get(j).fenqustart)d=alist.get(i);alist.set(i,alist.get(j);alist.set(j,d);for(int i=0;ialist.size();i+)if(alist.get(i).procname!=null)ll.add(new do
16、ubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1);elsell.add(new doubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,0);2、 最正确适应算法开始 申请主存区j :=0j :=j+1查看空闲区表是否有空闲区 否将作业与排好的分区容量比照 是最正确的进行输入长度=长度-XK起址=起址+XK 输出分配情况 结束public static void sortmintomax()fenqu d;ll.removeAll();fo
17、r(int i=0;ialist.size();i+)for(int j=i+1;jalist.get(j).fenqusize)d=alist.get(i);alist.set(i,alist.get(j);alist.set(j,d);for(int i=0;ialist.size();i+)if(alist.get(i).procname!=null)ll.add(new doubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1);elsell.add(new doubleNode(null,null,alist
18、.get(i).fenquno,alist.get(i).fenqusize,0);3、最差适应算法申请主存区j :=0j :=j+1查看空闲区表是否有空闲区 否将作业与排好的分区容量比照 是空闲区最大的进行输入长度=长度-XK起址=起址+XK 输出分配情况 结束public static void sortmaxtomin()fenqu d;ll.removeAll();for(int i=0;ialist.size();i+)for(int j=i+1;jalist.size();j+)if(alist.get(i).fenqusizealist.get(j).fenqusize)d=al
19、ist.get(i);alist.set(i,alist.get(j);alist.set(j,d);for(int i=0;ialist.size();i+)if(alist.get(i).procname!=null)ll.add(new doubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,1);elsell.add(new doubleNode(null,null,alist.get(i).fenquno,alist.get(i).fenqusize,0);4) 源程序文件名 执行文件名 doubleNode.
20、java Fenqu.java Linkedlist.java Mainproc.java三、 实验结果与分析(要有结果截图) 随机产生内存分区: 输入进程:対进程进行算法执行:首次适应算法:最正确适应算法: 最差适应算法: 撤销进程操作: 四、设计总结 为了实现此三种算法,首先需要配置两种数据结构,来描述空闲分区表和空闲分区链,由于对java的数据结构比拟熟悉,本次就用了java语言,通过和小组成员的讨论,最后确定了,数组和双链表的结构和内容。 在本次编程中约到了许多问题,比方说,空闲分区表和空闲分区连,当进入一个新的进程的同时,必须让两个数据结构得以同步,开始的时候,总会出现进程分配成功,可是测试的时候没有显示出来的情况,经过两人的讨论和研究,最终解决了这个问题。 这次课程设计,复习了一下以前学过的java编程,还有java的数据结构,也加深了对操作系统的内存分配方面加深了了解。本次设计锻炼了自己的编程能力,对以后的学习奠定了根底。