




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验五 动态分区存储管理一、实验目的深入了解采用动态分区存储管理方式的内存分配回收的实现。通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉动态分区存储管理的内存分配和回收。二、实验内容编写程序完成动态分区存储管理方式的内存分配回收。具体包括:确定内存空间分配表;采用最优适应算法完成内存空间的分配和回收;编写主函数对所做工作进行测试。三、设计思路 整体思路:动态分区管理方式将内存除操作系统占用区域外的空间看成一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小 查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。设计所采用的算法: 采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。 但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值minsize,如果空闲区的大小减去作业需求长度得到的值小于等于minsize,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。 内存分配与回收所使用的结构体: 为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。 关于分配留下的内存小碎片问题:当要装入一个作业时,从“空闲分区表”中查找标志为“1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于minsize,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,在已分配区表中找到一个标志为“0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于minsize。则把空闲区分成两部分,一部分用来装入作业,另外一部分仍为空闲区。这时只要修改原空闲区的长度,且把新装人的作业登记到已分配区表中。内存的回收:在动态分区方式下回收内存空间时,先检查是否有与归还区相邻的空闲区(上邻空闲区,下邻空闲区)。若有,则将它们合件成一个空闲区。程序实现时,首先将要释放的作业在“内存分配表”中的记录项的标志改为“0”(空栏目),然后检查“空闲区表”中标志为1(未分配)的栏目,查找是否有相邻的空闲区,若有,将之合并,并修改空闲区的起始地址和长度。四、数据结构定义(1)已分配表的定义:structfloat address; /已分分区起始地址 float length; /已分分区长度,单位为字节 int flag; /已分配区表登记栏标志,0表示空栏目,实验中只支持一个字符的作业名used_tablen; /已分配区表(2)空闲分区表的定义:structfloat address;/空闲区起始地址 float length;/空闲区长度,单位为字节 int flag; /空闲区表登记栏标志,用0表示空栏目,用1表示未分配free_tablem; /空闲区表 (3)全局变量float minsize=5; #define n 10 /假定系统允许的最大作业数量为n#define m 10/假定系统允许的空闲区表最大为m五、源程序代码#include #include /全局变量float minsize=5;int count1=0;int count2=0;#define M 10/假定系统允许的空闲区表最大为m#define N 10 /假定系统允许的最大作业数量为n/已分配表的定义structfloat address; /已分分区起始地址 float length; /已分分区长度,单位为字节 int flag; /已分配区表登记栏标志,0表示空栏目used_tableN; /已分配区表对象名/空闲区表的定义:structfloat address;/空闲区起始地址 float length;/空闲区长度,单位为字节 int flag; /空闲区表登记栏标志,用0表示空栏目,用1表示未分配free_tableM; /空闲区表对象名/函数声明void initialize(void);int distribute(int, float);int recycle(int);void show();/初始化两个表void initialize(void)int a;for(a=0; a=N-1; a+)used_tablea.flag=0;/已分配表的表项全部置为空表项free_table0.address=1000;free_table0.length=1024;free_table0.flag=1;/空闲区表的表项全部为未分配/最优分配算法实现的动态分区int distribute(int process_name, float need_length)int 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.length)count+;if(count=1|free_tablei.length free_tablek.length)k=i;i=i+1;if(k!=-1)if(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) /找到,在已分配区表中登记一个表项 used_tablei.address=ads;used_tablei.length=len;used_tablei.flag=process_name;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内存分配区已满,分配失败!n; return 0;elsecout 无法为该作业找到合适分区!n;return 0;return process_name;int recycle(int 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!=process_name)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=M|(k!=-1&j!=-1) /修改空闲分区表if(free_tablei.flag=1)if(free_tablei.address+free_tablei.length)=recycle_address)k=i;/判断是否有上邻接 if(recycle_address+recycle_length)=free_tablei.address)j=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_length;else if(j!=-1) /只有下邻接,和下邻接合并free_tablej.length+=recycle_length;free_tablej.address=recycle_address; else /上下邻接都没有x=0;while(free_tablex.flag!=0)x=x+1;/在空闲区表中查找一个状态为0的栏目if(x=M-1) /找到后,在空闲分区中登记回收的内存free_tablex.address=recycle_address;free_tablex.length=recycle_length;free_tablex.flag=1;else /空闲表已满,执行回收失败used_tabley.flag=process_name;cout空闲区已满,回收失败!n;return 0;return process_name;void show() /程序执行时输出模拟的内存分配回收表cout+n; cout+ 空 闲 区 +n; cout+n;for(int i=0;i=count2;i+)if(free_tablei.flag!=0) cout初始地址:free_tablei.address 长度:free_tablei.length 状 态:free_tablei.flagendl;cout+n; cout+ 已 分 配 区 +n; cout+n; for(int j=0;jcount1;j+)if(used_tablej.flag!=0) cout初始地址:used_tablej.address 长度:used_tablej.length 作业名:used_tablej.flagendl;void main() /主函数调用各功能函数对所有工作进行测试int choice; /用来选择将要进行的操作int job_name;float need_memory;bool exitFlag=false;cout 动态分区分配方式的模拟 n; cout*n; cout请选择操作类型:n; initialize(); /开创空闲区和已分配区两个表while(!exitFlag)cout*n; cout* 1: 分配内存 2: 回收内存 *n; cout* 3: 查看分配 0: 退 出 *n; cout*n; coutchoice;switch(choice) case 0: exitFlag=true; /退出操作 break; case 1: coutjob_nameneed_memory; if(job_name!=0&need_memory!=0) distribute(job_name, need_memory); / 分配内存 else if(job_name=0) cou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拼多多营销策略中的数据驱动决策
- 微信朋友圈广告投放技巧与案例分享
- 关于可行性研究报告的请示
- 硅表面拼接带项目投资可行性研究分析报告(2024-2030版)
- 建筑工业化与可持续发展研究
- 汽车钣金覆盖件配件行业深度研究分析报告(2024-2030版)
- 智慧农业产业链协同发展与区域一体化
- 可持续性投资的智能算法优化策略-洞察阐释
- 2025年中国烧结锆英石砖数据监测研究报告
- 草甸物种共存网络-洞察及研究
- 四川省医学会第八次精神医学学术会议课件
- 江西制造职业技术学院教师招聘考试历年真题
- 新教材人教a版选择性必修第三册8.1成对数据的统计相关性课件2
- 精选《机械制图》期末考试题库388题(含答案)
- 2023年山西万家寨水务控股集团有限公司招聘笔试题库及答案解析
- 数码照片档案管理夏2014
- GB/T 19249-2003反渗透水处理设备
- 小学生职业生涯规划启蒙课件PPT
- 钻井安全操作规范
- 食用菌生产技术 大球盖菇栽培技术课件
- 花城版小学二年级音乐(下)全册教案
评论
0/150
提交评论