1、计算机操作系统课程设计报告存储管理动态分区分配算法的模拟计算机操作系统课程设计题 目: 存储管理动态分区分配算法的模拟 专 业: 软件工程 年 级: 2012级 小组成员: 指导教师: 时 间: 地 点: 2012年 5 月 概述动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了五种分配算法,分别是:1.首次适应算法2.循环首次适应算法3.最坏适应算法4.最佳适应算法5. 快速适应算法2. 课程设计任务及要求2.1 设计任务要求设计主界面以灵活选择其中算法,5种算法都要求实现。2.2 设
2、计要求1)首先由系统生成当前的内存状态,要求未分配的分区数量不少于3个,且空间大小随机,然后随机生成一个数,表示等待分配进程的大小。2)然后显示上述算法由用户选择,结果显示分配后的状态。2.3 课程设计任务安排日期AB星期三下午研究算法研究算法星期四早上设计算法参与设计星期四下午设计算法,编写界面参与设计星期五早上编写算法完成部分文档星期五下午程序测试并优化程序测试,完成文档 3. 算法及数据结构3.1算法的总体思想(流程)设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, ,Pn,在动态
3、分区分配过程中需要分配的进程个数为m(mn),它们需要的分区大小分别为S1, ,Sm,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,进程在空闲分区中的分配情况。3.2首次适应算法3.2.1 功能在首次适应算法中,是从已建立好的数组中顺序查找,直至找到第一个大小能满足要求的空闲分区为止,然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空间令开辟一块新的地址,大小为原来的大小减去作业大小,若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。3.2.2 数据结构(包括变量的定义,要注释!) private static int MaxNum = 100; /空闲分
4、区个数 private static int n; /作业个数 private static int m; /空闲分区大小 private static int FreePartition = new intMaxNum; /作业名称 private static char ProcessName = new charMaxNum; /作业需求空间大小 private static int ProcessNeed = new intMaxNum; /作业分配标志 private static boolean state = new booleanMaxNum; /空闲分区个数 private
5、static int PartitionNum; /作业个数 private static int ProcessNum; /记录作业分配 private static char order = new charMaxNumMaxNum;3.2.3 算法(流程图表示,或伪C表示)public static void First() for(i=0;im;i+) for(j=0;jn;j+) /找到第一个合适的空闲分区 if(ProcessNeedi = FreePartitionj) & (!statei) for(k=0;k3;k+) /记录作业分配 if(orderjk = 0) /为空
6、orderjk=ProcessNamei; break; else continue; FreePartitionj=FreePartitionj-ProcessNeedi; statei=true; 3.3循环首次适应算法3.3.1功能 该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N=0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。3
7、.3.2 数据结构private static int MaxNum = 100; /空闲分区个数 private static int n; /作业个数 private static int m; /空闲分区大小 private static int FreePartition = new intMaxNum; /作业名称 private static char ProcessName = new charMaxNum; /作业需求空间大小 private static int ProcessNeed = new intMaxNum; /作业分配标志 private static boole
8、an state = new booleanMaxNum; /空闲分区个数 private static int PartitionNum; /作业个数 private static int ProcessNum; /记录作业分配 private static char order = new charMaxNumMaxNum;3.3.3算法public static void CycleFirst() i=0; j=0; while(in) & (jm) if(ProcessNeedi = FreePartitionj) & (!statei) for(k=0;k3;k+) /记录作业分配
9、if(orderjk=0) orderjk=ProcessNamei; break; else continue; FreePartitionj=FreePartitionj-ProcessNeedi; statei=true; i+; else j+; 3.4最佳适应算法3.4.1功能最佳适应分配算法是每次为作业分配内存时,扫描整个数组,总是把能满足条件的,又是最小的空闲分区分配给作业,避免“大材小用”。该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。这样,第一次找到的能满足要求的空闲区必然是最佳的。3.4.2 数据结构private static int MaxNum
10、= 100; /空闲分区个数 private static int n; /作业个数 private static int m; /空闲分区大小 private static int FreePartition = new intMaxNum; /作业名称 private static char ProcessName = new charMaxNum; /作业需求空间大小 private static int ProcessNeed = new intMaxNum; /作业分配标志 private static boolean state = new booleanMaxNum; /空闲分区
11、个数 private static int PartitionNum; /作业个数 private static int ProcessNum; /记录作业分配 private static char order = new charMaxNumMaxNum;3.4.3算法public static void Best() for(i=0;i temp) k+; temp=FreePartitionk; for(j=0;jn;j+) /按最佳适应算法找到符合的空闲区 if(ProcessNeedi FreePartitionj) & (!statei) temp=FreePartitionj;
12、 k=j; else continue; for(d=0;d3;d+) /记录作业分配 if(orderkd=0) orderkd=ProcessNamei; break; else continue; FreePartitionk=FreePartitionk-ProcessNeedi; statei=true; 3.5最坏适应算法3.5.1功能最坏适应分配算法选择空闲分区的策略正好与最佳适应算法相反。是每次为作业分配内存时,扫描整个数组,总是把能满足条件的,又是最大的空闲分区分配给作业。对中小作业有利,同时查找效率很高。3.5.2 数据结构private static int MaxNum
13、 = 100; /空闲分区个数 private static int n; /作业个数 private static int m; /空闲分区大小 private static int FreePartition = new intMaxNum; /作业名称 private static char ProcessName = new charMaxNum; /作业需求空间大小 private static int ProcessNeed = new intMaxNum; /作业分配标志 private static boolean state = new booleanMaxNum; /空闲分
14、区个数 private static int PartitionNum; /作业个数 private static int ProcessNum; /记录作业分配 private static char order = new charMaxNumMaxNum;3.5.3算法public static void Worst() for(i=0;im;i+) temp=FreePartition0; k=0; for(j=0;jn;j+) /按最坏适应算法找到合适的空闲分区 if(ProcessNeedi = FreePartitionj) & (temp FreePartitionj) & (
15、!statei) temp=FreePartitionj; k=j; else continue; for(d=0;d3;d+) /记录作业分配 if(orderkd=0) orderkd=ProcessNamei; break; else continue; FreePartitionk=FreePartitionk-ProcessNeedi; statei=true; 4. 程序设计与实现4.1 程序流程图4.2 程序代码(要注释)D_ProcessPartition.javaimport java.io.BufferedInputStream;import java.io.FileInp
16、utStream;import java.io.FileNotFoundException;import java.util.Random;import java.util.Scanner;public class D_ProcessPartition private static int MaxNum = 100; /空闲分区个数 private static int n; /作业个数 private static int m; /空闲分区大小 private static int FreePartition = new intMaxNum; /作业名称 private static cha
17、r ProcessName = new charMaxNum; /作业需求空间大小 private static int ProcessNeed = new intMaxNum; /作业分配标志 private static boolean state = new booleanMaxNum; /空闲分区个数 private static int PartitionNum; /作业个数 private static int ProcessNum; /记录作业分配 private static char order = new charMaxNumMaxNum; /? private stati
18、c char ch = new charMaxNum; /临时变量 private static int temp; /算法选择 /1-首次适应算法 /2-循环首次适应算法 /3-最佳适应算法 /4-最坏适应算法 private static int option=0; /for循环中使用 private static int i; private static int j; private static int k; private static int d; private static Scanner stdin; public String D_ProcessPartition(int
19、 option,int n) throws FileNotFoundException String xinxi=; String zuoyexinxi=; String suanfaString=; /输入数据 xinxi=input(n); /选择算法 /1-首次适应算法 /2-循环首次适应算法 /3-最佳适应算法 /4-最坏适应算法 switch(option) case 1: suanfaString=首次适应算法; First(n); zuoyexinxi=对作业用首次适应算法进行空间分配:n+output(n); break; case 2: suanfaString=循环首次适应
20、算法; CycleFirst(n); zuoyexinxi=对作业用循环首次适应算法进行空间分配:n+output(n); break; case 3: suanfaString=最佳适应算法; Best(n); zuoyexinxi=对作业用最佳适应算法进行空间分配:n+output(n); break; case 4: suanfaString=最坏适应算法; Worst(n); zuoyexinxi=对作业用最坏适应算法进行空间分配:n+output(n); break; /返回数据在JTA上显示出来 String all=你选择了+suanfaString+nn+xinxi+nn+zu
21、oyexinxi; return all; /输入数据 public static String input(int n) throws FileNotFoundException /算法选择 /1-首次适应算法 /2-循环首次适应算法 /3-最佳适应算法 /4-最坏适应算法 String result=; /请依次输入空闲分区大小(KB) for(i=0 ; in ; i+) FreePartitioni = RandomTest(); result=result+FreePartitioni+ ; result=随机的+n+个空闲分区大小为:+result+n+随机的作业大小为:; /请输
22、入作业个数,按题目要求默认为1 可设置 m = 1; /固定的作业名称 ProcessNamei = Process.charAt(0); chi = ProcessNamei; /按题目要求随机作业大小(KB) for(i=0;im;i+) ProcessNeedi = RandomTest(); statei=false; result=result+ProcessNeedi; return result; public static int RandomTest() int min=1; Random random = new Random(); int s = random.nextI
23、nt(MaxNum)%(MaxNum-min+1) + min; System.out.println(s); return s; /1首次适应算法 public static void First(int n) for(i=0;im;i+) for(j=0;jn;j+) /找到第一个合适的空闲分区 if(ProcessNeedi = FreePartitionj) & (!statei) for(k=0;k3;k+) /记录作业分配 if(orderjk = 0) /为空 orderjk=ProcessNamei; break; else continue; FreePartitionj=F
24、reePartitionj-ProcessNeedi; statei=true; /2循环首次适应算法 public static void CycleFirst(int n) i=0; j=0; while(in) & (jm) if(ProcessNeedi = FreePartitionj) & (!statei) for(k=0;k3;k+) /记录作业分配 if(orderjk=0) orderjk=ProcessNamei; break; else continue; FreePartitionj=FreePartitionj-ProcessNeedi; statei=true; i+; else j+; /3最佳适应算法 public static void Best(int n) for(i=0;i temp) k+; temp=FreePartitionk; for(j=0;jn;j+) /按最佳适应算法找到符合的空闲区 if(ProcessNeedi FreePartitionj) & (!statei) temp=FreePartitionj; k=j; else continue;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1