} } } } } break; for(j = empty[x].start; j < empty[x].size + empty[x].start; j++){ } flog = 1; if(empty[x].size + empty[x].start == max_size) break; x++; if(j == 0&&j!=0) printf(\●\else printf(\●\printf(\空闲分区列表:\\n\for(a = 0; a < countOfEmpty; a++){ } printf(\非空闲分区列表:\\n\for(a = 0; a } } } not_empty[countOfNotEmpty].id = id; not_empty[countOfNotEmpty].start = empty[temp].start; not_empty[countOfNotEmpty].size = size; empty[temp].start += size; empty[temp].size -= not_empty[countOfNotEmpty].size; if(empty[temp].size == 0) empty[temp].yesornot = 0; countOfNotEmpty++; break; if(temp-1 == countOfEmpty) printf(\内存空闲不足,无法分配\\n\else{ } state(); printf(\第%d次搜索空闲区次数为:%d\\n\ void recover(){ int p; printf(\请输入进程ID(0-255)\\n\scanf(\for(i = 0; i < 30; i++) printf(\printf(\ 内存占用情况图 \for(i = 0; i < 30; i++) printf(\printf(\ for(i = 0; i < countOfNotEmpty; i++){ } countOfEmpty++; for(i = 1; i < countOfEmpty; i++){ if(not_empty[p].start == empty[i-1].start + empty[i-1].size){//新生成的空闲区可以和左边的空闲区可以合并 empty[i-1].size += not_empty[p].size; empty[i-1].yesornot = 1; countOfEmpty--; if(empty[i].start == not_empty[p].start + not_empty[p].size){//右边可以合并 empty[i-1].size += empty[i].size; if(not_empty[i].id == id){ not_empty[i].yesornot = 0; p = i; break; } } } } } empty[i].yesornot = 0; break; else if(empty[i-1].start == not_empty[p].start + not_empty[p].size){//右边可以合并 } empty[i-1].start = not_empty[p].start; empty[i-1].size += not_empty[p].size; empty[i-1].yesornot = 1; countOfEmpty--; break; if(i == countOfEmpty - 1){ } empty[countOfEmpty-1].size = not_empty[p].size; empty[countOfEmpty-1].yesornot = 1; empty[countOfEmpty-1].start = not_empty[p].start; break; state(); void first_fit(){ int chose = 0; for(i = 0; i < 80; i++) printf(\printf(\ 首次适应算法\\n\for(i = 0; i < 80; i++) printf(\printf(\printf(\ 分配;\\t\\t\\t2 回收\\n3 内存占用情况图\\t\\t4 退出\\n请输入你的选择(1-4)\\n\scanf(\choose = 0; switch(chose){ } case 1:distribute();num++;break; case 2:recover();break; case 3:state();break; case 4:exit(0);break; } void best_fit(){ int chose; for(i = 0; i < 80; i++) printf(\printf(\ 最佳适应算法\\n\for(i = 0; i < 80; i++) printf(\printf(\printf(\ 分配;\\t\\t\\t2 回收\\n3 内存占用情况图\\t\\t4 退出\\n请输入你的选择(1-4)\\n\scanf(\choose = 1; switch(chose){ } case 1:distribute();num++;break; case 2:recover();break; case 3:state();break; case 4:exit(0);break; } int main(){ empty[0].size = max_size; empty[0].start = 0; empty[0].yesornot = 1; char algorithm[20]; printf(\printf(\选择算法:F/B(首次适应算法/最佳适应算法)\\n\while(1){ scanf(\ if(strcmp(algorithm,\ break; else printf(\输入出错,请重新输入\\n\ } 实验过程中遇到的问题解决办法与实验体会Q4(需手写,10分) 得分: } if(strcmp(algorithm,\ } else{ } system(\return 0; while(1) best_fit(); while(1) first_fit(); 本次做的课题是内存分配算法实现,此次课程设计成功实现了内存分配和内存回收,内存分配中包含了首次适应算法,最佳适应算法。经编码调试,表明该程序模块是有效可行的。 在开始做的时候发现根本不知道该从什么地方下手,接着便开始上网查找,但是网络上的东西很多都是没有用的,于是自己开始去图书馆找资料,看了很多有关分区分配算法方面的知识以后,才对这四个算法有了新的理解,于是在掌握了这些基础知识之上,对课题进行分析,然后便一步步按照要求编写程序。此次选择的是首次适应,和最佳适应,我个人认为这两种适配算法应该是最经常用到的适配算法 内存分配是根据进程的实际需要。在实现分配时,将涉及到分配中所用的数据结构、分配算法和分区的分配和回收操作这样三个问题。常用的数据结构有分区表和分区链。在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(首次适应算法,最佳适应算法),在分区存储管理方式中主要实现内存分配和内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接等相关的内容。 此次的课程设计,学到了很多知识。实验的算法还是比较简单的,但是代码比较繁琐,链表的操作也比较复杂,所以还是费了不少的时间的。通过本次的实验,也对内存的管理算法有了更充分的熟悉和了解。期末考也临近了,要加紧复习了。 在此首先要感谢贺辉老师,为我们提供了实践的机会,我们才有这样一个学习知识的机会。其次,在本次课程设计的过程中,我要感谢同学们,正是由于他们的帮助和支持,我才能比较顺利的完成这次课程设计任务。在此,我表示由衷地感谢! 评阅教师特殊评语: 评阅教师: 日 期: