操作系统_动态分区分配算法课程设计_java版
- 格式:doc
- 大小:128.50 KB
- 文档页数:13
动态分区算法课程设计一、课程目标知识目标:1. 让学生掌握动态分区算法的基本概念,理解内存动态分配的原理;2. 学会分析不同动态分区算法的特点,如首次适应算法、最佳适应算法等;3. 了解动态分区算法在操作系统内存管理中的应用。
技能目标:1. 能够运用动态分区算法解决实际问题,提高内存空间的利用率;2. 培养学生编写和调试动态分区算法程序的能力;3. 培养学生通过对比分析,选择合适的动态分区算法解决问题的能力。
情感态度价值观目标:1. 培养学生对操作系统内存管理知识的兴趣,激发学习热情;2. 培养学生的团队合作意识,学会在小组讨论中倾听他人意见;3. 培养学生面对问题积极思考、勇于探索的精神。
课程性质分析:本课程为计算机科学与技术专业课程,旨在帮助学生深入理解操作系统内存管理原理,掌握动态分区算法的应用。
学生特点分析:学生已具备一定的编程基础和操作系统知识,但可能对动态分区算法的了解较少,需要通过本课程进行深入学习。
教学要求:1. 注重理论与实践相结合,提高学生的实际操作能力;2. 激发学生思考,培养学生的创新意识和解决问题的能力;3. 关注学生情感态度的培养,提高学生的学习积极性。
二、教学内容1. 动态分区算法概述:介绍动态分区算法的概念、分类及其在内存管理中的作用;- 相关教材章节:第三章 内存管理,第2节 动态分区算法2. 首次适应算法:讲解首次适应算法的工作原理、实现步骤及优缺点;- 相关教材章节:第三章 内存管理,第2节 动态分区算法,2.1 首次适应算法3. 最佳适应算法:介绍最佳适应算法的工作原理、实现步骤及优缺点;- 相关教材章节:第三章 内存管理,第2节 动态分区算法,2.2 最佳适应算法4. 动态分区算法对比分析:对比不同动态分区算法的性能、适用场景等方面;- 相关教材章节:第三章 内存管理,第2节 动态分区算法,2.3 算法对比分析5. 动态分区算法编程实践:布置编程作业,要求学生编写和调试动态分区算法程序;- 相关教材章节:第三章 内存管理,第2节 动态分区算法,2.4 编程实践6. 动态分区算法在实际应用中的案例分析:分析操作系统内存管理中动态分区算法的应用案例;- 相关教材章节:第三章 内存管理,第2节 动态分区算法,2.5 应用案例分析教学内容安排和进度:第1周:动态分区算法概述第2周:首次适应算法第3周:最佳适应算法第4周:动态分区算法对比分析第5周:动态分区算法编程实践第6周:动态分区算法在实际应用中的案例分析及总结教学内容注重理论与实践相结合,旨在帮助学生系统地掌握动态分区算法的知识,培养其编程能力和解决问题的能力。
《计算机操作系统》课程设计题目:—存储管理一一动态分区分配算法的模拟 _专业: _________ 软件工程_______________年级: __________ 2012级 ___________小组成员:_____________________________ 指导教师:______________________________ 时间:________________________________地点:________________________________2012年5月目录目录 (1)概述 (3)2. ................................................................................................................................ 课程设计任务及要求. (3)2.1 设计任务 (3)2.2 设计要求 (3)2.3 课程设计任务安排 (3)3. 算法及数据结构 (4)3.1 算法的总体思想(流程) (4)3.2 首次适应算法 (4)3.2.1 功能 (4)3.2.2 数据结构(包括变量的定义,要注释!) (4)323算法(流程图表示,或伪C表示) (5)3.3 循环首次适应算法 (6)3.3.1 功能 (6)3.3.2 数据结构 (6)3.3.3 算法 (7)3.4 最佳适应算法 (8)3.4.1 功能 (8)3.4.2 数据结构 (8)3.4.3 算法 (8)3.5 最坏适应算法 (10)3.5.1 功能 (10)3.5.2 数据结构 (10)3.5.3 算法 (11)4. 程序设计与实现 (12)4.1 程序流程图 (12)4.2 程序代码(要注释) (12)4.3 实验结果 (21)5. 结论 (23)6. 收获、体会和建议。
(23)A的总结: (23)B的总结: (23)7. 参考文献。
操作系统动态分区分配算法java版实验四动态分区分配算法1、实验目的通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。
2、试验内容问题描述 :设计程序模拟四种动态分区分配算法: 首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。
假设内存中空闲分区个数为n,空闲分区大小分别为P,,P ,在动态分 1n区分配过程中需要分配的进程个数为m(m?n),它们需要的分区1m大小分别为S, ,S ,分别利用四种动态分区分配算法将m个进程放入n 个空闲分区,给出进程在空闲分区中的分配情况。
3、程序要求: 1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。
2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。
3)输入 : 空闲分区个数 n,空闲分区大小 P,,P ,进程个数 m,1n进程需要的分区大小S,,S ,算法选择1- 首次适应算法, 2- 循 1m环首次适应算法, 3- 最佳适应算法, 4- 最坏适应算法 4 、需求分析(1)输入的形式和输入值的范围算法选择空闲分区个数空闲分区大小 (KB)作业个数作业名称作业大小 (KB)(2)输出的形式最终内存空闲分区的分配情况5、调试分析通过这次课程设计我练习了用JAVA写系统软件,对 OS中可变分区存储管理有了更深刻的了解。
在写程序的时候也遇到了一些困难。
比如在设计数据结构时特别犹豫,总想找一个很合适的。
但是,后来才知道,关键要多尝试,而空想是没有用的。
最后我证实了自己的设计的合理性。
还有为了使程序更健壮,我尝试着将程序中的输入部分全部改为字符( 串) 。
很遗憾的是因为时间问题,没有把这个模拟程序写成动画形式,还可以加几句代码后实现动态的增加作业。
通过本次实验,深入理解了动态分区分配算法的思想,培养了自己的动手能力,通过实践加深了记忆。
实验题目:存储器内存分配设计思路:1.既然是要对内存进行操作,首先对和内存相关的内容进行设置我使用的是用自定义的数据结构struct来存放内存中一个内存块的内容包括:始地址、大小、状态(f:空闲u:使用e:结束)之后采用数组来存放自定义的数据类型,这样前期的准备工作就完成了2.有了要加工的数据,接下来定义并实现了存放自定义数据类型的数组的初始化函数和显示函数,需要显示的是每个内存块的块号、始地址、大小、状态3.接着依此定义三种动态分区分配算法首次适应算法、最佳适应算法和最差适应算法4.对定义的三种算法逐一进行实现①首次适应算法:通过遍历存放自定义数据类型的数组,找到遍历过程中第一个满足分配大小的内存块块号i,找到之后停止对数组的遍历,将i之后的块号逐个向后移动一个,然后将满足分配大小的内存块i分为两块,分别是第i块和第i+1块,将两块的始地址、大小、状态分别更新,这样便实现了首次适应算法②最佳适应算法:和首次适应算法一样,首先遍历存放自定义数据类型的数组,找到满足分配大小的内存块后,对内存块的大小进行缓存,因为最佳适应是要找到最接近要分配内存块大小的块,所以需要遍历整个数组,进而找到满足分配大小要求的而且碎片最小的块i,之后的操作和首次遍历算法相同③最差适应算法:和最佳适应算法一样,区别在于,最佳适应是找到最接近要分配内存块大小的块,而最差适应是要找到在数组中,内存最大的块i,找到之后的操作和最佳适应算法相同,因此不在这里赘述。
5.定义并实现释放内存的函数通过块号找到要释放的内存块,把要释放的内存块状态设置成为空闲,查看要释放的块的左右两侧块的状态是否为空闲,如果有空闲,则将空闲的块和要释放的块进行合并(通过改变块的始地址、大小、状态的方式)6.定义主函数,用switch来区分用户需要的操作,分别是:①首次适应②最佳适应③最差适应④释放内存⑤显示内存⑥退出系统实验源程序加注释:#include<bits/stdc++.h>#define MI_SIZE 100 //内存大小100typedef struct MemoryInfomation//一个内存块{int start; //始地址int Size; //大小char status; //状态 f:空闲 u:使用 e:结束} MI;MI MList[MI_SIZE];void InitMList() //初始化{int i;MI temp = { 0,0,'e' };for (i = 0; i < MI_SIZE; i++){MList[i] = temp;}MList[0].start = 0; //起始为0MList[0].Size = MI_SIZE;//大小起始最大MList[0].status = 'f'; //状态起始空闲}void Display() //显示{int i, used = 0;printf("\n---------------------------------------------------\n");printf("%5s%15s%15s%15s", "块号", "始地址", "大小", "状态");printf("\n---------------------------------------------------\n");for (i = 0; i < MI_SIZE && MList[i].status != 'e'; i++){if (MList[i].status == 'u'){used += MList[i].Size;}printf("%5d%15d%15d%15s\n", i, MList[i].start, MList[i].Size, MList[i].status == 'u' ? "使用" : "空闲");}printf("\n----------------------------------------------\n");}void FirstFit(){int i, j, flag = 0;int request;printf("最先适应算法:请问你要分配多大的内存\n");scanf("%d", &request);for (i = 0; i < MI_SIZE && MList[i].status != 'e'; i++){if (MList[i].Size >= request && MList[i].status == 'f') {if (MList[i].Size - request <= 0){MList[i].status = 'u';}else{for (j = MI_SIZE - 2; j > i; j--){MList[j + 1] = MList[j];}MList[i + 1].start = MList[i].start + request; MList[i + 1].Size = MList[i].Size - request;MList[i + 1].status = 'f';MList[i].Size = request;MList[i].status = 'u';flag = 1;}break;}}if (flag != 1 || i == MI_SIZE || MList[i].status == 'e'){printf("没有足够大小的空间分配\n");}Display();}void BadFit(){int i, j = 0, k = 0, flag = 0, request;printf("最坏适应算法:请问你要分配多大的内存\n");scanf("%d", &request);for (i = 0;i < MI_SIZE - 1 && MList[i].status != 'e';i++){if (MList[i].Size >= request && MList[i].status == 'f') {flag = 1;if (MList[i].Size > k){k = MList[i].Size;j = i;}}}i = j;if (flag == 0){printf("没有足够大小的空间分配\n");j = i;}else if (MList[i].Size - request <= 0){MList[i].status = 'u';}else{for (j = MI_SIZE - 2;j > i;j--){MList[j + 1] = MList[j];}MList[i + 1].start = MList[i].start + request;MList[i + 1].Size = MList[i].Size - request;MList[i + 1].status = 'f';MList[i].Size = request;MList[i].status = 'u';}Display();}void M_Release() //释放内存{int i, number;printf("\n请问你要释放哪一块内存:\n");scanf("%d", &number);if (MList[number].status == 'u'){MList[number].status = 'f';if (MList[number + 1].status == 'f')//右边空则合并{MList[number].Size += MList[number].Size;for (i = number + 1; i < MI_SIZE - 1 && MList[i].status != 'e'; i++) { //i后面的每一个结点整体后移if (i > 0){MList[i] = MList[i + 1];}}}if (number > 0 && MList[number - 1].status == 'f')//左边空则合并{MList[number - 1].Size += MList[number].Size;for (i = number; i < MI_SIZE - 1 && MList[i].status != 'e'; i++){MList[i] = MList[i + 1];}}}else{printf("该块内存无法正常释放\n");}Display();}void BestFit(){int i, j = 0, t, flag = 0, request;printf("最佳适应算法:请问你要分配多大的内存\n");scanf("%d", &request);t = MI_SIZE;for (i = 0; i < MI_SIZE && MList[i].status != 'e'; i++){if (MList[i].Size >= request && MList[i].status == 'f'){flag = 1;if (MList[i].Size < t){t = MList[i].Size;j = i;}}}i = j;if (flag == 0){printf("没有足够大小的空间分配\n");j = i;}else if (MList[i].Size - request <= 0){MList[i].status = 'u';}else {for (j = MI_SIZE - 2; j > i; j--){MList[j + 1] = MList[j];}MList[i + 1].start = MList[i].start + request;MList[i + 1].Size = MList[i].Size - request;MList[i + 1].status = 'f';MList[i].Size = request;MList[i].status = 'u';}Display();}int main(){int x;InitMList();while (1){printf(" \n"); printf(" 1.首次适应\n");printf(" 2.最佳适应\n");printf(" 3.最差适应\n"); printf(" 4.释放内存\n"); printf(" 5.显示内存\n"); printf(" 6.退出系统\n"); printf("请输入1-6:");scanf("%d", &x);switch (x){case 1:FirstFit();break;case 2:BestFit();break;case 3:BadFit();break;case 4:M_Release();break;case 5:Display();break;case 6:exit(0);}}return 0;}实验测试结果记录:1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存10---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 90 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存25---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 25 使用2 35 65 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存15---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 25 使用2 35 15 使用3 50 50 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存20---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 25 使用2 35 15 使用3 50 20 使用4 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:4请问你要释放哪一块内存:---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 空闲1 10 25 使用2 35 15 使用3 50 20 使用4 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:4请问你要释放哪一块内存:2---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 空闲1 10 25 使用2 35 15 空闲3 50 20 使用4 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:2最佳适应算法:请问你要分配多大的内存5---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 5 使用1 5 5 空闲2 10 25 使用3 35 15 空闲4 50 20 使用5 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:3最坏适应算法:请问你要分配多大的内存25---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 5 使用1 5 5 空闲2 10 25 使用3 35 15 空闲4 50 20 使用5 70 25 使用6 95 5 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:总结与自评:总结:分区存储管理是操作系统进行内存管理的一种方式。
动态分区算法课程设计一、教学目标本课程旨在让学生了解和掌握动态分区算法的基本概念、原理和实现方法。
通过本课程的学习,学生应达到以下目标:1.知识目标:–了解动态分区算法的定义、特点和应用场景;–掌握动态分区算法的核心思想和基本原理;–熟悉常用的动态分区算法及其优缺点。
2.技能目标:–能够运用动态分区算法解决实际问题;–能够编写程序实现动态分区算法;–能够对动态分区算法的性能进行分析和优化。
3.情感态度价值观目标:–培养学生的逻辑思维能力和创新意识;–增强学生对计算机科学和算法的兴趣和热情;–培养学生团队合作和自主学习的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.动态分区算法的基本概念和原理;2.常用的动态分区算法及其实现;3.动态分区算法的应用场景和性能分析;4.动态分区算法的编程实践和案例分析。
具体的教学大纲和进度安排如下:第一周:介绍动态分区算法的基本概念和原理;第二周:学习常用的动态分区算法并编写程序实现;第三周:分析动态分区算法的应用场景和性能;第四周:进行动态分区算法的编程实践和案例分析。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式进行教学:1.讲授法:通过讲解和演示,让学生了解动态分区算法的基本概念和原理;2.讨论法:通过小组讨论和思考,让学生深入理解和掌握动态分区算法;3.案例分析法:通过分析和解决实际问题,让学生学会运用动态分区算法;4.实验法:通过编程实践和实验操作,让学生亲手实现和验证动态分区算法。
四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:选用权威、实用的教材,提供全面、系统的动态分区算法知识;2.参考书:提供相关的参考书籍,丰富学生的知识视野;3.多媒体资料:制作精美的PPT和教学视频,生动展示动态分区算法的原理和实现;4.实验设备:提供计算机和编程环境,让学生进行编程实践和实验操作。
动态分区分配操作系统操作方法实验步骤1.引言1.1 概述概述部分:在计算机系统中,动态分区分配是一种重要的操作系统操作方法。
它是指在运行时根据进程的内存需求动态地将系统内存分配给进程,以实现内存资源的高效利用。
动态分区分配操作方法在现代操作系统中被广泛应用,例如Windows、Linux等。
通过合理的动态分区分配策略,可以提升系统的性能和资源利用率。
本文将对动态分区分配操作系统操作方法进行详细介绍和实验步骤的说明。
首先,我们将介绍动态分区分配的背景和意义,包括其在操作系统中的作用和应用场景。
其次,我们将详细讨论实验的具体步骤,包括如何进行动态分区分配操作、如何测试相关的性能指标等。
本文的目标是帮助读者了解动态分区分配操作系统操作方法的基本原理和实践技巧。
同时,通过实际操作和实验验证,读者将能够更好地理解动态分区分配的概念和操作过程,提升对操作系统的理解和应用能力。
在接下来的章节中,我们将分别介绍动态分区分配操作系统操作方法的背景和实验步骤,并给出相应的实例和案例分析。
最后,我们将对实验结果进行总结和展望,探讨动态分区分配操作方法的发展前景和可能的研究方向。
通过本文的阅读和实验操作,读者将能够对动态分区分配操作系统操作方法有一个全面的了解,为进一步研究和应用提供基础和指导。
同时,我们也欢迎读者对本文内容进行补充和扩展,以促进相关领域的进一步发展和应用。
1.2 文章结构文章结构部分的内容可以从以下角度进行描述:文章结构是指整篇文章的组织框架和内容安排。
合理的文章结构可以使读者更好地理解文章的主题和内容,帮助读者快速找到所需信息并形成完整的认识。
本文将按照以下结构进行论述:1. 引言:在引言部分,我们将对动态分区分配操作系统操作方法的背景和意义进行介绍,明确文章的目的和重要性。
2. 正文:正文是文章的核心部分,将分为两个要点进行叙述。
2.1 第一个要点:动态分区分配操作系统操作方法。
首先,我们将对动态分区分配的背景进行介绍,解释其在操作系统中的应用和意义。
计算机操作系统动态分区磁盘调度算法一个好的计算机系统不仅要有足够的存储容量,较高的存取速度和稳定可靠的存储器,而且能够合理的分配和使用这些主存空间。
当用户提出申请主存空间的要求时,存储管理能够按照一定的策略分析主存的使用情况,找出足够的空间分配给申请者;当作业运行完毕,存储管理要回收作业占用的主存空间。
本实验采取可变分区存储管理方法,用常用分区管理算法模拟磁盘管理过程,以加深了解操作系统的存储管理功能。
1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5. 设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。
6. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
首次适应算法将内存中的空闲区按照地址由低到高的顺序形成空闲区表当一个新作业要求装入主存时,查空闲区表,从中找到第一个满足要求的空闲区,为作业分配主存空间,并将剩余空闲区按照地址由小到大的顺序插入空闲区表的合适位置,修改已分配表当作业运行结束后,回收作业的主存空间,并与相邻空闲区合并,修改空闲区表和已分配表每次主存分配和回收后,打印空闲区表和已分配表详细描述实验设计思想、程序结构及各模块设计思路;详细描述程序所用数据结构及算法;明确给出测试用例和实验结果;为增加程序可读性,在程序中进行适当注释说明;认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;#include<iostream>#include<cstdlib>using namespace std;const int procsize=5;typedef struct Node{int PId; //进程Idint Prio; //进程优先数int NeedRunTime; //进程需要运行时间int Room; //进程所需空间大小Node * next; //就绪队列中的下个就绪进程的地址}PCB;typedef struct{ //就绪链式队列结构体PCB *front;PCB *rear;}AleadyQueue;typedef struct Tab{ //分区表结构体int CalledId; //调用该分区的进程Idint TabId; //分区号int Size; //大小int StartAdd; //始址char * Status; //使用状态Tab *next; //指向下个分区}Table;void CinInfo(PCB P[procsize]){ //输入进程信息cout<<"\t\t请输入5个进程,格式如下:\n\n ";cout<<"PId 优先数运行时间所需内存大小(最好是小于20)\n";int i=0,j=0;for(i,j; i<procsize ; i++,j++){cin>>P[j].PId>>P[j].Prio>>P[j].NeedRunTime>>P[j].Room;}}void Sort(PCB P[procsize]){ //根据优先数由冒泡法对进程进行排序int i,j,exchange=1; //exchange表示相邻PCB是否调换PCB Temp;for(i=procsize;i>1&&exchange;i--){exchange=0;for(j=0;j<i-1;j++)if(P[j].Prio<P[j+1].Prio){Temp=P[j];P[j]=P[j+1];P[j+1]=Temp;exchange=1;}}}AleadyQueue InitQueue(){ //就绪队列初始化函数AleadyQueue Q;Node *p;p=(Node *)malloc(sizeof(PCB));if(!p){cout<<"就绪队列初始化失败!\n";exit(0);}else{Q.front=Q.rear=p;Q.front->next=NULL;return Q;}}void EnQueue(AleadyQueue &Queue,PCB &P){ //进程入队操作函数Node *p;p=(Node *)malloc(sizeof(PCB));if(!p)cout<<"分配节点失败!\n";else {*p=P;p->next=NULL;Queue.rear->next=p;Queue.rear=p;}}void EnQueue1(AleadyQueue &Queue,PCB &P){ //进程入队操作函数Node *p;p=(Node *)malloc(sizeof(PCB));if(!p)cout<<"分配节点失败!\n";else {*p=P;p->next=NULL;Queue.rear->next=p;Queue.rear=p;}}PCB OutQueue(AleadyQueue &Q){ //进程出队操作函数Node *P;P=(Node *)malloc(sizeof(PCB));if(Q.front->next!=NULL){P=Q.front->next;Q.front->next=P->next;}return *P;}PCB OutQueue1(AleadyQueue &Q){ //进程出队操作函数Node *P;P=(Node *)malloc(sizeof(PCB));if(Q.front->next!=NULL){P=Q.front->next;Q.front->next=P->next;}return *P;}void printinfo(AleadyQueue Q){ //打印就绪队列的情况cout<<"目前就绪队列进程情况如下:\n";cout<<"PId\t\tPriority\t\tNeedTime\t\tRoom\n";Q.front=Q.front->next;while(1){if(Q.front!=NULL){cout<<Q.front->PId<<"\t\t"<<Q.front->Prio<<"\t\t\t";cout<<Q.front->NeedRunTime<<"\t\t\t"<<Q.front->Room<<endl;Q.front=Q.front->next;}elsebreak;}}int chose(){ //选择所选算法int i;cout<<"请选择:\n";cout<<" 1、采用<首次适应>算法为进程分配内存!\n";cout<<" 2、采用<最佳适应>算法为进程分配内存!\n";cout<<" 3、采用<最坏适应>算法为进程分配内存!\n";cout<<" 4、结束!\n";cin>>i;return i;}Table * CreateMMTable(){ //定义主存分区表Table * FT; //用尾插入法Table * R;Table * P;FT=(Table *)malloc(sizeof(Tab));R=FT;FT->next=NULL;int num=0;int LastAdd=0;int LastSize=1;while(1){P=(Table *)malloc(sizeof(Tab));P->CalledId=0; //被调用的进程调Id初始化为0P->TabId=num; //主存分区号P->Size=3*num+1; //分区大小P->StartAdd=LastAdd+LastSize; //分区始址P->Status="Free"; //分区状态num++; //分区号加1LastAdd=P->StartAdd; //重新定义LastAdd为上次的StartAddLastSize=P->Size; //同上P->next=NULL;R->next=P;R=P;if(P->StartAdd==93) //内存初始化完毕break;}return FT;}Table * CreateUsedTable(){ //创建已分配表Table * T;T=(Table *)malloc(sizeof(Tab));T->next=NULL;return T;}void CoutMMTable(Table * FTL){ //打印主存表情况cout<<"主存表情况:\n";cout<<"分区号\t\t"<<"分区始址\t"<<"分区大小\t"<<"状态\n";FTL=FTL->next;while(1){cout<<FTL->TabId<<"\t\t"<<FTL->StartAdd<<"\t\t";cout<<FTL->Size<<"\t\t";cout<<FTL->Status<<endl;FTL=FTL->next;if(FTL->next==NULL)break;}}void CoutFreeTable(Table * FTL){ //打印空闲区表cout<<"空闲区表情况:\n";cout<<"分区号\t\t"<<"分区始址\t"<<"分区大小\t"<<"状态\n";FTL=FTL->next;while(1){cout<<FTL->TabId<<"\t\t"<<FTL->StartAdd<<"\t\t";cout<<FTL->Size<<"\t\t";printf("%s\n",FTL->Status);FTL=FTL->next;if(FTL->next==NULL)break;}}void CoutUsedTable(Table * UTL){ //打印已分配表cout<<"已分配表情况:\n";cout<<"分区号\t\t"<<"分区始址\t"<<"分区大小\t"<<"状态\n";UTL=UTL->next;while(1){if(UTL->Status=="Used"){cout<<UTL->TabId<<"\t\t"<<UTL->StartAdd<<"\t\t";cout<<UTL->Size<<"\t\t";printf("%s\n",UTL->Status);}UTL=UTL->next;if(UTL->next==NULL)break;}}int DistribMM(Table * MMTableList,PCB Temp,Table * FTL,Table * UTL){//分配一块一定大小的内存Table *P;Table * TempMM; //需要改为已分配节点的上一个节点TempMM=MMTableList;Table * TTT;TTT=MMTableList->next;while(1){ //查找满足大小的分区节点if(TTT->Size>=Temp.Room && TTT->Status=="Free")break;TTT=TTT->next;if(TTT==NULL){cout<<"\n\n\n\t\t\t\t警告!内存不足....\n\n\n";return 0;}}//while//以下是内存改为已分配P=(Table *)malloc(sizeof(Tab));while(1){if(TempMM->next==TTT)break;TempMM=TempMM->next;}P->next=TempMM->next;TempMM->next=P;P->StartAdd=TTT->StartAdd;P->Size=Temp.Room;P->CalledId=Temp.PId;P->TabId=TTT->TabId;P->Status="Used";P=P->next;while(P!=NULL){(P->TabId)++;P=P->next;}FTL=FTL->next;while(1){ //将空闲分区对应的首地址更改if(FTL->StartAdd==TTT->StartAdd)break;FTL=FTL->next;}TTT->StartAdd=FTL->StartAdd=TTT->StartAdd+Temp.Room;//空闲表的首地址=原来+Room TTT->Size=FTL->Size=TTT->Size-Temp.Room;while(FTL!=NULL){(FTL->TabId)++;FTL=FTL->next;}return 2;}void ReturnMM(Table * MMTableList,Table * FTL,Table * UTL,PCB &Temp){ //回收一块内存MMTableList=MMTableList->next;FTL=FTL->next;Table *TT;while(1){if(MMTableList->CalledId==Temp.PId){if(MMTableList->next->Status=="Free"){MMTableList->Status="Free"; //修改内存,相邻的为FreeMMTableList->CalledId=0;MMTableList->Size=MMTableList->Size+MMTableList->next->Size;MMTableList->next=MMTableList->next->next;TT=MMTableList;while(FTL!=NULL){if(FTL->StartAdd==TT->next->StartAdd)break;FTL=FTL->next;}FTL->Size=TT->Size;}if(MMTableList->next->Status!="Free"){MMTableList->Status="Free"; //修改内存,相邻的为USedMMTableList->CalledId=0;while(FTL!=NULL){if(FTL->StartAdd==TT->next->StartAdd)break;FTL=FTL->next;}FTL->Size=TT->Size;}}if(MMTableList->next==NULL)break;MMTableList=MMTableList->next;}//总whilecout<<"\n";}int FF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q){ //首次适应算法PCB Temp;int i; //记录分配函数的返回值0int num=0; //记录进程首次分配内存while(1){Temp=OutQueue(Q);if(num<procsize){if(num==0){cout<<"正在为"<<Temp.PId<<" 号进程分配内存......\n";i=DistribMM(MMTableList,Temp,FTL,UTL); //分配内存函数if(i==0) return 0; //内存不足CoutMMTable(MMTableList); //打印主存情况CoutFreeTable(FTL); //打印空闲分区表CoutUsedTable(MMTableList); //打印已分配表}if(num==1){cout<<"正在为"<<Temp.PId<<" 号进程分配内存......\n";i=DistribMM(MMTableList,Temp,FTL,UTL); //分配内存函数if(i==0) return 0;CoutMMTable(MMTableList); //打印主存情况CoutFreeTable(FTL); //打印空闲分区表CoutUsedTable(MMTableList); //打印已分配表}if(num==2){cout<<"正在为"<<Temp.PId<<" 号进程分配内存......\n";i=DistribMM(MMTableList,Temp,FTL,UTL); //分配内存函数if(i==0) return 0; // printf("y余朝水\n");CoutMMTable(MMTableList); //打印主存情况CoutFreeTable(FTL); //打印空闲分区表CoutUsedTable(MMTableList); //打印已分配表}if(num==3){cout<<"正在为"<<Temp.PId<<" 号进程分配内存......\n";i=DistribMM(MMTableList,Temp,FTL,UTL); //分配内存函数if(i==0) return 0;CoutMMTable(MMTableList); //打印主存情况CoutFreeTable(FTL); //打印空闲分区表CoutUsedTable(MMTableList); //打印已分配表}if(num==4){cout<<"正在为"<<Temp.PId<<" 号进程分配内存......\n";i=DistribMM(MMTableList,Temp,FTL,UTL); //分配内存函数if(i==0) return 0;CoutMMTable(MMTableList); //打印主存情况CoutFreeTable(FTL); //打印空闲分区表CoutUsedTable(MMTableList); //打印已分配表}}cout<<"正在执行"<<Temp.PId<<" 号进程.....\n"; //队首调度完毕并出队Temp.Prio--; //进程优先数减1Temp.NeedRunTime--; //进程还需运行时间减1cout<<"\t\t\t目前进程"<<Temp.PId<<"的优先数: "<<Temp.Prio;cout<<" 还需运行时间: "<<Temp.NeedRunTime<<endl;num++;if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队cout<<"\n进程"<<Temp.PId<<" 运行完成!\n";cout<<"正在回收内存......\n";if(Temp.PId==5)return 1;ReturnMM(MMTableList,FTL,UTL,Temp); //回收内存CoutMMTable(MMTableList); //打印主存情况CoutFreeTable(FTL); //打印空闲分区表CoutUsedTable(MMTableList); //打印已分配表printinfo(Q);if(Q.front->next==NULL) //判断就绪队列是否为空break;}elseEnQueue(Q,Temp); //运行时间不为0,还需入队等待下一个时间片再次执行}return 2;}int BF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q2){ //最佳适应算法PCB P[procsize]; //定义五个进程CinInfo(P); //输入进程信息Sort(P); //根据优先数的大小进行排序,形成进程数组PQ2=InitQueue(); //就绪队列初始化for(int k=0; k<procsize; k++)EnQueue(Q2,P[k]);int i; //记录分配函数的返回值0int num=0;PCB Temp;while(1){Temp=OutQueue1(Q2);if(num<procsize){if(num==0){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==1){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==2){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==3){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==4){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}}cout<<"正在执行"<<Temp.PId<<" 号进程.....\n"; //队首调度完毕并出队Temp.Prio--; //进程优先数减1Temp.NeedRunTime--; //进程还需运行时间减1cout<<"\t\t\t目前进程"<<Temp.PId<<"的优先数: "<<Temp.Prio;cout<<" 还需运行时间: "<<Temp.NeedRunTime<<endl;num++;if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队cout<<"\n进程"<<Temp.PId<<" 运行完成!\n";cout<<"正在回收内存......\n";cout<<"...........................\n\n";if(Q2.front->next==NULL) //判断就绪队列是否为空break;}elseEnQueue1(Q2,Temp); //运行时间不为0,还需入队等待下一个时间片再次执行}return 1;}int WF(Table * MMTableList,Table * FTL,Table * UTL,AleadyQueue &Q2){ //最坏适应算法PCB P[procsize]; //定义五个进程CinInfo(P); //输入进程信息Sort(P); //根据优先数的大小进行排序,形成进程数组P Q2=InitQueue(); //就绪队列初始化for(int k=0; k<procsize; k++)EnQueue(Q2,P[k]);int i; //记录分配函数的返回值0int num=0;PCB Temp;while(1){Temp=OutQueue1(Q2);if(num<procsize){if(num==0){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==1){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==2){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==3){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}if(num==4){cout<<"正在为"<<Temp.PId<<"进程分配内存......\n";cout<<"...........................\n\n";}}cout<<"正在执行"<<Temp.PId<<" 号进程.....\n"; //队首调度完毕并出队Temp.Prio--; //进程优先数减1Temp.NeedRunTime--; //进程还需运行时间减1cout<<"\t\t\t目前进程"<<Temp.PId<<"的优先数: "<<Temp.Prio;cout<<" 还需运行时间: "<<Temp.NeedRunTime<<endl;num++;if(Temp.NeedRunTime==0) { //判断是否进程运行完毕,如果运行时间为0,则不再入队cout<<"\n进程"<<Temp.PId<<" 运行完成!\n";cout<<"正在回收内存......\n";cout<<"...........................\n\n";if(Q2.front->next==NULL) //判断就绪队列是否为空break;}elseEnQueue1(Q2,Temp); //运行时间不为0,还需入队等待下一个时间片再次执行}return 2;}void main(){AleadyQueue Q1; //定义一个就绪队列AleadyQueue Q2;AleadyQueue Q3;PCB P[procsize]; //定义五个进程CinInfo(P); //输入进程信息Sort(P); //根据优先数的大小进行排序,形成进程数组P Q1=InitQueue(); //就绪队列初始化Q2=InitQueue();Q3=InitQueue();for(int k=0; k<procsize; k++)EnQueue(Q1,P[k]); //首次排好序的就绪进程入队,//进程依次等待处理机调度for(k=0; k<procsize; k++)EnQueue(Q2,P[k]);for(k=0; k<procsize; k++)EnQueue(Q3,P[k]);printinfo(Q1); //打印当前就绪队列的情况Q3=Q2=Q1;Table * MMTableList; //主存分区表Table * MM;Table * FreeTableList; //空闲分区表Table * UsedTableList; //已分配分区表MMTableList=CreateMMTable(); //创建主存分区表MM=CreateMMTable();FreeTableList=CreateMMTable(); //创建空闲分区表(初始化时和内存分区表相同)UsedTableList=CreateUsedTable(); //创建已分配表CoutMMTable(MMTableList); //打印主存分区表int i; //记录0,内存不足int j; //记录所选算法while(1){j=chose(); //判断所选算法,所需操作(FF、BF、WF)if(j==1)i=FF(MM,FreeTableList,UsedTableList,Q1);//首次适应算法if(i==0)exit(0); //内存不足if(j==2)i=BF(MM,FreeTableList,UsedTableList,Q2);//最佳适应算法if(i==0)exit(0); //内存不足if(j==3)i=WF(MM,FreeTableList,UsedTableList,Q3);//最坏适应算法if(i==0)exit(0); //内存不足if(j==4)break; //结束内存分配}cout<<"\n\n\n-----------------------------------欢迎使用!------------------------------------\n\n\n\n\n"; }。
动态分区分配算法动态分区分配算法是计算机在处理大型计算问题时分配内存的一种算法。
它由英国计算机科学家考克·拉伦斯(C. Alan Rees)和美国计算机科学家杰弗里·布朗(Geoffrey Brown)于1959年提出,发展到今天,仍然是当前计算机内存管理中应用最为广泛的算法之一。
据统计,它在数据处理和科学计算中应用最为广泛,比例达到90%以上。
动态分区分配算法建立在虚拟存储器系统于单一空间中的理论上,它会将虚拟存储器空间分割成多个区块,即所谓的“分区”,在这些“分区”中每一个“分区”被认为是一个独立的内存块,它可以被视作内存的一个物理分割实体。
确定分区个数以及每个分区的大小,称为分区的方法的决定步骤。
分区的决定步骤有固定分区、可变分区和动态分区等。
固定分区分配法要求在系统安装前确定程序分区的规模,在整个运行期间该规模是不变的,因此片面此法解决不了内存非连续性的问题。
可变分区分配法将内存空间分割成几个大小不等的可变尺寸的分区,这种算法的原理还是以空间的划分为两个分区,它有效解决了内存空间划分的非连续性问题,但受到固定分区的分配量的限制,因此它的可扩大性也有所限制。
动态分区分配算法可以根据运行时不断地选择最终分区的大小,以获得最优的内存分配方案,它扩展了计算机系统中内存空间的使用,同时能够满足多台机器大型程序精确分配内存大小的要求,它可以更好地充分利用计算机系统中的内存。
动态分区分配算法是一种比较强大的算法,它能够根据实际情况提供充分利用空间的储存形式,处理实时物理系统的大型问题,并在很大的程度上提高了工作效率,节约价值,以及满足多台机器大型软件应用程序的需要。
动态分区分配课程设计一、课程目标知识目标:1. 让学生理解动态分区分配的概念和原理;2. 掌握动态分区分配算法,如首次适应算法、最佳适应算法等;3. 了解内存碎片产生的原因及解决方法。
技能目标:1. 培养学生运用动态分区分配算法解决实际问题的能力;2. 提高学生分析、设计、优化内存分配方案的能力;3. 培养学生运用编程语言实现动态分区分配算法的能力。
情感态度价值观目标:1. 培养学生对计算机操作系统内存管理知识的兴趣和热情;2. 培养学生具备良好的团队合作精神和沟通能力;3. 培养学生具备解决问题的信心,敢于面对挑战。
分析课程性质、学生特点和教学要求:本课程为计算机操作系统内存管理部分,具有理论性和实践性。
学生为高中年级,具备一定的计算机基础和逻辑思维能力。
教学要求注重理论与实践相结合,培养学生的动手能力和实际应用能力。
课程目标分解:1. 通过讲解和案例分析,使学生理解动态分区分配的基本概念和原理;2. 通过课堂演示和实验操作,使学生掌握动态分区分配算法;3. 通过分组讨论和课后作业,培养学生分析、设计、优化内存分配方案的能力;4. 通过编程实践,提高学生运用编程语言实现动态分区分配算法的能力;5. 通过课堂互动和课后反馈,激发学生对计算机操作系统内存管理知识的兴趣,培养良好的团队合作精神和沟通能力。
二、教学内容1. 动态分区分配概念及原理- 内存分配方式概述- 动态分区分配的特点- 动态分区分配的内存管理策略2. 动态分区分配算法- 首次适应算法- 最佳适应算法- 最坏适应算法- 邻近适应算法3. 内存碎片问题及解决方法- 内存碎片的定义- 内存碎片产生的原因- 解决内存碎片的方法4. 动态分区分配编程实践- 编程语言选择(如C语言)- 动态分区分配算法的编程实现- 内存分配与回收功能的实现5. 内存分配案例分析- 案例一:基于首次适应算法的内存分配- 案例二:基于最佳适应算法的内存分配- 案例分析及讨论教学大纲安排:第一课时:动态分区分配概念及原理第二课时:动态分区分配算法第三课时:内存碎片问题及解决方法第四课时:动态分区分配编程实践(上)第五课时:动态分区分配编程实践(下)第六课时:内存分配案例分析及总结教学内容与教材关联性:本章节教学内容紧密结合教材中关于计算机操作系统内存管理部分的内容,确保学生能够掌握动态分区分配的相关知识,提高实践操作能力。
1、实验目的通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法和快速适应算法的实现方法。
2、试验内容问题描述:设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。
假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,P n,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,S m,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。
3、程序要求:1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。
2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。
3)输入:空闲分区个数n,空闲分区大小P1, … ,P n,进程个数m,进程需要的分区大小S1, … ,S m,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法,5-快速适应算法。
4、需求分析(1) 输入的形式和输入值的范围算法选择空闲分区个数空闲分区大小(KB)作业个数作业名称作业大小(KB)(2) 输出的形式最终内存空闲分区的分配情况5、调试分析通过这次课程设计我练习了用JAVA写系统软件,对OS中可变分区存储管理有了更深刻的了解。
在写程序的时候也遇到了一些困难。
比如在设计数据结构时特别犹豫,总想找一个很合适的。
但是,后来才知道,关键要多尝试,而空想是没有用的。
最后我证实了自己的设计的合理性。
还有为了使程序更健壮,我尝试着将程序中的输入部分全部改为字符(串)。
很遗憾的是因为时间问题,没有把这个模拟程序写成动画形式,还可以加几句代码后实现动态的增加作业。
通过本次实验,深入理解了动态分区分配算法的思想,培养了自己的动手能力,通过实践加深了记忆。
6、测试结果(1)首次适应算法(2)循环首次适应算法(3)最佳适应算法(4)最坏适应算法:(5)快速适应算法:7、附录(java)package experiment;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; 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 int[MaxNum];//作业名称private static char ProcessName[] = new char[MaxNum];//作业需求空间大小private static int ProcessNeed[] = new int[MaxNum];//作业分配标志private static boolean state[] = new boolean[MaxNum];//空闲分区个数private static int PartitionNum;//作业个数private static int ProcessNum;//private static char order[][] = new char[MaxNum][MaxNum];//private static char ch[] = new char[MaxNum];//临时变量private static int temp;//算法选择//1-首次适应算法//2-循环首次适应算法//3-最佳适应算法//4-最坏适应算法//5-快速适应算法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 static void main(String[] args) throws FileNotFoundException { //输入数据input();//选择算法//1-首次适应算法//2-循环首次适应算法//4-最坏适应算法//5-快速适应算法switch(option){case 1:System.out.println("对作业用首次适应算法进行空间分配:");First();output();break;case 2:System.out.println("对作业用循环首次适应算法进行空间分配:");CycleFirst();output();break;case 3:System.out.println("对作业用最佳适应算法进行空间分配:");Best();output();break;case 4:System.out.println("对作业用最坏适应算法进行空间分配:");Worst();output();break;case 5:System.out.println("对作业用快速适应算法进行空间分配:");Worst();output();break;default:System.out.println("********error!*****");}}//输入数据public static void input() throws FileNotFoundException{BufferedInputStream in = new BufferedInputStream(new FileInputStream( "./file/04"));System.setIn(in);stdin = new Scanner(System.in);//算法选择//1-首次适应算法//2-循环首次适应算法//3-最佳适应算法//4-最坏适应算法//5-快速适应算法option = stdin.nextInt();//请输入空闲分区个数n = stdin.nextInt();//请依次输入空闲分区大小(KB)for(i=0 ; i<n ; i++){FreePartition[i] = stdin.nextInt();}//请输入作业个数m = stdin.nextInt();//请依次输入作业名称for(i=0 ; i<m ; i++){ProcessName[i] = stdin.next().charAt(0);ch[i] = ProcessName[i];}//请依次输入作业大小(KB)for(i=0;i<m;i++){ProcessNeed[i] = stdin.nextInt();state[i]=false;}for(i=0;i<n;i++){System.out.print("|"+FreePartition[i]);}System.out.print("|\n");System.out.println("作业信息如下:");for(i=0;i<m;i++){System.out.print(ProcessName[i]+"\t");}System.out.print("\n");for(i=0;i<m;i++){System.out.print(ProcessNeed[i]+"\t");}System.out.println("\n");}//1——首次适应算法public static void First(){for(i=0;i<m;i++){for(j=0;j<n;j++){//找到第一个合适的空闲分区if((ProcessNeed[i] <= FreePartition[j]) && (!state[i])){for(k=0;k<3;k++) //记录作业分配{if(order[j][k] == 0) //为空{order[j][k]=ProcessName[i];break;}elsecontinue;}FreePartition[j]=FreePartition[j]-ProcessNeed[i];state[i]=true;}}}}//2——循环首次适应算法public static void CycleFirst(){i=0;j=0;while((i<n) && (j<m)){if((ProcessNeed[i] <= FreePartition[j]) && (!state[i])){for(k=0;k<3;k++) //记录作业分配{if(order[j][k]==0){order[j][k]=ProcessName[i];break;}elsecontinue;}FreePartition[j]=FreePartition[j]-ProcessNeed[i];state[i]=true;i++;}elsej++;}}//3——最佳适应算法public static void Best(){for(i=0;i<m;i++){temp=FreePartition[0];k=0;//找到第一个合适的空闲分区while(ProcessNeed[i] > temp){k++;temp=FreePartition[k];}for(j=0;j<n;j++){//按最佳适应算法找到符合的空闲区if((ProcessNeed[i] <= FreePartition[j]) && (temp > FreePartition[j]) && (!state[i])){temp=FreePartition[j];k=j;}elsecontinue;}for(d=0;d<3;d++) //记录作业分配{if(order[k][d]==0){order[k][d]=ProcessName[i];break;}elsecontinue;}FreePartition[k]=FreePartition[k]-ProcessNeed[i];state[i]=true;}}//4——最坏适应算法public static void CycleFirst(){i=0;j=0;while((i<n) && (j<m)){if((ProcessNeed[i] <= FreePartition[j]) && (!state[i])){for(k=0;k<3;k++) //记录作业分配{if(order[j][k]==0){order[j][k]=ProcessName[i];break;}elsecontinue;}FreePartition[j]=FreePartition[j]-ProcessNeed[i];state[i]=true;i++;}elsej++;}}public static void CycleFirst(){i=0;j=0;while((i<n) && (j<m)){if((ProcessNeed[i] <= FreePartition[j]) && (!state[i])){for(k=0;k<3;k++) //记录作业分配{if(order[j][k]==0){order[j][k]=ProcessName[i];break;}elsecontinue;}FreePartition[j]=FreePartition[j]-ProcessNeed[i];state[i]=true;i++;}elsej++;}}//5——快速适应算法public static void Worst(){for(i=0;i<m;i++){temp=FreePartition[0];k=0;for(j=0;j<n;j++){//按最坏适应算法找到合适的空闲分区if((ProcessNeed[i] <= FreePartition[j]) && (temp < FreePartition[j]) && (!state[i])){temp=FreePartition[j];k=j;}elsecontinue;}for(d=0;d<3;d++) //记录作业分配{if(order[k][d]==0){order[k][d]=ProcessName[i];break;}elsecontinue;}FreePartition[k]=FreePartition[k]-ProcessNeed[i];state[i]=true;}}//结果输出public static void output(){for(i=0;i<n;i++){System.out.print("|");for(j=0;j<3;j++){if(order[i][j]==0)System.out.print(" ");elseSystem.out.print(order[i][j]);}}System.out.print("|\n");}}。