主存空间的分配和回收采用可变分区管理.docVIP

主存空间的分配和回收采用可变分区管理.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
主存空间的分配和回收采用可变分区管理

主存空间的分配和回收 采用可变分区管理 1、 采用可变分区管理,使用首次获最佳适应算法实现主存的分配和回收 要求采用分区说明表进行。 提示: (1)可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被作业占用,有的分区空闲。例如,某时刻主存空间占用情况如图3-1所示。 为了说明哪些分区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,如图3-2所示。 图3-1 内存空闲分区图 长度 起始地址 状态 32k 20k 未分配 8k 72k 未分配 120k 100k 未分配 331k 320k 未分配 空表目 空表目 图3-2 空闲区说明表 其中,起始地址指出各空闲区的主存起始地址,长度指出空闲区的大小。 状态:未分配----该栏目记录的是有效的空闲区;空表目----没有登记信息。 由于分区数目不定,所以空闲区说明表中应有足够的空表目项。否则造成溢出,无法登记。 同样,再设一个已分配区表,记录作业或进程的主存占用情况。 (2)当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需求量,这时应将空闲区一分为二。一个分给作业;另一个仍作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。为此在空闲区表中,按空闲区首地址从低到高进行登记。为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。 (3)当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时要考虑相邻空闲区合并的问题。作业的释放区与空闲区的邻接分以下四种情况考虑: ① 释放区下邻(低地址邻接)空闲区; ② 释放区上邻(高地址邻接)空闲区 ③ 释放区上下都与空闲区邻接; ④ 释放区与空闲区不邻接。 (4)请按首次(或最佳)适应分配算法设计主存分配和回收程序。自己设计一个作业申请队列及作业完成后的释放顺序,实现主存的分配和回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。 /** /** * 分段内存管理 * date:2007-12-2 */ #include iostream #include list using namespace std; #define MAX_MEM 256 //内存总量 #define OS_MEM 60 //系统占用内存 #define TOTLE_LEFT 196 //除系统占用内存外的剩余内存 //空闲分区表节点 struct Free { int start; int length; Free(int s,int l); }; Free::Free(int s,int l) { start = s; length = l; } //已分配分区表节点 struct Task { string name; int start; int length; Task(string n,int s,int l); }; Task::Task(string n,int s,int l) { name = n; start = s; length = l; } //声明空闲分区表 listFree * free_list; listTask * task_list; //分配可用起始地址 int get_free(int size) { int start = -1; //查找适当的空闲分区 listFree *::iterator it=free_list.begin(); bool find = false; while(it!=free_list.end()) { if((*it)-length=size) { find=true; start = (*it)-start; //大于就分割把低地址分配出去 if((*it)-lengthsize) { (*it)-start += size; (*it)-length -= size;

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档