存储器管理动态分区分配算法的模拟.doc

上传人:文库蛋蛋多 文档编号:3941473 上传时间:2023-03-28 格式:DOC 页数:15 大小:92KB
返回 下载 相关 举报
存储器管理动态分区分配算法的模拟.doc_第1页
第1页 / 共15页
存储器管理动态分区分配算法的模拟.doc_第2页
第2页 / 共15页
存储器管理动态分区分配算法的模拟.doc_第3页
第3页 / 共15页
存储器管理动态分区分配算法的模拟.doc_第4页
第4页 / 共15页
存储器管理动态分区分配算法的模拟.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《存储器管理动态分区分配算法的模拟.doc》由会员分享,可在线阅读,更多相关《存储器管理动态分区分配算法的模拟.doc(15页珍藏版)》请在三一办公上搜索。

1、计算机操作系统课程设计报告指导老师:吴 江 红 题 目:存储器管理-动态分区分配算法的模拟 班 级: 031024班 姓 名:张佳(03102417)赵慧(03102419) 一、 设计任务: 编写程序完成“存储器管理动态分区分配算法”的模拟,设计主界面来灵活选择各算法,其中包括首次适应算法,最佳适应算法,最坏适应算法以及回收算法。二、 设计目的:通过课程设计,进一步理解内存分配算法的思想,并在此基础上熟练编程语言的具体的操作。三、 设计思想:内存管理有空区表管理空闲得空间,空区表记录某个空闲块的大小和首地址信息,建立空区表的双向链表,对空区链表的操作达到内存分配的管理。四、 设计方案:建立空

2、区表的双向链表结构,建立已分配表的双向链表结构;分别建立最先适应、循环最先适应、最佳适应和最差适应得类结构;采用C+Builder作界面设计;设计界面如下:五、 核心代码: 作业数据类型的定义#ifndef Job_H#define Job_Htypedef struct Job int size;/作业大小 int address;/作业首地址 AnsiString name;/作业名(AnsiString是C+Builder的字符串类型)Job;#endif 最先适应算法的代码:#ifndef Firstfit_H#define Firstfit_H#include Job.h/最先适应算

3、法头文件class first_fit_link;class linknodefriend class first_fit_link;private: int size;/作业大小 int address;/作业首地址 linknode * forward; linknode * next;public: linknode(int s,int a,linknode * f,linknode * n)/初始化 size=s; address=a; forward=f; next=n; ;class first_fit_linkprivate: linknode * head;/头指针 linkn

4、ode * rear;/尾指针 linknode * work;/标记指针public: first_fit_link()/初始化 head=NULL; rear=NULL; work=NULL; first_fit_link()/析构函数 linknode * point1; while(head!=NULL) point1=head; head=head-next; delete point1; void init(int address,int size);/初始化建空区表 Job returnjob();/返回链表元素 int allot(int size);/分配,成功返回地址,否则

5、返回无穷大 void free(int address,int size);/释放 bool over();/判断是否输出完节点元素;/空区表的建立void first_fit_link:init(int address,int size) if(head=NULL)/如果是空链,新建一个链 head=rear=work=new linknode(size,address,NULL,NULL);/申请新的节点 else linknode * point1=head; linknode * point2; while(point1!=NULL) if(addressaddress) point2

6、=new linknode(size,address,NULL,NULL); if(point1=head)/如果是首部,则改动头指针 point2-next=head; head-forward=point2; head=point2; work=point2; else/如果插入点在链中 point2-forward=point1-forward; point2-next=point1; point1-forward-next=point2; point1-forward=point2; break;/插入完成,退出 else point1=point1-next;/寻找下一个位置 if(

7、point1=NULL)/如果插入点在链尾,改动尾指针 point2=new linknode(size,address,rear,NULL); rear-next=point2; rear=point2; /分配函数,如果分配成功,返回作业地址,否则返回1000int first_fit_link:allot(int size) int address=1000; linknode * point1=head; linknode * point2; while(point1!=NULL) if(sizesize)/如果申请空间小于该节点,对该节点改动 address=point1-addre

8、ss; point1-size=point1-size-size; point1-address=point1-address+size; return address;/分配成功,返回address if(size=point1-size)/如果申请空间与该节点大小一致,删除该节点 if(point1=head)/如果是头节点 address=head-address; point2=head; head=head-next; head-forward=NULL; work=head; delete point2; return address;/分配成功,返回address if(poin

9、t1=rear)/如果是尾节点 address=rear-address; point2=rear; rear=rear-forward; rear-next=NULL; delete point2; return address;/分配成功,返回address if(point1!=head&point1!=rear) address=point1-address; point2=point1-forward; linknode * point3=point1-next; point2-next=point3; point3-forward=point2; delete point1; re

10、turn address;/分配成功,返回address point1=point1-next;/寻找下一个位置 if(point1=NULL) return address;/没有合适的空间,分配不成功,返回1000 /释放空间函数void first_fit_link:free(int address,int size) linknode * point1=head; linknode * point2; while(point1!=NULL) if(addressaddress) if(point1=head)/如果point1是头指针 if(address+size)=point1-a

11、ddress) head-address=address; head-size=head-size+size; break; else point2=new linknode(size,address,NULL,head); head-forward=point2; head=point2; break; if(point1-forward-address+point1-forward-size)=address)/如果与前一个相邻 if(address+size)=point1-address)/如果同时与后一个相邻, 合并三者,删除point1 point2=point1-forward;

12、 point2-size=point2-size+size+point1-size; if(point1=rear)/如果point1是尾指针 rear=point2; delete point1; break; else point2-next=point1-next; point1-next-forward=point2; delete point1; break; else /只与前一个相邻,则与前一个合并 point1-forward-size=point1-forward-size+size; break; if(address+size)=point1-address)/如果与后一

13、个相邻 point1-size=point1-size+size;/与后一个合并 break; /如果前后都不相邻,申请新的节点 point2=new linknode(size,address,point1-forward,point1); point1-forward-next=point2; point1-forward=point2; point1=point1-next; if(point1=NULL)/ if(rear-address+rear-size)=address)/如果与rear相邻 rear-size=rear-size+size; else /另立新的rear poi

14、nt2=new linknode(size,address,rear,NULL); rear-next=point2; rear=point2; /判断是否输出完节点bool first_fit_link:over() if(work=NULL) work=head; return true; else return false; /返回链表元素Job first_fit_link:returnjob() linknode * point1=work; Job pointNum; if(point1!=NULL) pointNum.size=point1-size; pointNum.addr

15、ess=point1-address; work=work-next; return pointNum;#endif最佳适应算法代码#ifndef Bestfit_H#define Bestfit_h#include Job.h/最佳适应算法头文件class bestfit_link;class bestnode friend class bestfit_link;private: int size;/作业大小 int address;/作业首地址 bestnode * forward; bestnode * next;public: bestnode(int s,int a,bestnode

16、 * f,bestnode * n)/初始化 size=s; address=a; forward=f; next=n; ;class bestfit_linkprivate: bestnode * head;/头指针 bestnode * rear;/尾指针 bestnode * work;/标记指针public: bestfit_link()/初始化 head=NULL; rear=NULL; work=NULL; bestfit_link()/析构函数 bestnode * point1; while(head!=NULL) point1=head; head=head-next; de

17、lete point1; void init(int address,int size);/初始化建空区表 Job returnjob();/返回链表元素 bool over();/判断是否输出完节点元素 int allot(int size);/分配;/分配函数,如果分配成功,返回作业地址,否则返回1000int bestfit_link:allot(int size) int address=1000; bestnode * point1=head; bestnode * point2; while(point1!=NULL) if(sizesize)/如果申请空间小于该节点,对该节点改动

18、 address=point1-address; point1-size=point1-size-size; point1-address=point1-address+size; return address;/分配成功,返回address if(size=point1-size)/如果申请空间与该节点大小一致,删除该节点 if(point1=head)/如果是头节点 address=head-address; point2=head; head=head-next; head-forward=NULL; work=head; delete point2; return address;/分

19、配成功,返回address if(point1=rear)/如果是尾节点 address=rear-address; point2=rear; rear=rear-forward; rear-next=NULL; delete point2; return address;/分配成功,返回address if(point1!=head&point1!=rear) address=point1-address; point2=point1-forward; bestnode * point3=point1-next; point2-next=point3; point3-forward=poin

20、t2; delete point1; return address;/分配成功,返回address point1=point1-next;/寻找下一个位置 if(point1=NULL) return address;/没有合适的空间,分配不成功,返回1000 /按空间大小递增建立链表void bestfit_link:init(int address,int size) if(head=NULL) head=rear=work=new bestnode(size,address,NULL,NULL); else bestnode * point1=head; bestnode * point

21、2; while(point1!=NULL) if(sizesize) point2=new bestnode(size,address,NULL,NULL); if(point1=head)/如果是首部,则改动头指针 point2-next=head; head-forward=point2; head=point2; work=point2; else/如果插入点在链中 point2-forward=point1-forward; point2-next=point1; point1-forward-next=point2; point1-forward=point2; break;/插入

22、完成,退出 else point1=point1-next;/寻找下一个位置 if(point1=NULL)/如果插入点在链尾,改动尾指针 point2=new bestnode(size,address,rear,NULL); rear-next=point2; rear=point2; /判断是否输出完节点bool bestfit_link:over() if(work=NULL) work=head; return true; else return false; /返回链表元素Job bestfit_link:returnjob() bestnode * point1=work; Jo

23、b pointNum; if(point1!=NULL) pointNum.size=point1-size; pointNum.address=point1-address; work=work-next; return pointNum;#endif总 结张佳的总结:程序设计在于有耐心,要细心。本次课程设计让我体会到一个程序员的枯燥与无奈,面对一台“笨”电脑,要把任何细节、任何“突发”情况考虑得仔仔细细,就像是让一头猪算“1+1=?”在把核心代码通过可视化界面实现,需要建立许多接口函数。由输入接口接受数据,需要入口函数;把核心代码运算的结果输出到界面,需要出口函数。而且体会到可视化程序的设

24、计,能更好的理解程序的运行机制,有助于更好的设计程序。总 结赵慧的总结:经过这次操作系统的课程设计,我重新将c语言的知识复习了一遍,对c的认识也有了更一步的提高,受益颇深。在这个过程中,遇到了许多意向不到的问题,自己感觉最主要的就是在下笔写程序之前,一定要认真思考,将要解决的问题和可能出现的问题充分考虑到,从整体上形成一个清晰的流程图,这样以后的编程工作才能变得更加有意义,否则会事倍功半的,将会在编程工作中遇到许多逻辑上的错误和考虑不周到而导致的错误。虽然我设计的仅仅是核心的东西,但是就是这仅有的几个设计,也让我对c语言的一些知识的运用更熟练,包括对常用库函数的了解,函数间的参数传递,字符串、链表、类、结构体的运用等。两个人的配合也让我认识到了, “合作”在编写程序这个过程中的重要性,只有通过好好的配合才能达到最好的效果,否则会越配合越乱,没有结果。这次设计,可以说是一个挑战,因为从来没有写过这么长的程序,当然遇到的问题也是相当多的,但最终算是完成了任务吧,感触颇深,让自己看清楚了自己,也有了一丝信心。让我明白了:这年头,怕就怕“认真”两个字!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号