版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、河南农业大学操作系统实验报告实验题目 : 可变分区内存分配与回收 学 院 : 理学院 班 级 : 10信安三班 学 号 : 1008105072 姓 名 : 高凯强 一、课程设计目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。二、课程设计内容用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc(和回收过程free(。其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。假设初始状态下,可用的内存空间为640KB,
2、其中操作系统占用64KB,并有下列的请求序列: 作业1申请130KB 作业2申请60KB 作业3申请100KB 作业2释放60KB 作业4申请200KB 作业3释放100KB 作业1释放130KB 作业5申请140KB 作业6申请60KB 作业7申请50KB 作业6释放60KB请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。三、设计思路:整体思路:可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小 查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存
3、空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。设计所才用的算法:采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。 但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值minsize,如果空闲区的大小减去作业需求长度得到的值小于等于minsize,不再将空闲区分成己分分区和空闲区两部分,而是将
4、整个空闲区都分配给作业。内存分配与回收所使用的结构体:为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。关于分配留下的内存小碎片问题:当要装入一个作业时,从“空闲分区表”中查找标志为“1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于minsize,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,
5、在已分配区表中找到一个标志为“0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于minsize。则把空闲区分成两部分,一部分用来装入作业,另外一部分仍为空闲区。这时只要修改原空闲区的长度,且把新装人的作业登记到已分配区表中。内存的回收:在可变分区方式下回收内存空间时,先检查是否有与归还区相邻的空闲区(上邻空闲区,下邻空闲区)。若有,则将它们合件成一个空闲区。程序实现时,首先将要释放的作业在“内存分配表”中的记录项的标志改为“0”(空栏目),然后检查“空闲区表”中标志为1(未分配)的栏目,查找是否有相邻的空闲区,若有,将之合并,并修改空闲区的起始地
6、址和长度。四、程序流程图:作业分配流程图:内存回收流程图:九、程序说明:本程序采用Visual C+编写,模拟可变分区存储管理方式的内存分配与回收。假定系统允许的最大作业数量为n=10,允许的空闲区表最大项数为m=10,判断是否划分空闲区的最小限值为minsize=5。初始化用户可占用内存区的首地址为1000,大小为640Kb。定义两个结构体及其对象free_tablem和used_tablen实现内存的分配回收及分配表和空闲表的登记。用最优分配算法实现动态分配时,调用int distribute(int process_name, float need_length内存分配函数,设定循环条件
7、查找最佳空闲分区,定义int k 以记录最佳空闲区的首地址,根据找到的空闲区大小和作业大小判断是整个分配给作业还是切割空闲区后再分配给作业,并在“内存分配表”和“空闲分区表”中作登记。调用int recycle(int process_name函数实现内存的回收。顺序循环“内存分配表”找到要回收的作业,将标志位设为“0”,定义float recycle_address, recycle_length;用recycle_address记下回收作业的首地址,recycle_length记下回收作业长度。查找空闲表,如果(free_tablei.address+free_tablei.length=
8、recycle_address,说明有上邻接空闲区,这时上邻接区的起始地址不变,长度+ recycle_address; 如果(recycle_address+recycle_length=free_tablei.address,说明有下邻接,这时下邻接空闲区的起始地址改为回收作业的起始地址recycle_address,长度+ recycle_length。如果 同时有上下邻接空闲区,则上邻接的起始地址不变,长度+recycle_address+下邻接的长度,下邻接标志设为“0” 否则,要回收的内存没有邻接空闲区,在空闲区中找到一个标志为“0”的空栏目登记回收的内存。十、源程序:#inclu
9、de #include using namespace std;/全局变量float minsize=5;int count1=0;int count2=0;#define m 10 /假定系统允许的空闲区表最大为m#define n 10 /假定系统允许的最大作业数量为n/分区表项的定义typedef structfloat address; /分区表项起始地址float length; /分区表项长度,单位为字节int flag; /分区表项登记栏标志,"0"表示空栏目,用"1"表示未分配Table;Table used_table100;/已分配表
10、的定义:Table free_table100;/空闲区表的定义:/函数声明void initialize(void;char alloc(char, float;char free(char;void sort(Table;void show(;/初始化两个表void initialize(voidint a;for(a=0; a<=n-1; a+used_tablea.flag=0; /已分配表的表项全部置为空表项free_table0.address=1000;free_table0.length=640;free_table0.flag=1; /空闲区表的表项全部为未分配/最优分
11、配算法实现的动态分区char alloc(char process_name, float need_lengthint i, k=-1; /k用于定位在空闲表中选择的未分配栏float ads, len;int count=0; i=0; while(i<=m-1 /循环找到最佳的空闲分区if(free_tablei.flag=1 && need_length <=free_tablei.lengthcount+;if(count=1|free_tablei.length < free_tablek.lengthk=i;i=i+1; if(k!=-1 if(
12、free_tablek.length-need_length<=minsize /整个分配 free_tablek.flag=0;ads=free_tablek.address;len=free_tablek.length;else /切割空闲区ads=free_tablek.address;len=need_length;free_tablek.address+=need_length;free_tablek.length-=need_length;i=0; /循环寻找内存分配表中标志为空栏目的项while(used_tablei.flag!=0 i=i+1; if(i<=n-1
13、 /找到,在已分配区表中登记一个表项 used_tablei.address=ads;used_tablei.length=len;used_tablei.flag=(int(process_name-0;count1+;else /已分配区表长度不足 if(free_tablek.flag = 0 /将已做的整个分配撤销 free_tablek.flag=1;free_tablek.address=ads;free_tablek.length=len;else /将已做的切割分配撤销 free_tablek.address=ads; free_tablek.length+=len;cout&
14、lt;<"内存分配区已满,分配失败!n" return 0;elsecout <<"无法为该作业找到合适分区!n"return 0;return process_name;char free(char process_name int y=0;float recycle_address, recycle_length;int i, j, k; /j栏是下邻空闲区,k栏是上栏空闲区int x;/在内存分配表中找到要回收的作业while(y<=n-1&&used_tabley.flag!=(int(process_na
15、me-0 y=y+1;if(y<=n-1 /找到作业后,将该栏的标志置为0 recycle_address=used_tabley.address;recycle_length=used_tabley.length;used_tabley.flag=0;count2+;else /未能找到作业,回收失败cout<<"该作业不存在!n"return 0;j=k=-1;i=0;while(!(i>=m|(k!=-1&&j!=-1 /修改空闲分区表if(free_tablei.flag=1if(free_tablei.address+fre
16、e_tablei.length=recycle_addressk=i; /判断是否有上邻接if(recycle_address+recycle_length=free_tablei.addressj=i; /判断是否有下邻接i=i+1; /合并空闲区if(k!=-1 /回收区有上邻接 if(j!=-1 /回收区也有下邻接,和上下领接合并free_tablek.length+=free_tablej.length+recycle_length;free_tablej.flag=0; /将第j栏的标记置为0else /不存在下邻接,和上邻接合并free_tablek.length+=recycle
17、_length;else if(j!=-1 /只有下邻接,和下邻接合并free_tablej.length+=recycle_length;free_tablej.address=recycle_address;else /上下邻接都没有x=0;while(free_tablex.flag!=0x=x+1; /在空闲区表中查找一个状态为0的栏目if(x /找到后,在空闲分区中登记回收的内存free_tablex.address=recycle_address;free_tablex.length=recycle_length;free_tablex.flag=1;else /空闲表已满,执行回
18、收失败used_tabley.flag=(int(process_name;cout<<"空闲区已满,回收失败!n"return 0;return process_name;void sort(Table arrayint i,j,k,t;for(i=0;i k=i;for(j=i+1;j 找到数组中地址最小且不为 0 的那一项的序号赋值于 k if(arrayj.address k=j;t=arrayk.address;arrayk.address=arrayi.address;arrayi.address=t;t=arrayk.length;arrayk.l
19、ength=arrayi.length;arrayi.length=t;t=arrayk.flag;arrayk.flag=arrayi.flag;arrayi.flag=t;/将最小项与第一项元素交换 void show( /程序执行时输出模拟的内存分配回收表cout<<"nt*n"cout<<"t* 空 闲 区 *n"cout<<"t*n"sort(free_table;for(int i=0;i<=count2;i+if(free_tablei.flag!=0cout<<&q
20、uot;t地址:"< 作业长度: "< 状 态: "< elsecontinue;cout<<"nt*n"cout<<"t* 已 分 配 区 *n"cout<<"t*n"sort(used_table;for(int j=0;j if (used_tablej.flag>57cout<<"t地址:"< 作业长度: "< 作业名: "<<(charused_tablej.f
21、lag< else if(used_tablej.flag>48&&(used_tablej.flag<=57cout<<"t地址:"< 作业长度: "< 作业名: "< elsecontinue;void main( /主函数调用各功能函数对所有工作进行测试int choice; /用来选择将要进行的操作char job_name;float need_memory;bool exitFlag=false;cout<<"t 动态分区分配方式的模拟"initi
22、alize(; /开创空闲区和已分配区两个表while(!exitFlagcout<<"nn"cout<<"tn"cout<<"t 请选择操作类型 n"cout<<"t n"cout<<"t 1: 分配内存 2: 回收内存 n"cout<<"t 3: 查看分配 0: 退 出 n"cout<<"tn"cout<<"nt 请输入您的操作:"cin
23、>>choice;switch(choicecase 0:exitFlag=true; /退出操作break;case 1:cout<<"nt 请输入作业名和所需内存:"cin>>job_name>>need_memory;alloc(job_name, need_memory; / 分配内存 break;case 2:char ID;cout<<"nt 请输入您要释放的分区号:"cin>>ID;free(ID; /回收内存break;case 3:show(;break;11、实验
24、结果截图:(1)申请 系统作业x(64KB)、作业1(130KB)、作业2(60KB)、作业3(100KB)(2)释放 作业2(60KB)(3)申请 作业4(200KB)(4)释放 作业3(100KB)、作业1(130KB)(5)申请 作业5(140KB)、作业6(60KB)、作业7(50KB)(6)释放 作业6(60KB)十二、心得体会:每一次的实践,都会有很大的收获。决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。再一个问题是回收时候的合并,对地址的修改不是很有把握。着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。之前大多用的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国农村医疗保障制度的补偿模式研究
- 鞍钢集团有限公司介绍
- 2025 除夕传统文化介绍
- 二零二五年度区块链合伙人退伙共识机制契约3篇
- 2025商业地产蛇年国潮新春庙会市集(敦煌非遗玩趣庙会主题)活动策划方案-80正式版
- 军令状企业誓师大会
- 五金电工知识培训课件
- 可降解塑料餐具、5800吨塑料托盘、托盒项目可行性研究报告写作模板-申批备案
- 二零二五年度房产赠与与文化遗产保护合同3篇
- 江西省上饶市2024-2025学年度第一学期九年级道德与法治学科期末绿色评价试卷(含答案)
- 西交大少年班英语考试试题
- 北京语言大学保卫处管理岗位工作人员招考聘用【共500题附答案解析】模拟试卷
- 人教版七年级下册数学全册完整版课件
- 初中生物人教七年级上册(2023年更新) 生物圈中的绿色植物18 开花和结果
- 水电解质及酸碱平衡的业务学习
- CSCEC8XN-SP-安全总监项目实操手册
- 口腔卫生保健知识讲座班会全文PPT
- 成都市产业园区物业服务等级划分二级标准整理版
- 最新监督学模拟试卷及答案解析
- ASCO7000系列GROUP5控制盘使用手册
- 污水处理厂关键部位施工监理控制要点
评论
0/150
提交评论