1、这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。在试验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还有一项“标志”,如果是空闲栏目,内容为“空”,如果为某#define m 10 #define n 10 structfloat address; float length; int flag; used_tablen;free_
2、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; float ads,
3、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 len=need_
4、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.l
5、ength=len; else free_tablek.length+=len; cout内存分配区已满,分配失败!n; return 0; else cout 无法为该作业找到合适分区! return 0; return process_name;int recycle(int process_name) int y=0; float recycle_address, recycle_length; int i, j, k; int x; while(y=n-1&used_tabley.flag!=process_name) y=y+1; if(y recycle_address=used_
6、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) if(recycle_address+recycle_length)=free_tablei.address) j=i;=-1) if(j!=-1) free_tablek.length+=free_tablej.leng
7、th+recycle_length; free_tablej.flag=0; free_tablek.length+=recycle_length; else if(j! free_tablej.length+=recycle_length; free_tablej.address=recycle_address; x=0; while(free_tablex.flag!=0) x=x+1; if(x=m-1) free_tablex.length=recycle_length; free_tablex.flag=1; used_tabley.flag=process_name;空闲区已满,回
8、收失败!void show() cout 空 闲 区n for(int i=0;i=count2;i+)地址:free_tablei.address 作业长度:free_tablei.length状 态:free_tablei.flagendl;已 分 配 区n for(int j=0;jcount1;j+)used_tablej.addressused_tablej.length作业名:used_tablej.flagchoice; switch(choice) case 0: exitFlag=true; break; case 1:请输入作业名和所需内存: cinjob_nameneed
9、_memory; distribute(job_name, need_memory); case 2: int ID;请输入您要释放的分区号:ID; recycle(ID); case 3: show(); break;内存分配回收实现截图(1)、假定系统内存分配表允许的最大作业项为10,当分配超过10时,提示“内存分配区已满,分配失败”。(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在”。(3)、当要释放某个作业时,将已分配表中此作业的标志置为0,并在空闲区做相应登记。五、总结核心算法:/最优分配算法实现的动态分区 /k用于定位在空闲表中选择的未分配栏 floa
10、t ads, len;/核心的查找条件,找到最优空闲区=m-1) /循环找到最佳的空闲分区=minsize) /整个分配 /切割空闲区/循环寻找内存分配表中标志为空栏目的项=n-1) /找到,在已分配区表中登记一个表项 else /已分配区表长度不足 if(free_tablek.flag = 0) /将已做的整个分配撤销 else /将已做的切割分配撤销每一次的实践,都会有很大的收获。决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。再一个问题是回收时候的合并,对地址的修改不是很有把握。着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1