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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

首次适应算法实验报告.docx

1、首次适应算法实验报告首次适应算法实验报告操作操作系统大作业题目:首次适应算法分配内存学 号: 1207300142 学生姓名: 张鲁云班 级:计科 121首次适应算法分配内存一、 问题描述在内存分配中,动态分区是根据实际的进程需求, 动态地为之分配空间。而首次适应算法分配时从表 头指针开始查找可利用空间表,将找到的第一个大 小不小于“请求”的空闲块的一部分分配给用户。 可利用空间表本身既不按节点的初始地址有序,也 不按节点的大小有序。用户释放内存,回收时只是 将空闲块插入在链表的表头即可,此算法比较节省 时间。二、 运行环境 VC6.0三、 算法思想 。首次适应算法要求空闲分区链以地址递增的次

2、序链 接。在分配内存时,从链首开始查找,直到找到一 个大小能满足要求的空闲分区为止;然后按照作业 大小,从该分区中划出一块内存空间分配给请求者 余下的空闲区仍留在空闲链中。若从链首到链尾都 不能找到一个能满足要求的分区,则此次分配失败四、 实验目的在计算机系统中,为了提高内存区的利用率,必须 给电脑内存区进行合理的分配。本实验通过对内存 区分配方法首次适应算法的使用,来了解内存分配 的模式。五、 首次适应算法分配内存 算法概要(1) 结构体Typedef struct freearea/ 定义一个空闲区说明表结构 long size; / 分区大小 long address; / 分区地址in

3、t state; / 状态ElemType; / 线性表的双向链表存储结构Typedef struct DuLNode ElemType data;structDuLNode *prior; / 前趋指针structDuLNode *next; / 后继指针 DuLNode,*DuLinkList;Status Initblock(intMAX_length)/ 开创带头结点的内存空间链表头结点的前驱指针指向空头结点的后继指针指向尾结点尾结点的前驱指针指向头结点 尾结点的后继指针指向空 尾结点的地址是 0 分区大小是最大分区 状态是空 block_first=(DuLinkList)mallo

4、c(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.state=Free; /return OK; (2)主要函数说明:void alloc() ;进行内存分配的功能函数。Status free(int flag) 将地址为 flag 的

5、分区的内存回收。表示空Status First_fit(int request) 创建进程空间的子函数;其中,参数 request 闲分区链的链首指针;要配合函数 alloc ()使用。void show() 查看内存中的分区情况。六、 流程图输入内存空间大小开辟内存空间七、 代码实现#include #include #include#define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1 /完成#define ERROR 0 /出错/#define MAX_length 640 /最大内存空间为 640KBtypedefint Status;

6、int flag;typedefstructfreearea/定义一个空闲区说明表结构long size; /分区大小long address; /int state; /分区地址状态ElemType; /线性表的双向链表存储结构typedefstructDuLNodeElemType data;structDuLNode *prior; / 前趋指针structDuLNode *next; / 后继指针 DuLNode,*DuLinkList;DuLinkListblock_first; / 头结点DuLinkListblock_last; / 尾结点Status alloc(int);/

7、内存分配Status free(int); / 内存回收Status First_fit(int);/ 首次适应算法void show();/ 查看分配Status Initblock();/ 开创空间表Status Initblock(intMAX_length)/ 开创带头结点的内存空间链表block_first=(DuLinkList)malloc(sizeof(DuLNode); block_last=(DuLinkList)malloc(sizeof(DuLNode);头结点的前驱指针指向空头结点的后继指针指向尾结点尾结点的前驱指针指向头结点 尾结点的后继指针指向空 尾结点的地址是

8、0 分区大小是最大分区 状态是空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.state=Free; /return OK;/ 分配主存Status alloc() int request = 0;printf( 请输入需要分配的主存大小 (单位:KB) :); sc

9、anf(%d,&request);if(requestdata.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; return OK;break;if(p-data.state=Free & p-data.sizerequest)/ 有空闲块能满足需求且有剩余temp-prior=p-prior;temp-next=p;temp-data.address=

10、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 flag) DuLNode *p=block_first;for(inti= 0; inext;else return ERROR;与前面的空闲块相连p-data.state=Free;if(p-prior!=block_first& p-prior

11、-data.state=Free)/p-prior-data.size+=p-data.size; p-prior-next=p-next; p-next-prior=p-prior; p=p-prior;与后面的空闲块相连if(p-next!=block_last& p-next-data.state=Free)/ p-data.size+=p-next-data.size;p-next-next-prior=p;p-next=p-next-next;if(p-next=block_last& p-next-data.state=Free)/ 与最后的空闲块相连 p-data.size+=p

12、-next-data.size;p-next=NULL;return OK;/ 显示主存分配情况void show() int flag = 0;printf( 主存分配情况 :n);DuLNode *p=block_first-next;printf( 分区号 t 起始地址 t 分区大小 t 状态 nn);while(p)printf(%d ,flag);flag+;printf(%d t,p-data.address);printf(%dKB t,p-data.size);if(p-data.state=Free)printf( 空闲 nn);elseprintf( 已分配 nn);p=p

13、-next;printf(+nn);/ 主函数void main()int c=1;intMAX_length;/ 算法选择标记printf( 首次适应算法内存分配算法: n);printf(input MAX_length:n);scanf(%d,&MAX_length);Initblock(MAX_length); / 开创空间表int choice;/ 操作选择标记while(c=1)show();printf( 请输入您的操作: );printf(n1: 分配内存 n2: 回收内存 n0: 退出 n); scanf(%d,&choice);if(choice=1)alloc(); /

14、分配内存c=1;else if(choice=2) / 内存回收int flag;printf( 请输入您要释放的分区号: n);scanf(%d,&flag);free(flag);c=1;else if(choice=0)break; / 退出else / 输入操作有误printf( 输入有误,请重试! n); c=1;printf(&n);八、 运行截图九、 思考这次试验模拟内存分配,模拟了操作系统是如何通过作业调度选择作业进入内存以及系统是如何为进入内存的作业作业分配内存空间,实现多道作业同时驻留内存,就绪 进程队列中的多个进程是如何以分式方式共享 CPU, 运行完成离开系统时,系统如何进行内存回收,采用的 是首次适应算法,应用的数据结构是双向链表。实际上 整个程序是比较简单的,但是由于自己对链表的应用不 熟悉,查阅课本文库才实现内存分配这简单的功能,这 个程序的缺陷就是在进行操作选择时没有进行分配空间 的情况下回收空间会出现错误。本次试验使我对链表有 了一定的了解但是还需继续学习

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

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