欢迎来到天天文库
浏览记录
ID:7782143
大小:46.00 KB
页数:7页
时间:2018-02-25
《主存空间的分配和回收 采用可变分区管理》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、主存空间的分配和回收采用可变分区管理1、采用可变分区管理,使用首次获最佳适应算法实现主存的分配和回收要求采用分区说明表进行。提示:(1)可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需要,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量,查看是否有足够的空闲空间,若有,则按需求量分割一部分给作业;若无,则作业等待。随着作业的装入、完成,主存空间被分割成许多大大小小的分区。有的分区被作业占用,有的分区空闲。例如,某时刻主存空间占用情况如图3-1所示。为了说明哪些分区是空闲的,可以用来装入
2、新作业,必须要有一张空闲区说明表,如图3-2所示。图3-1内存空闲分区图长度起始地址状态32k20k未分配8k72k未分配120k100k未分配331k320k未分配空表目空表目图3-2空闲区说明表其中,起始地址指出各空闲区的主存起始地址,长度指出空闲区的大小。状态:未分配----该栏目记录的是有效的空闲区;空表目----没有登记信息。由于分区数目不定,所以空闲区说明表中应有足够的空表目项。否则造成溢出,无法登记。同样,再设一个已分配区表,记录作业或进程的主存占用情况。(2)当有一个新作业要求装入主存时,必须查空闲区说明表,
3、从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需求量,这时应将空闲区一分为二。一个分给作业;另一个仍作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。为此在空闲区表中,按空闲区首地址从低到高进行登记。为了便于快速查找,要不断地对表格进行紧缩,即让“空表目”项留在表的后部。(3)当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时要考虑相邻空闲区合并的问题。作业的释放区与空闲区的邻接分以下四种情况考虑:①释放区下邻(低地址邻接
4、)空闲区;②释放区上邻(高地址邻接)空闲区③释放区上下都与空闲区邻接;④释放区与空闲区不邻接。(4)请按首次(或最佳)适应分配算法设计主存分配和回收程序。自己设计一个作业申请队列及作业完成后的释放顺序,实现主存的分配和回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。/**/***分段内存管理*date:2007-12-2*/#include#includeusingnamespacestd;#defineMAX_MEM256//内存总量#defineOS_MEM60//
5、系统占用内存#defineTOTLE_LEFT196//除系统占用内存外的剩余内存//空闲分区表节点structFree{intstart;intlength;Free(ints,intl);};Free::Free(ints,intl){start=s;length=l;}//已分配分区表节点structTask{stringname;intstart;intlength;Task(stringn,ints,intl);};Task::Task(stringn,ints,intl){name=n;start=s;lengt
6、h=l;}//声明空闲分区表listfree_list;listtask_list;//分配可用起始地址intget_free(intsize){intstart=-1;//查找适当的空闲分区list::iteratorit=free_list.begin();boolfind=false;while(it!=free_list.end()){if((*it)->length>=size){find=true;start=(*it)->start;//大于就分割把低地址分配出去if(
7、(*it)->length>size){(*it)->start+=size;(*it)->length-=size;}//等于就从空闲分区中删掉elsefree_list.erase(it);break;//找到就跳出循环}it++;}returnstart;}voiddo_request(stringname,intsize){if(name=="SYSTEM"){cout<<"申请不合法!非法进程名!"<TOTLE_LEFT){cout<<"申请不合法!超出最大可用内存!"<
8、::iteratorit=task_list.begin();while(it!=task_list.end()){if((*it)->name==name){find=true;br
此文档下载收益归作者所有