1、由于顺序表的长度必须是提前固 定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。他们的长度必须是 系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区 表”还是“空闲区表”都有空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还 有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个作业占用分区的登记项,内容 为该作业的作业名;空闲区表中除了分区起始地址、长度外,也要有一项“标志” ,如果是空闲栏目,内容为“空”,如果为某个空闲区的登记项,内容为“未分配” 。在实际系统中,闲区表”可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区
2、。 当作业要求装入内存时,根据作业需要内存空间的大小 查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时, 选择其中一个空闲区, 按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回, 成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。四、实验结果程序代码:#in elude ioma nip.hfloat min size=5;int coun t1=0;int coun t2=0;#defi ne m 10#defi ne n 10structfloat address;float len gth;int
3、 flag;used_table n;free_tablem;void initialize(void);int distribute nt, float);int recycle nt);void show();void in itialize(void)int a;for(a=0; a=n-1; a+)used_tablea.flag=0;free_table0.address=1000;free_tableO.le ngth=1024; free_table0.flag=1;int distribute(i nt process, name, float n eed_le ngth)in
4、t i, k=-1;float ads, le n;int coun t=0;i=0;while(i=m-1)if(free_tablei.flag=1 & n eed_le ngth =free_tablei.le ngth)coun t+;if(co un t=1|free_tablei.le ngth free_tablek .len gth)k=i;i=i+1;if(k!=-1)if(free_tablek.len gth-need_le ngth)=mi nsize)free_tablek.flag=O;ads=free_tablek.address;len=free_tablek
5、.len gth;elselen=n eed_le ngth; free_tablek.address+=n eed_le ngth;free_tableken gth-=n eed_le ngth;while(used_tablei.flag!=O)i=i+1;if(i=n-1)used_tablei.address=ads; used_tablei.le ngth=le n; used_tablei.flag=process_ name; coun t1+;if(free_tablek.flag = 0)free_tablek.flag=1;free_tablek.address=ads;
6、 free_tablek .len gth=le n; free_tablek .len gth+=le n;n;coutvv内存分配区已满,分配失败!return 0;else cout 无法为该作业找到合适分区! nreturn process, name; nt process, name)int y=0;float recycle_address, recycle_le ngth;int i, j, k;int x;while(y=n-1 &used_tabley.flag!=process_ name) y=y+1; if(y=m|(k!=-1 &j!=-1)if(free_tabl
7、ei.flag=1)if(free_tablei.address+free_tablei.le ngth)=recycle_address)if(recycle_address+recycle_le ngth)=free_tablei.address)j=i;if(j!=-1)free_tablek.le ngth+=free_tablej.le ngth+recycle_le ngth; free_tablej.flag=O;free_tablek.le ngth+=recycle_le ngth;else if(j!free_tablej.le ngth+=recycle_le ngth;
8、 free_tablej.address=recycle_address;x=0;x=x+1;if(xfree_tablex.le ngth=recycle_le ngth; free_tablex.flag=1;used_tabley.flag=process_ name;空闲区已满,回收失败! return process_ name;void show()空闲区nfor(int i=0;i=count2;i+)vvfree_tablei.length 状态:vfree_tablei.flagvendl;cout已分配区nfor(i nt j=0;jco un t1;j+) 地址:used
9、_tablej.address作业长度:used_tablej.length作业名:used_tablej.flagvoid mai n()int choice;int job_ name;float n eed_memory;bool exitFlag=false; 动态分区分配方式的模拟 nin itialize();exitFlag)cout choice;switch(choice)case 0:exitFlag=true;break;case 1:请输入作业名和所需内存:job_ namen eed_memory; distribute(job_ name, n eed_memory
10、); break;case 2:int ID;请输入您要释放的分区号:ID;recycle(ID);case 3:show();内存分配回收实现截图(1)假定系统内存分配表允许的最大作业项为 10,当分配超过10时,提示内存分配区已满,分配失败”。+ -+ + + + + + + + + + + + + + + + + + + + *+ + + + + + + + + 空闲 区 *+*+*+ 也址:11M5 作业长度:83? 状态*丄+#+#+ 已分 酉己区 + + 4-+ + + + + *+ + + + + + + + + + + + + + + + + + + + + #+ + + +
11、+ +1=分配内存 2:回收内存3=查看分配 0: & 出i入您的操作 i11 25工乍业名和所需内存二內存分已满,WOi(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在”I *C: DocuMents and SettiiLgsAd&ini3t r at or1+ + + + + + +-fr + + + + + + + + +-fr + + + + + +-K + + + + -fr + H|- + + + *+ + + 闲 区 + + + +0并在空闲1 二4=+态二*骨9 +83+区r分W十己+ 0 + 1234567891 +十各各各各各各各各各各+业业
12、业业业业业业业业 + B72MR05487+ 1211221122 +虧虞虧:處處険處M:JS:+/K 咲 长长 长 /K+业业业业业业业业业业HIJ. .-1. 1.-I.-1. t .-IJI t . J.也址 11S5rill:比lt:Jh:ilh:此ih:如 +世世也世也世也世世也 +出i出-TV i t- t出(3)、当要释放某个作业时,将已分配表中此作业的标志置为区做相应登记* 1:-分配内存2:* 3 :查看分配险退 出请输入您要释放的分区号 21:分配内存 2:头查看分杞 吐退 出痔输入您的操作:3+ + + + + + 闲 区 +4- + + + + + + + + + +
13、+ + + + + + + + + 4-+ + + + + + +4- + + + + + + + + 态:1 态:1+ + + + + + + + + + + + + + + + -4-1- + + + + + + + + + + -|-+ + + +己分配区五、总结核心算法:/最优分配算法实现的动态分区 int distribute nt process, name, float n eed_le ngth) /k用于定位在空闲表中选择的未分配栏/核心的查找条件,找到最优空闲区=m-1) /循环找到最佳的空闲分区=free_tablei.le ngth) coun t+;if(count=
14、1|free_tablei.length free_tablek.length) k=i; if(k!if(free_tablek .len gth-need_le ngth)v=mi nsize) / 整个分配 /切割空闲区free_tablek.address+=n eed_le ngth; free_tableken gth-=n eed_le ngth;/循环寻找内存分配表中标志为空栏目的项=n-1) /找到,在已分配区表中登记一个表项used_tablei.le ngth=le n;else /已分配区表长度不足if(free_tablek.flag = 0) /将已做的整个分配撤销
15、free_tablek .len gth=le n;else /将已做的切割分配撤销free_tablek .len gth+=le n;内存分配区已满,分配失败!return process_ name;每一次的实践,都会有很大的收获。决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致 的看了一遍,设想会遇到的问题。在内存动态分配程序设计中,最优适应算法比 首次要难一些,要加上对分配后该分区是否能最好地利用的判断。 再一个问题是 回收时候的合并,对地址的修改不是很有把握。着手写程序后,半天才理清回收 的内存和上下邻合并的条件与关系, 写此处的代码时,逻辑上比较混乱,反复错 误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1