




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 采用首次适应算法实现主存的分配和回收一、目的在计算机系统中,为了提高内存区的利用率,必须给电脑内存区进行合理的分配。本实验通过对内存区分配方法首次适应算法的使用,来了解内存分配的模式。在熟练掌握计算机分区存储管理方式的原理的基础上,编程模拟实现操作系统的可变分区存储管理的功能,一方面加深对原理的理解,另一方面提高根据已有原理通过编程解决实际问题的能力,为进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。二、实验内容与数据结构:(1) 可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区的个数是可以调整的。当需要装入一个作业时,根据作业需要的贮存量,查
2、看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被分配作业占用,有的分区空闲,例如,某时刻主存空间占用情况如图所示:为了说明哪些分区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,如下图所示。(2) 当有一个新作业要求装入贮存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业的需求量,这时应将空闲区一分为二。一个分给作业,另一个仍作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配地地址部分的空闲区,将较大的空闲区留在高地址端,以利于大作业的装入。
3、为此在空闲区表中,按空闲区首地址从低到高进行登记。(3) 当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时,要考虑相邻空间区合并问题。作业的释放区与空闲区的邻接分以下4种情况考虑:A、 释放区下邻空闲区;B、 释放区上邻空闲区;C、 释放区上下都与空闲区邻接;D、 释放区上邻空闲区不邻接;一、 实验要求1. 内存大小初始化2. 可以对内存区进行动态分配,采用首次适应算法来实现3. 可以对已分配的内存块进行回收,并合并相邻的空闲内存块。二、 实验内容把一个作业装入内存,按照首次适应算法对内存区进行分配,作业结束,回收已分配给该作业的内存块,并合并相邻的空闲内存块。三、 实验结果运行效
4、果:1.初始化内存区大小,并添加作业,选择1添加作业2.当作业大小超过存储块大小时,分配失败。3.选择3,可查看内存分配情况4. 选择2回收内存5. 选择1添加新作业6. 回收C作业,相邻的空闲内存块合并。五、程序流程图:六、实验源代码:/ FirstFit.cpp : 可变分区用首次适应算法来模拟内存回收#include <STDIO.H>#include <STDLIB.H>int MAX_SEGMENT=10;/最大碎片值struct Partition/分区表目int Par_Size;/分区大小int Par_No;/分区序号或者名字int Addr;/分区地
5、址int IsUse;/分区使用情况,0表示空闲,1表示使用Partition *pri;/前向指针Partition *next;/后向指针;Partition * Int()/函数,返回Partition类型指针/初始化空闲分区表Partition *list,*H,*H1;list=(struct Partition *)malloc(sizeof(struct Partition);list->next=NULL;H=list;if(!list)printf("n错误,内存初始化分配失败!程序结束");exit(1);H1=(struct Partition
6、*)malloc(sizeof(struct Partition);printf("请预先输入分区总大小(以KB为单位):");scanf("%d",&H1->Par_Size);H1->Addr=0;H1->Par_No=0;H1->IsUse=0;H1->pri=H;H1->next=NULL;H->next=H1;/list->H1return list;Partition * InitFP()/初始化已分配分区表Partition *FP,*F,*H;int i;FP=(struct Par
7、tition *)malloc(sizeof(struct Partition);FP->next=NULL;H=FP;for(i=0;i<10;i+)/已分配区先暂定分配十个表目F=(struct Partition *)malloc(sizeof(struct Partition);if(!F)printf("n错误,内存分配失败!程序结束");exit(1);F->Par_Size=0;F->Addr=0;F->Par_No=0;F->IsUse=0;F->next=NULL;H->next=F;F->pri=H;
8、H=H->next;return FP;Partition * New_Process( Partition *list, Partition *FP)/为新的进程分配资源Partition *H,*P,*H1;int Size,Name,L;H=list;H1=FP->next;H=H->next;printf("请输入新作业的名称和大小(整数):");scanf("%d %d",&Name,&Size);while(H)if(!H)/表目已查完,无法分配printf("n已无空闲分区,本次无法分配!&quo
9、t;);return list;elseif(H->IsUse=0)/空表目/if(H->Par_Size>=Size)/大小满足,空闲分区大小要分配的大小if(H->Par_Size>=Size)/大小满足,bool temp=false;if(H->Par_Size-Size)<=MAX_SEGMENT)/空闲分区大小-要分配的大小<碎片值,会产生碎片,将整块内存大小分配出去,Size=H->Par_Size;/分配的大小为整块内存temp=true;/会产生碎片/其他情况就分配大小为请求大小,不会产生碎片,L=H->Addr;/
10、保存空闲分地址if(temp)printf("该次内存分配会产生碎片,将整块内存大小%d分配出去!",Size);elseprintf("该次内存分配不会产生碎片");break; H=H->next;/否则,继续往下查找if(H)if(H->Par_Size>Size)/大小满足,空闲分区大小要分配的大小P=(struct Partition *)malloc(sizeof(struct Partition);/分配新的表目,处理一条数据,分配一次内存P->IsUse=1;P->Addr=L;/指向空闲分区地址P->
11、next=H;/修改指针H->pri->next=P;P->pri=H->pri;H->pri=P;P->Par_Size=Size;/分配大小为要请求分配的大小P->Par_No=Name;/名称H->Par_Size-=Size;/修改空闲分区,H所指区块大小减SizeH->Addr+=Size;/H所指区块地址加SizeelseH->IsUse=1;/大小相等的,把当前表项设置空表目while(H1)if(H1->IsUse=0)H1->Par_No=Name;H1->Par_Size=Size;H1->
12、Addr=L;/保存已分配地址H1->IsUse=1;/在已分配表中设置为已分配break;H1=H1->next;elseprintf("所申请资源已大过系统所拥有的,请重新输入!n");return list;Partition *Reclaim( Partition *list, Partition *FP)/结束作业,资源回收,No为作业名,回收内存 Partition * H1,*H2,*H3,*HF;/H1为释放区,H2为后分区,H3为前分区int No;/作业名H1=list;HF=FP;/可有可无?H1=H1->next;HF=FP->
13、;next;printf("请输入您想结束的作业名:");scanf("%D",&No);while(HF)/对已分配表进行操作if(HF->Par_No=No)HF->IsUse=0;/标志为空表目break;/这时保存着HF所指分区的信息HF=HF->next;if(!HF)/如果找不到该作业,则提示出错printf("所输入的作业名称不正确,请重新输入!");elsewhile(H1)/对空闲表进行操作if(H1->Par_No=No)H1->IsUse=0;/标志为空表目printf(&q
14、uot;内存回收成功");break;H1=H1->next;H2=H1->next;/后分区H3=H1->pri;/前分区if(H2&&H2->IsUse=0)/后接分区为空闲if(H2->next=NULL)/判断后接分区是否为尾结点H1->Par_Size+=H2->Par_Size;/把H2合并到H1H1->next=NULL;free(H2);printf("已回收%d大小内存",H1->Par_Size);else/后分区不为空闲,表示已经被使用H1->Par_Size+=H2
15、->Par_Size;H1->next=H2->next;H2->next->pri=H1;free(H2);printf("已回收%d大小内存",H1->Par_Size);if(H3&&H3->IsUse=0)/前分区为空闲分区,则合并去前分区H3->Par_Size+=H1->Par_Size;H3->next=H1->next;if(H1->next!=NULL)/若H1为尾结点H1->next->pri=H3;free(H1);printf("已回收%d大
16、小内存",H1->Par_Size);return list;void Print( Partition *list, Partition *FP)/输出已分配分区和空闲分区 Partition *H1,*H2;H1=list->next;H2=FP;H2=H2->next;printf("*已分配分区表*n");printf("分区序号大小始址 状态n");while(H2)printf("%d%d%d",H2->Par_No,H2->Par_Size,H2->Addr);if(H2-&
17、gt;IsUse=1)printf("已分配n");elseprintf("空表目n");H2=H2->next;printf("*n");printf("*总的空闲分区表*n");printf("分区序号大小始址 状态n");while(H1)printf("%d%d%d",H1->Par_No,H1->Par_Size,H1->Addr);if(H1->IsUse=1)printf("已分配n");elseprintf(&
18、quot;空表目n");H1=H1->next;printf("*n");void Main_Print( Partition *list, Partition *FP)/主入口函数,进行菜单选择int op;while(1)printf("n主菜单n");printf("1.申请新的作业,分配内存n");printf("2.结束作业,回收内存n");printf("3.查看内存表n");printf("4.退出系统n");printf("n请选择:");scanf("%d",&op);switch(op)/根据输入,选择分支方向case 1: New_Process(list,FP);break;case 2: Reclaim(list,FP);break;case 3:Print(list,FP);break;case 4:break
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游景区扩建用地居间
- 新能源汽车充电桩上市公司
- 新能源技术发展及应用练习题
- 三农村电商三农村电商与旅游融合方案
- 农业综合开发项目可行性研究报告
- 医疗器械可行性分析报告模板
- 磐安县生活垃圾焚烧发电项目
- 电影娱乐产业制作与发行指南
- 品牌传播策略实施方案
- 三农创新驱动发展战略作业指导书
- 四川省2024年普通高等学校高职教育单独招生文化考试数学试题
- 3.1公民基本权利(课件 )-2024-2025学年八年级道德与法治下册 (统编版)
- GB/T 44934-2024电力储能用飞轮储能单元技术规范
- 教师专业发展与教学质量的关系-深度研究
- 地震资料解释基础
- 四川省绵阳市2025届高三第二次诊断性考试思想政治试题(含答案)
- 儿童故事绘本愚公移山课件模板
- 人教版七年级下册地理第一次月考试卷
- 体育产业园区规划与运营管理方案设计
- 护理查房百日咳
- 墨菲定律知识介绍墨菲定律启示课件
评论
0/150
提交评论