1、11 需求分析1)本程序要求实现对内存的动态分配与回收的模拟,同时,在内存的分配时还必须使用首次适应算法,最后,还要显示内存块分配和回收后空闲内存分区链的情况。2)要实现对作业的内存分配,首先要有一个对作业进行创建和分配内存的模块,其中,该模块在分配内存时要使用首次适应算法;要实现对内存的回收,要有一个内存回收的模块,其中,该模块在回收内存时要考虑内存回收的四种情况;最后,还要有一个能显示内存空闲分区链的情况的模块。2 概要设计1)首次适应算法的结构如图 1:图 1 首次适应算法的结构图从链首开始顺序查找空闲分区链完否?返 回分区大小所需大小?分区大小-所需大小next=new Fq;head
2、-next-size=MAXSIZE;head-next-o=0;head-next-next=NULL;int choice=0;docoutchoice;switch(choice)主菜单创建新作业 alloc() ;内存分配查看空闲分区链free() ;内存回收程序结束退出回收内存空间4case 1: create(head);break;case 2: cha(head);break;case 3: hui(head);break;case 0: break; default: coutnext;p-before=head;int no=0,b=0;coutno;coutb;alloc
3、(b,no,p); /此处调用功能函数 alloc()查看空闲分区链模块:void cha(Fq *head)/查看内存中的空闲分区链的子函数Fq *p=head-next;p-before=head;int i=0;couto=0)coutsizenext;5回收内存空间模块:void hui(Fq *head)/回收内存的子函数Fq *p=head-next;p-before=head;int no=0;coutno;while(p!=NULL)if(p-no=no)free(p); /此处调用功能函数 free()coutnext;内存分配功能函数模块:void alloc(int b,
4、int no,Fq *p)/对作业 no 进行内存分配的子函数while(p!=NULL)if(p-o=1) p=p-next;elseif(p-sizeb)if(p-size-bo=1;p-no=no;elseFq *q=new Fq;Fq *r;r=p-before;r-next=q;q-before=r;q-next=p;p-before=q;q-size=b;p-size=p-size-b;q-no=no;q-o=1;coutnext;coutbefore-o=0r-size=(r-size+c-size+c-next-size);r-next=s;7if(s!=NULL) s-bef
5、ore=r;if(c-before-o=0c-before-next=c-next;c-next-before=c-before;if(c-next-o=0c-size=c-size+c-next-size;c-next=c-next-next;if(r!=NULL) r-before=c;c-o=0;else c-o=0;6 调试分析1)内存分配功能函数模块:刚开始对作业分配内存时,只是将空闲分区的大小以及前后向指针进行修改,而没有对分配给作业的内存进行设置;这样,尽管内存的空闲分区大小已经变小,但是,以后却无法对已分配的内存空间以及作业进行修改;于是,我经过思考后,决定将分配给作业的内存空
6、间也设置为一个分区,只不过不是空闲的分区,通过状态标识符 o 来与空闲分区进行区别。2)回收内存空间模块:刚开始编写此模块的代码时,我有一种无从下手的感觉;因为,如果要回收某个作业的内存,那么必须知道该作业所在的内存中的位置;但是,刚开始我用的数据结构中只有表示内存状态的属性(分区可用空间大小,状态标识符,前后向指针) ,这样就不能对特定的作业进行操作;最后,我经过思考决定在内存的数据结构中增加一项,即作业标识符,用来保存8分区中的作业信息,从而达到查找特定作业所在内存分区的目的。3)在编写代码的过程中,我还遇到了一些小的问题;比如,对链表进行操作时,老是出现错误,不能对链表进行正确的操作等;这些问题与我对链表的认识不够深入和准确有关,不过,通过这次程序的编写,进一步加深了我对链表的理解,对链表的运用也变得得心应手了。7 测试结果1)测试数据:作业 1 申请 130KB;作业 2 申请 60KB;作业 3 申请 100KB;作业 2 释放60KB;作业 4 申请 200 KB;作业 3 释放 100 KB;作业 1 释放 130 KB;作业5 申请 140 KB;作业 6 申请 60 KB;作业 7 申请 50KB;作业 6 释放 60 KB2)程序运行结果如图 3、4 所示:图 3 程序运行结果图9图 4 程序运行结果图10