ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:151.06KB ,
资源ID:4215029      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4215029.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(存储管理动态分区分配回收算法的模拟.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

存储管理动态分区分配回收算法的模拟.docx

1、存储管理动态分区分配回收算法的模拟 齐齐哈尔大学操作系统课程综合实践题目:存储管理动态分区分配/回收算法的模拟班级: 0姓名: 0 学号:0 指导教师:0 2011年 12 月综合实践评分表班级0姓名0指导教师0题目: 存储管理-动态分区分配/回收算法的模拟 评分标准评分标准分数权重评分的依据得分AC选题10选题符合大纲要求,题目较新颖,工作量大选题基本符合大纲要求,工作量适中工作态度10态度端正,能主动认真完成各个环节的工作,不迟到早退,出勤好。能够完成各环节基本工作,出勤较好。存储结构、算法描述20能正确选择存储结构,定义准确,算法流程图或类C语言描述的算法准确无误能正确选择存储结构,算法

2、流程图或类C语言描述的算法基本准确独立解决问题的能力10具有独立分析、解决问题能力,有一定的创造性,能够独立完成软件的设计与调试工作,程序结构清晰,逻辑严谨,功能完善。有一定的分析、解决问题能力。能够在老师指导下完成软件的设计与调试工作,程序功能较完善。答辨问题回答20能准确回答老师提出的问题能基本准确回答老师提出的问题程序运行情况10程序运行正确、界面清晰,测试数据设计合理。程序运行正确、界面较清晰,能给出合适的测试数据。综合实践报告20格式规范,层次清晰,设计思想明确,解决问题方法合理,体会深刻。格式较规范,设计思想基本明确,解决问题方法较合理。总分指导教师(签字):注:介于A和C之间为B

3、级,低于C为D级和E级。按各项指标打分后,总分在90100为优,8089为良,7079为中,6069为及格,60分以下为不及格。存储管理-动态分区分配/回收算法的模拟摘要:主存的分配和回收的实现是与住存储器的管理方式有关的。解决多进程如何共享主存空间的问题。当进程运行完时将进程所占的主存空间归还给系统。可变分区存储管理方式,分区分配中所用的数据就够采用空闲分区说明表和空闲分区链表来进行。关键字:内存分配,空闲分区表,进程申请队列一、【实践目的】:1、熟悉主存分配与回收2、理解在不同的存储管理方式,如何实现主存空间的分配与回收3、掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及

4、其实现过程。二、【实践内容和要求】:主存的分配和回收的实现是与住存储器的管理方式有关的。所谓分配,就是解决多进程如何共享主存空间的问题。所谓回收,就是当进程运行完时将进程所占的主存空间归还给系统。实验要求使用可变分区存储管理方式,分区分配中所用的数据就够采用空闲分区说明表和空闲分区链表来进行,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最佳适应算法、三种算法来实现主存的分配与回收。同时要求设计一个实用友好的可视化用户界面,并显示分配与回收过程。仿真实现动态可变分区存储管理模拟系统。内存调度策略可采用首次适应算法、循环首次适应算法和最佳适应法等,并对各种算法进行性能比较。为了实现分区

5、分配,系统中必须配置相应的数据结构,用来描述空闲区和已分配区的情况,为分配提供依据。常用的数据结构有两种形式:空闲分区表和空闲分区链。为把一个新作业装入内存,须按照一定的算法,从空闲分区表或空闲分区链中选出一个分区分配给该作业。三、【实践原理】操作系统是最重要的计算机系统软件,同时也是最活跃的学科之一。计算机系统由硬件和软件两部分组成。操作系统是配置在计算机硬件上的第一层软件,是对硬件的首次扩充。本次课程设计的主要目的是在学习操作系统理论知识的基础上,对操作系统整体的一个模拟。也是对本学期所学知识的一个总体的检测,使理论知识应用到实际的编程中,根据理论的算法来实现具体的编程操作。同时通过本次课

6、程设计加深对操作系统理论知识各个部分管理功能的感性认识,进一步分析和理解各个部分之间的联系和功能,最后达到对完整系统的理解。同时,可以提高运用操作系统知识和解决实际问题的能力;并且锻炼自己的编程能力、创新能力以及开发软件的能力;还能提高自己的调查研究、查阅文献、资料以及编写软件设计文档的能力并提高分析问题的能力。实验中为有效地对内存进行管理,实验中应设计一些数据结构,能有效地进行分配和回收,具体分析如下:1设计一个空闲分区表,空闲分区表通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲分区低端的空间。2设计一个内存分区表,可用链表管理,用以表示当前以内存使用情况。3设计一个进程申请队列

7、以及进程完成后的释放顺序,实现主存的分配和回收。4要求每次分配和回收后把空闲分区的变化情况以及各进程的申请、释放情况以及各进程的申请、释放情况以图形方式显示、打印出来。 循环首次适应算法的alloc()函数与首次适应算法的alloc()函数区别在于从哪里开始找是否有满足作业要求的空闲区,它是从上次找到的空闲区的下一个空闲分区开始找,只需要改变for循环的条件即可。for(i=s;iN;i+) 最佳适应算法:该算法总是把满足要求、又是最小的空闲区分配给作业。检查空闲区说明表是否有满足作业要求的空闲区,也分为三种情况:大于,等于,小于。若检查到有“等于”的情况,就可以直接分配,若没有,则继续检查是

8、否有“大于”的情况:if(freeblocki.state=1&freeblocki.size=applyarea) freeblocki.state=0; tag=1; return freeblocki.startaddress; 检查“大于”的情况:先把所有大于所要求的空闲区放入数组,for(i=0;iapplyarea)aj+=i;再从数组中挑出最小的那个:果数组中的元素大于一个,则需要一个个比较过去,然后取出最小的那个分配给作业:if(j1) h=a0; min=freeblockh; for(k=1;kj;k+) h=ak; if(freeblockh.sizemin.size)

9、mid.size=freeblockh.size; mid.state=freeblockh.state; mid.startaddress=freeblockh.startaddress; freeblockh.size=min.size; freeblockh.state=min.state; freeblockh.startaddress=min.startaddress; min.size=mid.size; min.state=mid.state; min.startaddress=mid.startaddress; min.startaddress=min.startaddress

10、+applyarea; min.size=min.size-applyarea; tag=1; return min.startaddress-applyarea; 如果数组中只有一个元素,则直接分配给作业:if(j=1) h=a0; min=freeblockh; min.startaddress=min.startaddress+applyarea; min.size=min.size-applyarea; tag=1; return min.startaddress-applyarea; 如果没有满足条件的空闲区,分配不成功,返回-1if(tag=0)return -1;四、【实践环境】

11、(使用的软件)Microsoft Visual C+ 6.0五、【实践设计分析】: 内存分配:动态输入构造空闲区表,并显打印示构造好的空闲分区表。键盘接收内存申请。根据申请,实施内存分配,并返回分配所得内存首址。分配完后,调整空闲分区表(即扣除分配部分),并显示调整后的空闲分区表。若分配失败,返回分配失败信息。内存回收:显示当前的空闲分区表和内存分区表。从键盘接收回收分区的首址与大小,按内存回收的四种情况进行内存回收。显示回收后已调整好的的空闲分区表六、【实践过程和步骤】: 数据结构设计1空闲分区表的设计,该空闲分区表记录内存中未使用的各个分区,记录内容有未使用分区的大小、首地址,用链表就行管

12、理;相关代码如下: Typedef struct free Int size; /分区大小 Int address;/首地址 free *next;; 内存分区表设计,用以表示当前内存的使用情况,记录内容已使用分区的大小、首地址,用链表进行管理,相关数据结构如下: Typedef struct map Int size; /分区大小 Int address;/首地址 map *next;; 进程申请队列的设计,用作进程到达的缓冲队列,记录各进程的相关信息,如进程的所需内存的大小、进程名,相关数据结构如下: Typedef struct pro Int size; /分区大小 sring nam

13、e; pro *next; 内存分配当有进程进行内存申请时,我们利用首次适应算法从空闲分区链表、找出一块做够大的空间进行分配并对空闲分区和内存分区的相关结点进行处理,若未找到则返回错误信息,相关示意图如下: 图一:内存分配示意图 内存回收内存的回收存在以下几种情况: 上邻空闲区:合并两分区,删除正回收的节点,改变上邻分区大小为两分区之和 下邻空闲区:合并两分区,删除下邻分区节点,改变正回收节点大小为两分区之和,改变正回收节点的首址。 上、下邻空闲区:合并三分区,删除下邻分区和正在回收节点,改变上分区节点大小为三分区之和,改变上分区收节点的首址 不邻接,则建立一新表项。 相关的示意图如下:回收区

14、空闲区空闲区回收区空闲区回收区空闲区 图二:内存回收示意图 相关代码1.采用最优分配算法分配作业空间,主要代码如下:void allocate(char J,float xk)/采用最优分配算法分配xk大小的空间 int i,k,l; float ad; k=-1; for(i=0;i=xk & free_tablei.flag=1) if(k=-1 | free_tablei.lengthfree_tablek.length) k=i; if(k=-1) /未找到可用空闲区,返回 AfxMessageBox(“有效空间不足!”); return; /找到可用空闲区,开始分配:若空闲区大小与要

15、求分配的空间差小于minisize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配 if(free_tablek.length-xk=minisize) free_tablek.flag=0; ad=free_tablek.address; xk=free_tablek.length; else free_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length; /修改已分配区表 l=0; for(i=0;in;i+) while(use

16、d_tablei.flag=0&i=n) /无表目填写已分分区 AfxMessageBox(无表目填写已分分区错误!);/修正空闲区表 if(free_tablek.flag=0) /前面找到的是整个空闲区 free_tablek.flag=1; else /前面找到的是某个空闲区的一部分 free_tablek.length=free_tablek.length+xk; return; else /修改已分配区表 used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J; l=1; if(l=1) break; ret

17、urn;/主存分配函数结束2.作业的回收bool reclaim(char J)/回收作业名为J的作业所占主存空间 int i,k,j, s,t; float S,L; /寻找已分配区表中对应登记项 s=0; while(used_tables.flag!=J | used_tables.flag=0)&s=n) /在已分配区表中找不到名字为J的作业 AfxMessageBox(找不到该作业); return (false); s+; /修改已分配区表 if(used_tables.flag=J) used_tables.flag=0; /取得归还分区的起始地址S和长度L S=used_tab

18、les.address; L=used_tables.length; j=-1;k=-1;i=0; /寻找回收分区的上下邻空闲区,上邻表目k,下邻表目J while(im&(j=-1|k=-1) if(free_tablei.flag=1) if(free_tablei.address+free_tablei.length=S)k=i;/找 到上邻 if(free_tablei.address=S+L) j=i; /找到下邻 i+; if(k!=-1) if(j!=-1) /上邻空闲区,下邻空闲区,三项合并 free_tablek.length=free_tablej.length+free_

19、tablek.length+L; free_tablej.flag=0; else /上邻空闲区,下邻非空闲区,与上邻合并 free_tablek.length=free_tablek.length+L; else if(j!=-1) /上邻非空闲区,下邻为空闲区,与下邻合并 free_tablej.address=S; free_tablej.length=free_tablej.length+L; else /上下邻均为非空闲区,回收区域直接填入 /在空闲区表中寻找空栏目 t=0; while(free_tablet.flag=1 & t=m) /空闲区表满,回收空间失败,将已分配区表复原

20、 AfxMessageBox(主存空闲表没有空间,回收空间失!); used_tables.flag=J; return (false); t+; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return(true);/主存归还函数结束/*动态分区的分配与回收演示程序*/#include #include #define N 5int start;/存放首址 struct freearea /*定义一个空闲区说明表结构,并初始化变量*/ int ID;/*分区号*/ int startaddress;/*空闲

21、区始址*/ int size;/*空闲区大小*/ int state;/*空闲区状态:0为空表目,1为可用空闲块*/freeblockN=1,20,20,1,2,80,50,1,3,150,30,1,4,300,30,1,5,500,10,1;/*定义为作业分配主存空间的函数alloc(),给首次适应算法调用*/int alloc(int applyarea) int i,tag=0; /*applyarea为作业申请量,tag为检查是否有满足作业需要的空闲区的标志*/ for(i=0;iapplyarea) freeblocki.startaddress=freeblocki.startad

22、dress+applyarea; freeblocki.size=freeblocki.size-applyarea; tag=1; /*有满足条件的空闲区时,tag置1*/ return freeblocki.startaddress-applyarea; /*返回为作业分配的主存地址*/ else if(freeblocki.state=1&freeblocki.size=applyarea) freeblocki.state=0; tag=1; /*有满足条件的空闲区时,tag置1*/ return freeblocki.startaddress; /*返回为作业分配的主存地址*/ if

23、(tag=0) return -1; /*没有满足条件的空闲区,分配不成功,返回-1*/ /*定义为作业分配主存空间的函数alloc2(),给循环首次适应算法调用*/int alloc2(int applyarea,int s) /*applyarea为作业申请量*/ int i,tag=0; /*tag为检查是否有满足作业需要的空闲区的标志*/ for(i=s;iapplyarea) freeblocki.startaddress=freeblocki.startaddress+applyarea; freeblocki.size=freeblocki.size-applyarea; tag

24、=1; /*有满足条件的空闲区时,tag置1*/ start=freeblocki.startaddress-applyarea; return i; else if(freeblocki.state=1&freeblocki.size=applyarea) freeblocki.state=0; tag=1; /*有满足条件的空闲区时,tag置1*/ start=freeblocki.startaddress; /*返回为作业分配的主存地址*/ return i; if(tag=0) return -1; /*没有满足条件的空闲区,分配不成功,返回-1*/ /*定义为作业分配主存空间的函数a

25、lloc3(),给最佳适应算法调用*/int alloc3(int applyarea) /*applyarea为作业申请量*/ int i,k,h,flag,tag=0,j=0; /*tag为检查是否有满足作业需要的空闲区的标志*/ int aN; struct freearea min; struct freearea mid; for(i=0;iN;i+) /*检查空闲区说明表是否有满足作业要求的空闲区*/ if(freeblocki.state=1&freeblocki.size=applyarea)/大小刚好相等 freeblocki.state=0; tag=1; /*有满足条件的

26、空闲区时,tag置1*/ return freeblocki.startaddress; /*返回为作业分配的主存地址*/ for(i=0;iapplyarea)aj+=i; if(j1) h=a0; min=freeblockh; /min.startaddress=freeblockh.startaddress; /min.size=freeblockh.size; /min.state=freeblockh.stat for(k=1;kj;k+) h=ak; if(freeblockh.sizemin.size) mid.size=freeblockh.size; mid.state=freeblockh.state; mid.startaddress=freeblockh

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1