内存的动态分区分配方式的模拟小白冲

了解动态分区分配方式中的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解

二、实验内容

作业1申请130KB

作业2申请60KB

作业3申请100KB

作业2释放60KB

作业4申请200KB

作业3释放100KB

作业1释放130KB

作业5申请140KB

作业6申请60KB

作业7申请50KB

作业8申请60KB

请分别采用首次适应算法和最佳适应算法进行内存的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。

三、实现思路

首次适应算法中空闲区的排列顺序是按地址大小排列,小地址在前,大地址在后;而最佳适应算法中空闲区的队列排列是空闲区块的大小,小的在前,大的在后。

用了一个结构体来存储空闲区的信息,然后再用双链表来实现空闲区队列

四、主要的数据结构(展开批注可显示代码)

1、内存分区链表定义[c1]

[c1]#includeusingnamespacestd;constintMax_length=640;//最大内存inta,b;//a记录算法编号,b记录操作编号structfreearea//空闲区的结构体{intID;//分区号intsize;//分区大小intaddress;//分区地址boolflag;//使用状态,0为未占用,1为已占用};typedefstructDuNode//双向链表结点{freeareadata;//数据域DuNode*prior;//指针域DuNode*next;}*DuLinkList;DuLinkListm_rid=newDuNode,m_last=newDuNode;//双向链表首尾指针voidinit()//空闲区队列初始化{m_rid->prior=NULL;m_rid->next=m_last;m_last->prior=m_rid;m_last->next=NULL;m_rid->data.size=0;m_last->data.address=0;m_last->data.size=Max_length;m_last->data.ID=0;m_last->data.flag=0;//!!!}2、分区状态定义[c1]

[c1]voidshow(){DuNode*p=m_rid->next;//指向空闲区队列的首地址cout<<"+++++++++++++++++++++++++++++++++++++++"<data.ID==0)cout<<"FREE"<data.ID<data.address<data.size<data.flag)cout<<"已被占用"<next;}}

3、首次适应算法函数定义[c1]

[c1]boolfirst_fit(intid,intm_size)//首次适应算法{DuNode*p=m_rid->next;//指向空闲区队列的首地址DuLinkListfa=newDuNode;//新建一个空闲区并赋值//memset(fa,0,sizeof(DuNode));fa->data.ID=id;fa->data.size=m_size;fa->data.flag=1;//表示被占用while(p)//在空闲区列表中从低地址向高地址查找{if(p->data.size>=m_size&&!p->data.flag)//找到大于等于所需的内存的空闲区{if(p->data.size==m_size)//刚好空闲区大小与所需大小相等{p->data.ID=id;p->data.flag=1;free(fa);//清空新创建的空闲区returntrue;}elseif(p->data.size>m_size)//空闲区比所需内存大,则需要将多的内存作回收处理{fa->data.address=p->data.address;//将空闲区的前半部分分出去p->data.address+=m_size;p->data.size-=m_size;p->prior->next=fa;fa->next=p;fa->prior=p->prior;p->prior=fa;returntrue;}}p=p->next;}free(fa);//查找分配失败returnfalse;}

4、最佳适应算法函数定义[c1]

boolbest_fit(intid,intm_size)//最佳适应算法,其中需要查找最佳的存放位置{DuNode*p=m_rid->next;//指向空闲区队列的首地址DuNode*q=NULL;//存放最佳地址DuLinkListfa=newDuNode;//新建一个空闲区并赋值memset(fa,0,sizeof(DuNode));fa->data.ID=id;fa->data.size=m_size;fa->data.flag=1;//表示被占用intd=Max_length;//所需内存大小与空闲区大小之间的差值while(p)//循环查找最小的差值d并记录此时的地址值{if(p->data.size>=m_size&&!p->data.flag)//找到大于等于所需的内存的空闲区{if(p->data.size-m_sizedata.size-m_size;}}p=p->next;}if(q==NULL)//查找分配失败returnfalse;else{if(d==0)//刚好找到与所需内存大小一样的空闲区{p->data.ID=id;p->data.flag=1;free(fa);//清空新创建的空闲区returntrue;}else//空闲区比所需内存大,则需要将多的内存作回收处理{fa->data.address=q->data.address;//将空闲区的前半部分分出去q->data.address+=m_size;q->data.size-=m_size;q->prior->next=fa;fa->next=q;q->prior=fa;fa->prior=q->prior;returntrue;}}}

5、内存分配函数定义[c1]

[c1]boolallocation()//分配资源{intid,m_size;//输入的作业号和内存块大小cout<<"请输入作业编号(分区号)和申请的内存大小(KB):";cin>>id>>m_size;if(m_size<=0)//申请的内存大小小于等于0,申请失败{cout<<"申请的内存大小错误!请重新输入"<

6、内存回收函数定义[c1]

[c1]voidrecycle()//回收内存{intid;cout<<"请输入想要释放的作业号:";cin>>id;DuNode*p=m_rid->next;//指向空闲区队列的首地址DuNode*p1=NULL;//辅助向量while(p)//查找需要释放的作业的地址并进行合并工作{if(p->data.ID==id){p->data.ID=0;p->data.flag=0;if(!p->prior->data.flag)//与前一个空闲区相邻,则合并{p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->next;}if(!p->next->data.flag)//与后一个空闲区相邻,则合并{p->data.size+=p->next->data.size;p->next->next->prior=p;p->next=p->next->next;}break;}p=p->next;}show();}

7、主函数[c1]

[c1]voidmain(){cout<<"******************动态分区分配模拟******************"<>a;init();//初始化内存块while(a!=1&&a!=2){cout<<"输入错误!请重新输入:"<>a;}while(1){cout<<"****************************************************"<>b;switch(b){case1:allocation();break;case2:recycle();break;case3:default:cout<<"动态分区分配算法结束,再会!"<

五、算法流程图

首次适应算法:

最佳适应算法:

六、运行与测试

七、总结

思考:讨论各种分配算法的特点。

一、首次适应算法(FirstFit):

该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。

特点:该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。

缺点:低地址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。

二、最佳适应算法(BestFit):

该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。

THE END
1.专业学习如何绘制算法流程图?算法流程图怎么做人们为了方便地使用流程图交流算法,而不至于因图形符号的问题引起对算法过程理解的混淆。人们规定了一组预定义的图形符号来表示算法的过程,并给出每个图形符号的说明。标准的流程图符号包括开始/结束符号、输入/输出符号、流程符号、子流程符号、判断符号、流程线6种图形符号,用这6种图形符号可以绘制任何类型的流程图。https://blog.csdn.net/weixin_63253486/article/details/144084968
2.2024年迷宫求解的非递归算法C语言(图片来源网络,侵删) 任务:可以输入一个任意大小的迷宫数据,用非递归的 *** 求出一条走出迷宫的路径,并将路径输出; 在资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进 *** ; https://win7sp.com/post/34016.html
3.数据结构与算法回溯算法:LeetCode“排列问题”求解,解释并模拟递在上一篇文章当中我们已经介绍了“回溯算法”的定义及其中“分割问题”的解决方法,详情可见《【数据结构与算法】回溯算法:用“更复杂”的代码求解“分割问题”,解释并模拟递归+回溯的遍历过程》,本文将基于LeetCode中的两道全排列题目(46. 全排列 - 力扣(LeetCode)和 47. 全排列 II - 力扣(LeetCode))继续介绍https://zhuanlan.zhihu.com/p/10877491857
4.使用Flowgorithm软件,设计算法流程图解决以下问题,然后实际运行该流程使用Flowgorithm软件,设计算法流程图解决以下问题,然后实际运行该流程图程序,验证算法设计是否合理。 问题:输入一个百分制考试成绩整数数据,如果成绩不低于90分,输出等次信息“优秀”;如果成绩介于80分到89分,输出等次信息“良好”;如果成绩介于70分到79分之间,输出等次信息“中等”;如果成绩介于60到69分之间,输出等次信https://www.shangxueba.com/ask/20112850.html
5.作业调度算法实验报告卓智敏运行作业 初始化 图1 作业调度模拟程序系统功能结构图 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。流程图如图2所示。 https://blog.sina.com.cn/s/blog_6fe35d3a0100qnb7.html
6.三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大一. 算法分析 已知结论:a,b的最大公约数 * 其最小公倍数 = a * b; 如下介绍的三个算法只针对于求解最大公约数,最小公倍数就由上面结论可以得出。 求解两个数的最大公约数算法流程图: 求两个数最小公倍数的算法流程图: 1.辗转相除法(两个数) https://cloud.tencent.com/developer/article/2085983
7.程序流程图程序流程图又称程序框图,是用统一规定的标准符号描述程序运行具体步骤的图形表示。程序框图的设计是在处理流程图的基础上,通过对输入输出数据和处理过程的详细分析,将计算机的主要运行步骤和内容标识出来。程序框图是进行程序设计的最基本依据,因此它的质量直接关系到程序设计的质量。 https://www.meipian.cn/38kq7re4
8.廉政风险防控整改报告6篇(全文)三、卫生院职权目录不完整、部分职权运行流程图不完善。整改措施: 1、对于卫生院职权目录不完整的情况,根据县局检查组在检查中提出的要从部门的职能出发寻找职权的思路,补充了7项的职权目录。 2、对于药品采购流程图存在重大的流程错误,进行重新了解并制定出符合实际情况的药品采购流程图。 https://www.99xueshu.com/w/file8p2hbyp0.html
9.pythonKNN算法实现鸢尾花数据集分类python三、算法实现 1.算法流程图: 从以上流程图可以看出,knn算法包含后四步操作,所以将整个程序分为三个模块。 2.具体实现 (1)方法一 ①利用slearn库中的load_iris()导入iris数据集 ②使用train_test_split()对数据集进行划分 ③KNeighborsClassifier()设置邻居数 https://www.jb51.net/article/172682.htm
10.慢聊Golang协程池Ants实现原理? goWorker:运行任务的实际执行者,它启动一个 goroutine 来接受任务并执行函数调用 ? sync.Pool:golang 标准库下并发安全的对象池,缓存申请用于之后的重用,以减轻GC的压力 ? spinLock:基于CAS机制和指数退避算法实现的一种自旋锁 运行流程图 Ants运行流程图如下: https://www.51cto.com/article/777732.html
11.华北电力大学:风光氢图5 数据处理流程图 图6 发电单元功率调度逻辑图 在燃气轮机联合循环调节范围外,电解槽起到扩展系统调峰能力下限的作用,当系统负荷发生波动时,首先调整燃气轮机联合循环输出功率,当出现负荷不断下探的情况时,燃气轮机联合循环保持最低负荷率运行,此时盈余电力制氢,氢气暂时存储在储氢罐内,最终由燃机掺烧消耗。 https://www.shifair.com/wap/article_details/index/id/223748.html
12.科学网—powsimR:RNASeq以及scRNASeq功效分析工具这里的真阳性率又叫功效。 5)最后,根据尝试的多个样本数的取值,预测出在FDR不超过一定值的前提下能够识别出一定比例的DEG,所需的最低样本数量。 讨论:由于聚类分析的性能通常与差异表达分析的性能成正比,所以功效分析也可以用来改良聚类分析的实验设计。 算法流程图:https://blog.sciencenet.cn/blog-3447504-1249419.html
13.基于AirSim的无人机运行嘲仿真方法与流程对于无人机的算法验证,例如航迹规划算法,通过低空域环境进行建模,结合相应的算法程序,在仿真场景中完成无人机的算法仿真,逼真的模拟该无人机算法在低空域中的实现效果。利用本方法可以代替去室外环境测试无人机算法运行效果,将算法测试好以后再移植到实际无人机,减少调试带来的麻烦。附图说明图1为本发明的流程图;图https://www.xjishu.com/zhuanli/55/202010936620.html
14.贪心算法的实验的总结(共10篇).docx附:实验报告的主要内容 一.实验目的 二.问题描述 三.算法设计 包含:数据结构与核心算法的设计描述、函数调用及主函数设计、主要算法流程图等 四.程序调试及运行结果分析 五.实验总结 附录:程序清单 福建工程学院计算机与信息科学系 实验报告 1 2 3 4 5 《算法设计与分析》 姓名: 班级: 学号: 课题:贪心算法 https://max.book118.com/html/2019/0518/8124003012002024.shtm
15.模拟图灵机实现数字加一一.实验目的掌握图灵机的概念和基本结构,理解图灵机的基本指令和编码方式;掌握图灵机的编程方法。二.实验内容对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。三.流程图源代码四.测试图片 https://www.pianshen.com/article/5987310571/