内存管理模型的设计与实现

上传人:m**** 文档编号:81211750 上传时间:2022-04-26 格式:DOC 页数:21 大小:141.50KB
收藏 版权申诉 举报 下载
内存管理模型的设计与实现_第1页
第1页 / 共21页
内存管理模型的设计与实现_第2页
第2页 / 共21页
内存管理模型的设计与实现_第3页
第3页 / 共21页
资源描述:

《内存管理模型的设计与实现》由会员分享,可在线阅读,更多相关《内存管理模型的设计与实现(21页珍藏版)》请在装配图网上搜索。

1、操作系统课程实验报告学生姓名:尹朋班学号:111131指导教师:袁国斌中国地质大学信息工程学院2015年1月4日实习题目:内存管理模型的设计与实现【需求规格说明】对内存的可变分区申请采用链表法管理进行模拟实现。要求:1.对于给定的一个存储空间自己设计数据结构进行管理,可以使用单个链表,也可以使用多个链表,自己负责存储空间的所有管理组织,要求采用分页方式(指定单元大小为页,如4K,2K,进程申请以页为单位)来组织基本内容;2当进程对内存进行空间申请操作时,模型采用一定的策略(如:首先利用可用的内存进行分配,如果空间不够时,进行内存紧缩或其他方案进行处理)对进程给予指定的内存分配;从系统开始启动到

2、多个进程参与申请和运行时,进程最少要有3个以上,每个执行申请的时候都要能够对系统当前的内存情况进行查看的接口;3. 对内存的申请进行内存分配,对使用过的空间进行回收,对给定的某种页面调度进行合理的页面分配。4. 利用不同的颜色代表不同的进程对内存的占用情况,动态更新这些信息。【算法设计】(1)设计思想:通过建立一个链表,来描述已分配和空闲的内存分区。对于每一个分区,它可能存放了某个进程,也可能是两个进程间的空闲区。链表中的每一个结点,分别描述了一个内存分区,包括它的起始地址、长度、指向下一个结点的指针以及分区的当前状态。在基于链表的存储管理中,当一个新的进程到来时,需要为它分配内存空间,即为它

3、寻找某个空闲分区,该分区的大小必须大于或等于进程的大小最先匹配法:假设新进程的大小为M,那么从链表的首节点开始,将每一个空闲节点的大小与M相比较,直到找到合适的节点.这种算法查找的节点很少,因而速度很快最佳匹配算法:搜索整个链表,将能够装得下该进程的最小空闲区分配出去最坏匹配法:在每次分配的时候,总是将最大的那个空闲区切去一部分,分配给请求者.它的依据是当一个很大的空闲区被切割成一部分后,可能仍然是一个比较大的空闲区,从而避免了空闲区越分越小的问题.(2)设计表示:分区结点设计:templateclassChainNodefriendChain;public:charpro;/内存块存放的程序

4、名o代表操作系统代表空闲区Tsize;/内存块的大小Tbegin;/内存块起始地址ChainNode*link;/下一个内存块;template分区链表设计:classChainpublic:Chain()first=NULL;Chain();intff(intmanage,charpro,intsize);voidassign(ChainNode*q,charpro,intsize);/动态分配内存intbf(intmanage,charpro,intsize);/最佳适应法intwf(intmanage,charpro,intsize);/最坏适应法intdelpro(intmanage,

5、charpro);/撤销进程,可能要进行内存块的合并voiddel_pro(intmanage);voidinit(intmanage);/内存的初始化voidassign_pro(intmanage);/public:ChainNode*first;ChainNode*p;(3)详细设计表示:(3)详细设计表示:【附录】#inelude#inelude#ineludetemplatevclassTclassChainNodefriendChainvT;public:charpro;/内存块存放的程序名o代表操作系统代表空闲区Tsize;/内存块的大小Tbegin;/内存块起始地址下一个内存块

6、ChainNode*link;/;templateclassChainpublic:Chain()first=NULL;Chain();intff(intmanage,charpro,intsize);voidassign(ChainNode*q,charpro,intsize);/动态分配内存intbf(intmanage,charpro,intsize);/最佳适应法intwf(intmanage,charpro,intsize);/最坏适应法intdelpro(intmanage,charpro);/撤销进程,可能要进行内存块的合并voiddel_pro(intmanage);voidi

7、nit(intmanage);/内存的初始化voidassign_pro(intmanage);/public:ChainNode*first;ChainNode*p;memory*base;/代表内存,一个头指针,内存总大小为256k/intsnum=20,50,30,45,54,52;/voidassign(memory*q,charpro,intsize);voidinit(intmanage)/内存的初始化memory*p,*q;if(base!=NULL)/这一块是释放链表p=base;while(p)q=p-next;deletep;p=q;base=newmemory;/操作系统

8、,大小5k,起始地址是0kbase-begin=0;base-pro=o;base-size=5;if(manage=0)/静态内存,初始化7个内存块,第一个内存块是操作系统p=base;q=newmemory;/空闲块1,大小20,起始地址5kq-begin=5;q-pro=0;q-size=20;p-next=q;p=q;q=newmemory;/空闲块2,大小50,起始地址25kq-begin=25;q-pro=0;q-size=50;p-next=q;p=q;q=newmemory;/空闲块3,大小30,起始地址75kq-begin=75;q-pro=0;q-size=30;p-nex

9、t=q;p=q;q=newmemory;/空闲块4,大小45,起始地址105kq-begin=105;q-pro=0;q-size=45;p-next=q;p=q;q=newmemory;/空闲块5,大小54,起始地址150kq-begin=150;q-pro=0;q-size=54;p-next=q;p=q;q=newmemory;/空闲块6,大小52,起始地址204kq-begin=204;q-pro=0;q-size=52;p-next=q;q-next=NULL;else/动态内存,只有一个大的内存块p=newmemory;/空闲块251k,起始地址是5kp-begin=5;p-pro

10、=0;p-size=251;p-next=NULL;base-next=p;voidassign(memory*q,charpro,intsize)/动态,给进程pro在内存块q-next上分配size大小,q不为空且q-next不为空/因为要进行插入操作,所以传的是要分配内存块的前指针memory*p=q-next;memory*temp=newmemory;temp=newmemory;/代表进程pro的内存块temp-begin=p-begin;temp-size=size;temp-pro=pro;q-next=temp;if(p-size!=size)/插入的内存块小于空闲区块p-s

11、ize=p-size-size;p-begin=temp-begin+temp-size;temp-next=p;temp-next=p-next;deletep;intff(intmanage,charpro,intsize)/最先适应法memory*p=base;memory*q=p;while(p)/遍历内存找到第一个适合进程pro的内存块,保存它的前指针if(p-sizepro!=0)q=p;p=p-next;elsebreak;if(p=NULL)return0;/没找到,返回0else/找到了,返回1if(manage=0)p-pro=pro;/静态,直接让进程进驻内存elseas

12、sign(q,pro,size);/动态,调用assign来给进程pro分配return1;intbf(intmanage,charpro,intsize)/最佳适应法memory*p=base,*temp=NULL,*q,*front;intmin=256;while(p)/遍历内存找到最佳的内存块,保存它的前指针if(p-pro=0&p-size=size&minp-size)min=p-size;front=q;temp=p;q=p;p=p-next;elseif(manage=0)temp-pro=pro;if(manage=0)temp-pro=pro;/静态,直接让进程进驻内存el

13、seassign(front,pro,size);/动态,调用assign来给进程pro分配pro分配return1;intwf(intmanage,charpro,intsize)/最坏适应法memory*p=base,*temp=NULL,*q,*front;intmax=0;while(p)while(p)/遍历内存,找到最大的一块内存if(p-pro=0&p-size=size&maxsize)max=p-size;front=q;temp=p;q=p;p=p-next;if(temp=NULL)return0;/没找到,返回0else/找到了,返回1/静态,直接让进程进驻内存/动态,

14、调用assign来给进程/撤销进程,可能要进行if(manage=0)temp-pro=pro;elseassign(front,pro,size);pro分配return1;intdelpro(intmanage,charpro)内存块的合并memory*p=base,*q;while(p)/遍历内存,寻找进程proif(p-pro!=pro)q=p;p=p-next;elsebreak;if(p=NULL)return0;/没找到,返回0else/找到了,返回1if(manage=0)p-pro=0;/静态内存,直接撤销进程,不用内存块合并else/动态内存,可能要进行内存合并,分4种情况

15、if(q-pro!=0)if(p-next=NULL|p-next-pro!=0)/前后内存块都不是空闲块p-pro=0;else/前内存块不是空闲块,后内存块是空闲块q-next=p-next;p-next-begin=p-begin;p-next-size=p-size+p-next-size;deletep;elseif(p-next=NULL|p-next-pro!=0)/前内存块是空闲块,后内存块不是空闲块q-next=p-next;q-size=q-size+p-size;deletep;else/前后内存块都是空闲块q-next=p-next-next;q-size=q-size

16、+p-size+p-next-size;deletep-next;deletep;return1;/根据内存块内容,格式voidprint(charch,intbegin,intsize)化输入一块内存块switch(ch)caseo:printf(操作系统区t%3dkt%3dk%3dkn,size,begin,begin+size-1);break;case0:printf(空闲区t%3dkt%3dk%3dkn,size,begin,begin+size-1);break;default:printf(进程%ct%3dkt%3dk%3dkn,ch,size,begin,begin+size-

17、1);break;voidshow()/格式化显示内存的储存情况memory*p=base;intcount=1;cout内存现在的储存情况是:pro,p-begin,p-size);p=p-next;voiddel_pro(intmanage)/撤销进程pro,调用delpromemory*p=base;charpro,result;coutpro;if(pro=o)cout操作系统不可撤销endl;elseresult=delpro(manage,pro);if(result=0)cout没有找到进程pro,撤销失败endl;elsecout进程pro撤销成功endl;voidassign

18、_pro(intmanage)/给进程pro根据选择情况分配内存intsize,result=-1;charchoose,pro;coutpro;coutsize;cout请选择分配算法:1,最先适应法。2,最佳适应法。3,最坏适应法choose;switch(choose)case1:result=ff(manage,pro,size);break;case2:result=bf(manage,pro,size);break;case3:result=wf(manage,pro,size);break;if(result=0)cout进程pro分配失败endl;elseif(result=1

19、)cout进程pro分配成功endl;elsecout输入错误endl;voidchildmenu(intmanage)/子菜单charchoice;init(manage);while(1)system(cls);if(manage=0)coutttt静态分配endl;elsecoutttt动态分配endl;show();coutvv请选择操作:n1、建立进程并分配n2、撤销进程n3、返回上一目录(内存将被初始化)choice;if(choice=1)assign_pro(manage);system(pause);elseif(choice=2)del_pro(manage);system(pause);elseif(choice=3)break;voidmain()charchoice;intmanage;while(1)/主菜单system(cls);coutttt内存分配算法演示endl;cout1、静态分配n2、动态分配n3、退出程序choice;if(choice=1)manage=0;elseif(choice=2)manage=1;elseif(choice=3)break;childmenu(manage);心得体会】通过这次课程设计,我更加深入地了解了计算机的内存管理的过程,知道了很多以前不懂的操作系统方面的知识,总而言之,为之付出的汗水是值得的!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!