




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
四、主存储器空间的分配和回收1实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。2实验内容本实验模拟在两种存储管理方式下的主存分配和回收。3实验说明在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:05k10k14k26k32k128k操作系统作业1作业3空闲区作业2空闲区为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:起 址长 度状 态第一栏14 K12 K未 分 配第二栏32 K96 K未 分 配MM空 表 目空 表 目MM其中,起址指出一个空闲区的主存起始地址。 长度指出从起始地址开始的一个连续空闲的长度。 状态有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。上述的这张说明表的登记情况是按提示(1)中的例所装入的三个作业占用的主存区域后填写的。(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。(3) 采用最先适应算法(顺序分配算法)分配主存空间。按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。最先适应分配算法如图4-1。(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在提示(1)中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。归还主存时的回收算法如图4-2。4实验步骤 本次实验中需要模拟完成采用最先适应算法来分配主存空间以及释放主存空间,因此在实验需要建立一张空闲分区表和一张已分配空间表。采用结构体类型来存放各分区的信息,定义如下: struct Block /空闲链结构体string name; /作业名int address; /分区首地址 int size; /分区大小int state; /分区转态struct Block *next; /前向指针struct Block *front; /后向指针;struct Used /已分配分区结构体 Block *usedArea; Used *next; 在实验中同时也设置了子函数用来显示现在的空闲链表结构体和已分配区结构体中的内容以方便使用。其程序代码如下: void Display(Block *p,Used *q) /打印信息的函数cout-已分配分区信息(作业,始址,大小) :endl;while(q!=NULL) cout 作业 始址 大小endl; cout usedArea-name usedArea-address usedArea-sizeendl; cout-next;cout-空闲链分区信息(始址,大小) :endl;while(p!=NULL) cout-endl; cout 始址 大小endl; cout-endl; cout address ; coutsizefront;此次实验中的重点内容便是如何进行内存的分配和回收,通过课本知识的学习,明白了他们的“工作”原理,即是从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。(1)UNIX空闲分区表数据结构:空闲分区表中的空闲分区要按地址从低到高连续排序,最后一个空闲分区中 m_size为0表示以上表目空白。空闲分区表起始地址为coremap。流程图如下图:(2)当一个作业运行完毕释放内存时,系统根据释放区的首地址,从空闲区说明表中找到相应的插入点,此时可能出现下列四种情况(如下图所示,其中F1,F2表示回收区的前、后空闲区):i当回收区只与插入点的前一个分区F1相领接时,应将回收区与插入点的前一个分区合并,不再为回收区分配新的表目,而只需修改F1分区表目的大小m_size即可。 ii当回收区只与插入点的后一个分区F2相领接时,将把两个空闲区合并,修改F2分区的表目,把回收区的起址作为新空闲区的起址,大小为两个分区之和。iii当回收区既不与F1领接,又不与F2领接时(如A),应为回收区单独建立一项新表目,填写回收区的起址和大小,并根据其起址,插入到空闲区说明表的适当位置。其程序代码如下:void Recycle(string freeName) /回收分区的函数Used *p=usedHead-next,*r=usedHead;Block *q;while(p!=NULL) if(p-usedArea-name=freeName)/找到同名的作业后,再分四种情况讨论 q=p-usedArea; int flag1=1,flag2=1; Block *p1=freeHead-front; Block *pfront,*pnext; while(p1-addressaddress) if(p1-address+p1-size=q-address)flag1=0;pnext=p1; p1=p1-front; if(q-address+q-size=p1-address) flag2=0;pfront=p1; if(flag1=0) if(flag2=0) pnext-front =pfront-front; pnext-size=pnext-size + q-size + pfront-size; if(pfront-front!=NULL) pfront -front -next=pnext; r-next =p-next; else pnext -size +=q-size;r-next =p-next ; else if(flag2 =0) pfront -address -=q-size; pfront -size +=q-size ; r-next =p-next ; else Block *temp=freeHead;while(temp-addressaddress )temp=temp-front; q-front =temp; q-next =temp-next ; q-next-front =q; temp-next =q; q-state =0; r-next =p-next ; break; r=p; p=p-next ;流程图如下图:所释放的可用区与后一可用区合并与后一可用分区相邻且不为空?将该表目以上的所有表目上移一格,并插入新释放的可用区表目 返回将该表目以上的所有表目下移一格所释放可用区的size=0 ?与后一可用区合并与后一可用去相邻?把所释放的可用区 与前一分区合并 回收顺序地检索可用资源表直至找到某表目的m.addraa或m.size=0不是第一个表目且与前一个可用区相邻?回收内存流程图5实验结果(1) 系统初始时未分给作业分配内存,此时分别向系统中请求分配四个作业aaa、bbb、ccc、ddd(四个作业满足分配条件)(2) eee申请资源不能得到满足等待(3)回收ccc占用的资源(4)显示此时此刻分配和未分配的情况,结果显示ccc占用的资源已经被回收(5)任务fff可以申请资源 (6)找到空闲资源,并为任务fff分配资源附:实验源程序:#include#includeusing namespace std;struct Block /空闲链结构体string name; /作业名int address; /分区首地址 int size; /分区大小int state; /分区转态struct Block *next; /前向指针struct Block *front; /后向指针;struct Used /已分配分区结构体 Block *usedArea; Used *next;Block *freeHead; / 带表头附加节点的空闲链头指针Used *usedHead; /带表头附加结点的已分配分区头指针bool InitValue() /初始化函数cout-本程序设立的操作功能:1-申请资源 2-释放资源 3-打印信息-size=0;freeHead-next=NULL;freeHead-state=1;usedHead=new Used;Block *p=new Block;p-address=0;usedHead-usedArea=p;usedHead-next=NULL;Block *temp=new Block;couttemp-size;temp-address=0;temp-state =0;temp-next=freeHead;temp-front=NULL;freeHead-front=temp;return true;void Display(Block *p,Used *q) /打印信息的函数cout-已分配分区信息(作业,始址,大小) :endl;while(q!=NULL) cout 作业 始址 大小endl; cout usedArea-name usedArea-address usedArea-sizeendl; cout-next;cout-空闲链分区信息(始址,大小) :endl;while(p!=NULL) cout-endl; cout 始址 大小endl; cout-endl; cout address ; coutsizefront;void Allocate(string reqName,int reqSize) /分配函数 Block *p=freeHead-front ;Used *r1,*r2;while(p!=NULL) if(reqSizesize) /如果请求的分区的大小小于一个空闲分区的大小 Used *temp=new Used; temp-usedArea =p; Block *q=new Block; *q=*p; temp-usedArea -name =reqName; temp-usedArea -size =reqSize; temp-usedArea -front =q; temp-usedArea -state =1; q-size =q-size -reqSize; q-address =q-address + reqSize; q -next-front=q; if(q -front!=NULL) q -front-next=q; r1=usedHead; r2=usedHead-next; while(r2!=NULL&r2-usedArea-addressusedArea-address) r1=r2;r2=r2-next; r1-next=temp; temp-next=r2; break; else if(reqSize=p-size)/如果请求的分区的大小等于一个空闲分区的大小 Used *temp=new Used; temp-usedArea =p; temp-usedArea -name =reqName; temp-usedArea -state =1; p-next-front =p-front ; if(p-front!=NULL) p-front -next =p-next ; r1=usedHead; r2=usedHead-next; while(r2!=NULL&r2-usedArea-addressusedArea-address) r1=r2;r2=r2-next; r1-next=temp; temp-next=r2; break; p=p-front;if(p=NULL)cout-警告:资源不足请等待next,*r=usedHead;Block *q;while(p!=NULL) if(p-usedArea-name=freeName)/找到同名的作业后,再分四种情况讨论 q=p-usedArea; int flag1=1,flag2=1; Block *p1=freeHead-front; Block *pfront,*pnext; while(p1-addressaddress) if(p1-address+p1-size=q-address)flag1=0;pnext=p1; p1=p1-front; if(q-address+q-size=p1-address) flag2=0;pfront=p1; if(flag1=0) if(flag2=0) pnext-front =pfront-front; pnext-size=pnext-size + q-size + pfront-size; if(pfront-front!=NULL) pfront -front -next=pnext; r-next =p-next; else pnext -size +=q-size;r-next =p-next ; else if(flag2 =0) pfront -address -=q-size; pfront -size +=q-size ; r-next =p-next ; else Block *temp=freeHead; while(temp-address address )temp=temp-front; q-front =temp; q-next =temp-next ; q-next-front =q; temp-next =q; q-state =0; r-next =p-next ; break; r=p; p=p-next ;int main()InitValue();int operate;/操作符1-申请资源 2-释放资源 3-打印信息string name;int size;while(1) coutoperate; if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【中考专题】2026年中考数学专项提优复习:圆【附答案】
- 2025酒店客房代销品采购合同
- 2025年甘肃省平凉华亭市山寨回族乡招聘行政村村文书模拟试卷及答案详解一套
- 2025福建农信春季招聘考试服务热线考前自测高频考点模拟试题完整答案详解
- 2025标准合同模板:厨师劳务聘用合同样本
- 2025企业经营承包合同模板
- 2025福建福州市永泰县青少年业余体校外聘柔道教练员招聘1人模拟试卷及完整答案详解1套
- 2025广东深圳北京大学国际法学院招聘1人模拟试卷完整答案详解
- 2025福建闽南师范大学引进人才招聘97人模拟试卷附答案详解(完整版)
- 2025年福建省市场监督管理局直属事业单位公开招聘20人考前自测高频考点模拟试题(含答案详解)
- 2025年度陕西煤业化工集团有限责任公司高校毕业生(技能操作岗)招聘1868人笔试参考题库附带答案详解
- 物业管理安全生产责任制细则
- 2025四川金川集团股份有限公司技能操作人员社会招聘400人考试参考试题及答案解析
- 2025浙江嘉兴市海宁经济开发区、海昌街道网格员招聘1人考试参考题库及答案解析
- 动物防疫法解读
- (正式版)DB32∕T 5160-2025 《传媒行业数据分类分级指南》
- 2025年检查检验项目分级审核制度
- 辽沈战役精简课件
- 河道工程基础井点降水方案
- 第1课 高效传输秘籍-漫谈TCPIP和包交换教学设计-2023-2024学年初中信息技术(信息科技)七年级上册(2024)清华大学版(2024)(青海)
- 工业污水处理课件
评论
0/150
提交评论