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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

动态分区分配方式首次适应算法.docx

1、动态分区分配方式首次适应算法 计算机科学 专业课程设计任务书学生姓名专业班级学号题 目动态分区分配方式的模拟1课题性质其它课题来源自拟课题指导教师马宏琳同组姓名无主要内容1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。2)假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;作业1申请130KB;作业2申请60KB;作业3申请100KB;作业2释放60KB;作业4申请200 KB;作业3释放100 KB;作业1释放130 KB;作业5申请140 KB;作业6

2、申请60 KB;作业7申请50KB;作业6释放60 KB请采用首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。任务要求 了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。参考文献任满杰等操作系统原理实用教程 电子工业出版社 2006汤子瀛 计算机操作系统(修订版)西安电子科技大学出版社 2001张尧学 史美林计算机操作系统教程实验指导 清华大学出版社 2000 罗宇等 操作系统课程设计机械工业出版社 2005审查意见指导教师签字:教研室主任签字: 年 月 日 1 需求分析了解动态分区分配中使用的数据结构和分配算

3、法,并进一步加深对动态分区存储管理方式及其实现过程的理解。采用首次适应算法的动态分区分配过程alloc()和回收过程free()。空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间,即每次分配内存空间是总是从低址部分开始进行循环,找到第一个合适的空间,便按作业所需分配的大小分配给作业。作业完成时,需要释放作业所占空间,此时要考虑到四种情况:(1)回收区与插入点的前一个空闲分区相邻接。此时将二者合并,修改前一分区的大小。(2)回收区与插入点的后一空闲分区相邻接,将二者合并,用回收区的首址作为新空闲区的首址。(3)回收区同时与插入点的前后两个空闲分区相邻接,三者合并,使

4、用前一空闲分区的表项和首址。(4)回收区单独存在。由于该算法的实现相对简单,仅由我一人完成。2 概要设计typedef struct freeareaElemType;定义一个空闲区说明表结构,每申请一个作业,改作业便具有此结构体typedef struct DuLNodeDuLNode,*DuLinkList;定义一个双向链表Status Initblock()开创带头结点的内存空间链表,通过双向链表把申请的作业链接起来,作业的插入和删除,和链表中节点的插入和删除类似。双向链表如图1所示Status First_fit(int ID,int request)传入作业名及申请量采用首次适应算法

5、实现动态内存分区分配的模拟,初始态640KB,只是一个虚态,每申请成功一个作业,便相应的640KB做相应的减少,同过双向链表模拟主存的分配情况。内存分配流程如图2所示Status free(int ID)传过来需要回收的分区号实现分区的回收,对不同情况采取不同的处理void show()显示当前主存的分配情况3 运行环境硬件环境:Cpu:P2.4GH DRR: 0.98GB WINDOWS XP。软件环境:在VC+6.0下编译、调试。4 开发工具和编程语言开发工具: Microsort visual c+6.0中文版编程语言: c+5 详细设计1)空闲区数据结构typedef struct f

6、reearea/定义一个空闲区说明表结构 int ID; long size; long address; int state;ElemType;2)双向链表数据结构typedef struct DuLNode /双向链表结构体 ElemType data; struct DuLNode *prior; /前趋指针 struct DuLNode *next; /后继指针DuLNode,*DuLinkList;3)创建内存空间链表Status Initblock()/开创带头结点的内存空间链表 block_first=(DuLinkList)malloc(sizeof(DuLNode); blo

7、ck_last=(DuLinkList)malloc(sizeof(DuLNode); block_first-prior=NULL; block_first-next=block_last; block_last-prior=block_first; block_last-next=NULL; block_last-data.address=0; block_last-data.size=MAX_length; block_last-data.ID=0; block_last-data.state=Free; return OK;4)分配主存Status alloc() int ID,req

8、uest; coutID; coutrequest; if(request0 |request=0) cout分配大小不合适,请重试!endl; return ERROR; if(First_fit(ID,request)=OK)调用函数First_fit(ID,request)才是真正实现首次适应算法 cout分配成功!endl; else cout内存不足,分配失败!data.ID=ID; temp-data.size=request; temp-data.state=Busy; DuLNode *p=block_first-next; while(p) if(p-data.state=F

9、ree & p-data.size=request) /有大小恰好合适的空闲块 p-data.state=Busy; p-data.ID=ID; return OK; break; if(p-data.state=Free & p-data.sizerequest) /有空闲块能满足需求且有剩余 temp-prior=p-prior; temp-next=p; temp-data.address=p-data.address; p-prior-next=temp; p-prior=temp; p-data.address=temp-data.address+temp-data.size; p-

10、data.size-=request; return OK; break; p=p-next; return ERROR;5)主存回收Status free(int ID) DuLNode *p=block_first; while(p) if(p-data.ID=ID) p-data.state=Free; p-data.ID=Free; if(p-prior-data.state=Free)/与前面的空闲块相连 p-prior-data.size+=p-data.size; p-prior-next=p-next; p-next-prior=p-prior; if(p-next-data.

11、state=Free)/与后面的空闲块相连 p-data.size+=p-next-data.size;if(p-next-next=NULL)p-next=null;else p-next-next-prior=p; p-next=p-next-next; break; p=p-next; cout”分区号:”ID“回收成功”endl; return OK;6)显示主存分配情况void show() cout+n; cout+ 主存分配情况 +n; coutnext; while(p) coutdata.ID=Free) coutFreeendl; else coutdata.IDendl;

12、 cout起始地址:data.address; cout 分区大小:data.size KB; coutdata.state=Free) cout空 闲endl; else cout已分配next; 7)主 函 数void main() Initblock(); int choice; int i; for(i=0;i+) cout+n; cout+动态分区分配方式的模拟一+n; cout+首次适应算法+n; cout +n; cout + 1: 分配内存 2: 回收内存 +n; cout + 3: 查看分配 0: 退 出 +n; cout +n; coutchoice; if(choice=

13、1)/ 分配内存 alloc(); else if(choice=2)/ 内存回收 int ID; coutID; free(ID); else if(choice=3)/显示主存 show(); else if(choice=0)/退出 break; else /输入操作有误 cout输入有误,请重试!next-next=NULL)p-next=null;else满足了要求,得到了正确结果,还有就是程序允许回收内存中不存在的作业,如图4所示这是不符合要求的,因为才程序中少了对用户输入作业号的判断不符合情况的处理。7 测试结果作业1 申请30KB作业5 申请70KB作业2 申请600KB作业2

14、 申请-80KB作业2申请30KB作业2 回收30KB作业3 申请78KB测试分区分配如图5所示测试分区分配如图6所示测试分区分配如图7所示测试分区回收如图8所示测试主存当前分配情况如图9所示程序运行结果如图10所示参考文献1任满杰等操作系统原理实用教程 电子工业出版社 20062汤子瀛 计算机操作系统(修订版)西安电子科技大学出版社 20013张尧学 史美林计算机操作系统教程实验指导 清华大学出版社 2000 4罗宇等 操作系统课程设计机械工业出版社 20055曾平,曾林 操作系统清华大学出版社 2006心得体会由于已经学过动态分区分配,我也了解了什么是首次适应算法,以及首次适应算法的实现过

15、程,刚开始以为会很顺利的做完此次课程设计,但往往会出现眼高手低的情况,先是因为很久都没用过C+来编写代码了,以致刚开始时,出现了很多小问题,真是把头都搞大了,如具体的格式,以及链表的具体使用等等出现问题,还得拿出原来的课本学习查看,费了点时间,不过让我再次回味了曾经的C+编程,加深了原来的记忆。经过网上搜材料以及整体平时的学习材料,后来程序的大体框架算是出来了,不过在不断调试过程中我发现了很多不完善的地方,比如在回收内存方面,少了一种情况的处理,以致每次要回收最后一个作业时都会出现错误的框子;还有就是若要删除内存中不存在的作业,程序却允许执行,这个问题难为了我好久,改完后又接着出现新的问题,成

16、了内存中存在的作业在删除时也提示用户重新输入,原因在于判断条件加的地方不合适。通过本次课程设计我学到了很多东西,也增加了我不断摸索和学习的兴趣,由原来的书本知识演化成了真的动手实践,获益匪浅。实验代码/*动态分区分配方式的模拟一首次适应算法 *#include#include#define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1 /完成#define ERROR 0 /出错#define MAX_length 640 /最大内存空间为640KBtypedef int Status;typedef struct freearea/定义一个空闲区说

17、明表结构 int ID; long size; long address; int state;ElemType;typedef struct DuLNode /double linked list ElemType data; struct DuLNode *prior; /前趋指针 struct DuLNode *next; /后继指针DuLNode,*DuLinkList;DuLinkList block_first; /头结点DuLinkList block_last; /尾结点Status alloc();/内存分配Status free(int); /内存回收Status Firs

18、t_fit(int,int);/首次适应算法void show();/查看分配Status Initblock();/开创空间表Status Initblock()/开创带头结点的内存空间链表 block_first=(DuLinkList)malloc(sizeof(DuLNode); block_last=(DuLinkList)malloc(sizeof(DuLNode); block_first-prior=NULL; block_first-next=block_last; block_last-prior=block_first; block_last-next=NULL; blo

19、ck_last-data.address=0; block_last-data.size=MAX_length; block_last-data.ID=0; block_last-data.state=Free; return OK;/- 分 配 主 存 -Status alloc() int ID,request; coutID; coutrequest; if(request0 |request=0) cout分配大小不合适,请重试!endl; return ERROR; if(First_fit(ID,request)=OK) cout分配成功!endl; else cout内存不足,分

20、配失败!data.ID=ID; temp-data.size=request; temp-data.state=Busy; DuLNode *p=block_first-next; while(p) if(p-data.state=Free & p-data.size=request) /有大小恰好合适的空闲块 p-data.state=Busy; p-data.ID=ID; return OK; break; if(p-data.state=Free & p-data.sizerequest) /有空闲块能满足需求且有剩余 temp-prior=p-prior; temp-next=p; t

21、emp-data.address=p-data.address; p-prior-next=temp; p-prior=temp; p-data.address=temp-data.address+temp-data.size; p-data.size-=request; return OK; break; p=p-next; return ERROR;/- 主 存 回 收 -Status free(int ID) DuLNode *p=block_first; while(p) if(p-data.ID=ID) p-data.state=Free; p-data.ID=Free; if(p-

22、prior-data.state=Free)/与前面的空闲块相连 p-prior-data.size+=p-data.size; p-prior-next=p-next; p-next-prior=p-prior; if(p-next-data.state=Free)/与后面的空闲块相连 p-data.size+=p-next-data.size;if(p-next-next=NULL)p-next=NULL;else p-next-next-prior=p; p-next=p-next-next; break; p=p-next; cout分区:ID回收成功endl; return OK;/ /- 显示主存分配情况 -void show() cout+n; cout+ 主 存 分 配 情 况 +n; coutnext; while(p) coutdata.ID=Free) coutFreeendl; else coutdata.IDendl; cout起始地址:data.address; cout 分区大小:data.size KB; coutdata.state=Free) cout空 闲endl; else cout已分配next; /- 主 函 数-void main() Initblock(

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2