《动态内存分配(C语言).pdf》由会员分享,可在线阅读,更多相关《动态内存分配(C语言).pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 实验报告 实验课程名称:动态内存分配算法 专 业:计算机科学与技术 班 级:姓 名:学 号:实验学时:指导教师:成 绩:年 12 月 1 日 实验报告 专业 计算机科学与技术 班级 姓名 学号 实验课程 操作系统 指导教师 实验日期 同实验者 实验项目 动态内存分配算法 实验设备及器材 PC 机一台,VC+6.0 一、实验内容与要求 二、需求分析、首次适应算法 实验报告 循环首次适应算法 在为进程分配内存空间时,不是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。优点:该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的
2、开销。最佳适应算法 该算法总是把能满足要求、又是最小的空闲分区分配给作业,避免大材小用,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。缺点:每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。最坏适应算法 最坏适应算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区或链表时,总会挑选一个最大的空闲区,从中切割一部分存储空间给作业使用。该算法要求,将所有的空闲分区,按其容量以大到小的顺序形成一空闲分区链。查找时,只要看第一个分区能否满足作业要求即可。优点:可使剩下的空闲区不至于太小,产生碎片的可能性最小,对中小作业有利,同时,最
3、坏适应算法查找效率很高。缺点:导致存储器中缺乏大的空闲分区 三、数据结构 为了实现动态分区分配算法,系统中配置了相应的数据结构,用以描述空闲分区和已分配分区的情况,常用的数据结构有空闲分区表和空闲分区链 流程图 实验报告 当一个新作业要求装入主存时,必须查空闲分区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这时应把它分成两部分,一部分为占用区,另一部分为空闲区。当一个作业撤离时,归还的区域如果与其他空闲区相邻,则合并成一个较大的空闲区,登录在空闲区表中。四、功能实现 实验报告 五、心得体会 通过本次实验,对动态内存分配的相关知识有了更深的认识,中途也遇到了许多困难,但幸运的是
4、最终的顺利的解决并完成了此次试验,也更加熟练地掌握了关于内存分配的使用。实验报告 六、源代码#include using namespace std;int FreePartition100;/空闲分区块数组 int FirstPartition100;/首次适应算法数组 int CycleFirstPartition100;/循环首次适应算法数组 int BestPartition100;/最佳适应算法数组 int WorstPartition100;/最坏适应算法数组 int ProcessNeed100;/每个作业的大小 int PartitionNum,ProcessNum;/分区块数
5、,作业数/首次适应算法 void First()int i,j;char str;for(i=0;iPartitionNum;i+)FirstPartitioni=FreePartitioni;for(i=0;iProcessNum;i+)/找出第一块满足作业的分区 for(j=0;jFirstPartitionj)continue;else FirstPartitionj-=ProcessNeedi;/找到后把分区大小减去作业的大小 str=A+i;cout作业str在第j+1块分区中endl;break;coutendl;cout分配之后剩余情况:endl;for(i=0;iPartiti
6、onNum;i+)coutFirstPartitioni;coutendlendl;/循环首次适应算法 void CycleFirst()int i,j=1;char str;实验报告 for(i=0;iPartitionNum;i+)CycleFirstPartitioni=FreePartitioni;for(i=0;iProcessNum;i+)/for(j=0;jPartitionNum;j+)j=j-1;while(jCycleFirstPartitionj)/continue;j+;else CycleFirstPartitionj-=ProcessNeedi;str=A+i;co
7、ut作业str在第j+1块分区中endl;break;/j+;/coutj;if(j=PartitionNum&i!=ProcessNum)i=-1;coutendl;cout分配之后剩余情况:endl;for(i=0;iPartitionNum;i+)coutCycleFirstPartitioni;coutendlendl;/最佳适应算法 void Best()int i,j,k;char str;for(i=0;iPartitionNum;i+)BestPartitioni=FreePartitioni;for(i=0;iProcessNum;i+)实验报告 k=0;for(j=0;jP
8、artitionNum;j+)/coutBestPartitionj ProcessNeedi=ProcessNeedi)k=j;break;for(int n=0;nPartitionNum;n+)if(BestPartitionn=ProcessNeedi)/找最佳的 k=n;BestPartitionk-=ProcessNeedi;str=A+i;cout作业str在第j+1块分区中endl;coutendl;cout分配之后剩余情况:endl;for(i=0;iPartitionNum;i+)coutBestPartitioni;coutendlendl;/最坏适应算法 void Wo
9、rst()int i,j,k;char str;for(i=0;iPartitionNum;i+)WorstPartitioni=FreePartitioni;for(i=0;iProcessNum;i+)k=0;for(j=0;jWorstPartitionk)/找到最大的分区 k=j;WorstPartitionk-=ProcessNeedi;实验报告 str=A+i;cout作业str在第j+1块分区中endl;coutendl;cout分配之后剩余情况:endl;for(i=0;iPartitionNum;i+)coutWorstPartitioni;coutendlendl;void main()int i;cout输入分区块数:PartitionNum;cout输入每个分区的大小:endl;for(i=0;iFreePartitioni;cout输入作业数:ProcessNum;cout输入每个作业的大小:endl;for(i=0;iProcessNeedi;cout-首次适应算法-endl;First();cout-循环首次适应算法-endl;CycleFirst();cout-最佳适应算法-endl;Best();cout-最坏适应算法-endl;Worst();