}
}
p5->end=p3->start+need; p5->next=NULL; usedhead=p5; p5=new area; p5->start=p3->start; p5->len=need;
p5->end=p3->start+need; p5->next=usedhead; usedhead=p5;
}
else{
p5->sign=num;
void correct(area*p3,int need1){修改列表 }
void create(){ 创建地址长度 }
void ask1(area*freehead){//读文件初始化,只用一次
int num,need; area*p3=freehead; ifstream infile(\while(infile>>num){ infile>>need;
if(p3->len
p3->len=p3->len-need1; p3->start=p3->start+need1;
} }
}
cout<<\内存不足,分配失败!\ return;
else }
int num,need;
cout<<\cin>>num; cin>>need; while( p3!=NULL){ }
inserused(p3,num,need); correct(p3,need);
cout<<\成功分配申请,当前内存状况为:\print(freehead); print(usedhead); cout< else break; } cout<<\内存不足,分配失败!\return; p31=p3; p3=p3->next; inserused(p3,num,need); correct(p3,need); void ask(area*freehead){申请内存 area*p3=freehead,*p31=freehead; if(p3==NULL){ freehead=delempty(); void print(area*pp){显示页面 } area*p; p=pp; cout<<\────────────────────────────\\n\if(p==NULL) {cout<<\ cout<<\────────────────────────────else do{ cout<<\ end:\ len:\ \\n\ sign:\ p=p->next; }while(p!=NULL); cout<<\─────────────────────────── ─\\n\int main() { int yourchose,flag1=0,flag2=0; int what; cout<<\现在初始化内存>>>>>>>\\n\ cout<<\请选择:1.手动初始化 2.读取文件初始化 :\ cin>>flag2; create(); if(flag2==2)ask1(freehead); cout<<\内存初始状态为:\\n\ print(freehead); print(usedhead); cout< cout<<\申请内存 2.释放作业的内存\\n\cout<<\查看空闲块链 4.查看已分配块链\\n\cout<<\查看内存状态 0.退出\\n\cout<<\while(flag1==0) cout<<\菜单选项------------------\\n\ } { cout<<\请选择操作---- :\ cin>>yourchose; switch(yourchose) { case 1: cout<<\选择哪种方式?1.最先适应 2.最优适应: \ cin>>what; } } return 0; if(what==1)listID(); else listlen(); break; ask(freehead); case 2:setfree();.释放作业的内存 break; break; break; print(usedhead); break; break; case 3:print(freehead);查看空闲块链 case 4:print(usedhead);查看已分配块链\\ case 5: print(freehead);查看内存状态 case 0:flag1=1;退出 default: break; 六、总结与体会 在一开始老师布置这次的实验题目时,自己根本不知道要干什么,因为在上课时对动态分区分配这节内容不是太了解,所以在上机时不知道如何下手,后来,将本章内容反复的看了几遍之后,终于有了自己的思路。在模拟过程中,要充分理解操作系统上关于: 1、动态分区法:动态分区法在作业执行前并不建立分区,分区的建立是在作业的处理过程中进行的。且其大小可随作业或进程对内存的要求而改变分区的建立是在作业的处理过程中进行的。且其大小可随作业或进程对内存的要求而改 变。这就改变了固定分区法中那种即使是小作业也要占据大分区的浪费现象,从而提高了内存的利用率。 2、最先适应法:最先适应算法要求可用表或自由链接按起始地址递增的次序排列。该算法的最大特点是一旦找到大于或等于所要求内存的长度的分区,则搜索结束。 其优点: (1)、在释放内存分区时,如果有相邻的空白区就进行合并,使其成为一个较大的空白区; (2)、本算法的实质是尽可能的利用存储器的低地址部分,在高地址部分则保留较多的或较大的空白区,以后如果需要较大的空白区,就容易能够满足。 3、最佳适应法:将可利用空间表中一个大小不小于“请求”且最接近“请求”的空闲块的一部分分配给用户。分配与回收都需要对可利用空间表从头至尾查询一遍。为了避免每次分配都要查询整个链表,通常要求节点从大到小排序,由此只需找到第一个足够大的空闲块即可予以分配。 C++语言具有: 1、封装性:把数据和操作数据的函数组织在一起,不仅使程序结构紧凑,并且提高了类内部的安全性 2、继承性:增加了软件可扩充性和代码重用性。 3、多态性:使设计人员对问题可以进行更好的抽象,有利于代码维护和重用。完成了此次课程设计对C++语言又有了更新的认识,对C++语言更加充分的了解;对C++语言的特点有了更加深刻的体会。 通过这次课程设计,我把学到的操作系统的知识和C++程序的设计结合到一起。虽然在设计过程中也遇到了不少问题,但最后都能得到解决而在这种过程中也使我加深了内存分配概念的理解和掌握基本内存分配的方法。不但加深我对操作系统的理论知识的理解,更增强了我的实际编程能力,丰富了编程经验,锻炼了自己动手解决实际问题的能力。总之经过这次课程设计使我学到了很多在课堂上无法学到知识,增强了编程的实践经验,使把实际问题转换成抽象算法的能力增强,为我以后参加工作奠定了坚实的基础。同时十分感谢指导教师的指点,在老师的细心指点下使我对问题的理解更加的透彻,对编程起了至关重要的作用。并且本次课程设计更加锻炼了我的学习能力和自己收集资料的能力。总之,此次实习让我获益匪浅,希望在以后的学习中有更多的这样的锻炼机会。