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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

主存空间的分配与回收实验报告.docx

1、主存空间的分配与回收实验报告实验报告课程名称:操作系统实验名称:主存空间的分配与回收学 号:110310014学生XX:于钊班 级: 信管1101班指导教师:吴联世实验日期:2021年 12月5 日1、实验目的:熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据构造和分配算法及动态分区存储管理方式及其实现过程。2、实验要求实验要求使用可变分区存储管理方式,分区分配中所用的数据构造采用空闲分区表和空闲分区链来进展,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最正确适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友

2、好的用户界面,并显示分配与回收的过程。3、实验环境硬件: CPU :AMD QL64 内存:2GB显卡:ATI 4570硬盘:日立250G软件:Windows 2000/XP。 开发工具:VC+6.0。4、实验内容1实现原理主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,假设有,那么按需要量分割一个分区分

3、配给该作业;假设无,那么作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。为了说明那些分区是空闲的,可以用来装入新作业,必须有一X空闲说明表例如:010k20k45k65k110k256k操作系统10KB作业110KB作业425KB空闲区120KB作业245KB空闲区2146KB空闲区说明表格式如下:起始地址长度状态第一栏45 K20KB未 分 配第二栏110 K146 KB未 分 配MM空 表 目空 表 目MM其中,起址指出一个空闲区的主存起始地址,长度指出空闲区的大小。长度指出从起始地址开场的一个连续空闲的长度。状态有两

4、种状态,一种是“未分配状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目状态,表示表中对应的登记工程是空白无效,可用来登记新的空闲区例如,作业完成后,它所占的区域就成了空闲区,应找一个“空表目栏登记归还区的起址和长度且修改状态。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目的登记栏目,否那么造成表格“溢出无法登记。2、当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两局部:一局部分给作业占用;另一局部又成为一个较小的空闲区,留在空闲区表中。为了尽量减少由于分割造成的空闲区

5、,尽可能分配低地址局部的空闲区,而尽量保存高地址局部有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序从低到高登记,即每个后继的空闲区其起始地址总是比前者大。为了方便查找还可使表格“紧缩,总是让“空表目项留在表格的后部。3、采用最先适应算法顺序分配算法分配主存空间。按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一局部用来装入作业,另一局部仍为空闲区登记在空闲区说明表中。由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况来代替。4、当一个作业执行完成

6、撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,那么应合成一个较大的空闲区,登记在空闲区说明表中。例如,在上述中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。2程序构造流程图首次适应分配模拟算法主存回收算法3实现步骤实现动态分区的分配与回收,主要考虑三个问题:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格根底上设计主存分配算法;第三,在设计的数据表格根底上设计主存回收算法。1 设计记录主存使用情况的数据表格由 于动态分区的大小是由作业需求量决定的,故分区的长

7、度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表 格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时,空闲区有时会变成两个分区:空闲区 和已分分区,回收主存分区时,可能会合并空闲区,这样如果整个主存采用一X表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进展分 配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区贬词空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,主存的分 配与回收主要时对空闲区的操作。这样为了便于对主存空间的分配与回收,

8、就建立两X分区表记录主存的使用情况:“已分配区表记录作业占用分区,“空闲区 表记录空闲区。这两X表的实现方法一般由两种:链表形式、顺序表形式。在本实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固 定,所以无论是“已分配区表还是“空闲区表都必须事先确定长度。它们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因此在多数情况下, 无论是“已分配表区还是“空闲区表都是空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还有一项“标志,如果是空闲栏目,内容为“空,如 果为某个作业占用分区的登记项,内容为该作业的作业名;空闲区表除了分区起始地址、长度外,也要有一项“标志,如果是

9、空闲栏目,内容为“空,如果为某 个空闲区的登记项,内容为“未分配。在实际系统中,这两个表格的内容可能还要多,实验中仅仅使用上述必须的数据。为此,“已分配区表和“空闲区表在 实验中有如下的构造定义。已分配区表的定义:#define n 10 /假定系统允许的最大作业数量为nstruct float address; /已分分区起始地址 float length; /已分分区长度,单位为字节 int flag; /已分配表区登记栏标志,用0表示空栏目,used_tablen; /已分配区表空闲区表的定义:#define m 10 /假定系统允许的空闲区表最大为mstruct float addre

10、ss; /空闲区起始地址float length; /空闲区长度,单位为字节 int flag; /空闲区表登记栏目用0表示空栏目,1表示未分配?free_tablem; /空闲区表其中分区起始地址和长度数值太大,超出了整形表达范围,所有采用float类型。2 在设计的表格上进展主存分配当 要装入一个作业时,从空闲区表中查找标志为“未分配的空闲区,从中找一个能容纳该作业的空闲区。如果找到的空闲区正好等于该作业的长度,那么把该分区全部 分配给该作业。这时应该把该空闲区登记栏中的标志改为“空,同时在已分配区表中找到一个标志为“空的栏目登记新装入作业所占用分区的起始地址、长度和 作业名。如果找到的空

11、闲区大于作业长度,那么把空闲区分成两局部,一局部用来装入作业,另一局部你仍然为空闲区,这时只要修改空闲区的长度,且把新装入的作 业登记到已分配区表中。主存分配算法目前一般采用三种算法:首次适应算法、循环首次适应算法、最正确适应算法。本实验中采用最正确适应算法为作业分配主存。最正确适应算法会出现空闲分区分割后剩下的空闲分区很小以至于无法使用的情况,为了在一定程度上解决这个问题,如果空闲分区的大小比作业要求的长度略大一点,不再将空闲区分区分割成已分分区和空闲分区两局部,而是将整个空闲区分配给作业。 在实现最正确适应算法时,可把空闲分区按长度递增方式登记在空闲区表中。分配时顺序查找空闲表,查找到的第

12、一个空闲区就是满足作业要求的最小分区。这样查找 速度快,但是为使空闲区按照长度递增登记在空闲表中,就必须在分配回收时进展空闲区的调整。空闲区表调整时移动标模的代价要高于查询整X表的代价,所以实 验中不采用空闲区有序登记在空闲表中的方法。3 动态分区方式下的主存回收 动态分区方式下回收主存空间时应该检查是否有与归还区相邻的空闲区域。假设有,那么应该合并成一个空闲区。一个归还区可能有上邻空闲区,也可能有下邻空闲区,或者既有上邻空闲区又有下邻空闲区,或者既无上邻空闲区也无下邻空闲区。 在实现回收时,首先将作业归还的区域在已分配表中找到,将该栏目的状态变为“空,然后检查空闲区表中标志为“未分配栏目,查

13、找是否又相邻空闲区;最后合并空闲区,修改空闲区表。假定归还作业的分区起始地址为S,长度为L,那么:1 归还区又下邻空闲区如果SL正好等于空闲区表中某个登记栏目假定为第j栏的起始地址那么说明归还区有一个下邻空闲区。这时候只需要修改第j栏登记项的内容: 起始地址S;第j栏长度第j栏长度L那么第j栏指示的空闲区时归还区和下邻空闲区合并后的大空闲区。2 归还区又上邻空闲区如果空闲区表中某个登记栏目假定为第k栏的“起始地址长度正好等于S,那么说明归还区有一个上邻空闲区。这时要修改第k栏登记项的内容起始地址不变: 第k栏长度第k栏长度L;于是第k栏指示的空闲区是归还区和上邻空闲区合并后的大空闲区。3 归还

14、区既有上邻空闲区又有下邻空闲区如果SL正好等于空闲区表中某个登记栏目假定为第j栏的起始地址,同时还有某个登记栏目假定为第k栏的“起始地址长度正好等于S,这说明归还区既有一个上邻空闲区又又一个下邻空闲区。此时对空闲区的修改如下: 第k栏的长度第k栏的长度第j栏的长度L;第k 栏的起始地址不变 第j栏的状态“空将第j栏的登记项删除 这样,第k栏指示的空闲区是归还区和上、下邻空闲区合并后的大空闲区;原来的下邻空闲区登记项第j栏被删除,置为“空。4 归还区既无上邻空闲区又无下邻空闲区如果在检查空闲区表时,无上述三种情况出现,那么说明归还区既无上邻空闲区又无下邻空闲区。这时,应该在空闲区表中查找一个状态

15、为“空的栏目假定查到的是第t栏,那么第t栏的内容修改如下: 第t栏起始地址S; 第t栏的长度L; 第t栏的状态“未分配;这样,第t栏指示的空闲区是归还区。 由于是实验,没有真正的主存要分配,所有在实验中,首先应建立一X空闲区表,初始状态只有一个空闲登记项假定的主存空闲区和一X所有状态都为“空的 已分配区表,假定主存空间100KB,全部为空闲区实际上操作系统需要占用一局部;然后,可以选择进展主存分配或回收,如果是分配,要求输入作业名和 所需主存空间大小;如果是回收,输入回收作业名;循环进展主存分配和回收后,如果需要,那么显示两X表的内容,以检查主存的分配和回收是否正确。4实验测试及分析:6、实验

16、心得体会这次实验比拟复杂,用了很多时间,但同时收获了很多,对主存空间分配认识加深了很多附录:源代码#include#include#define OK 1 /完成#define ERROR 0 /出错typedef int Status;typedef struct free_table/定义一个空闲区说明表构造 int num; /分区序号 long address; /起始地址 long length; /分区大小 int state; /分区状态ElemType;typedef struct Node/ 线性表的双向链表存储构造 ElemType data; struct Node *p

17、rior; /前趋指针 struct Node *next; /后继指针Node,*LinkList; LinkList first; /头结点LinkList end; /尾结点int flag;/记录要删除的分区序号Status Initblock()/开创带头结点的内存空间链表 first=(LinkList)malloc(sizeof(Node); end=(LinkList)malloc(sizeof(Node); first-prior=NULL; first-next=end; end-prior=first; end-next=NULL; end-data.num=1; end

18、-data.address=40; end-data.length=600; end-data.state=0; return OK;void sort()/分区序号重新排序 Node *p=first-next,*q; q=p-next; for(;p!=NULL;p=p-next) for(q=p-next;q;q=q-next) if(p-data.num=q-data.num) q-data.num+=1; /显示主存分配情况void show() int flag=0;/用来记录分区序号 Node *p=first; p-data.num=0; p-data.address=0; p

19、-data.length=40; p-data.state=1; sort(); printf(ntt?主存空间分配情况?n); printf(*nn); printf(分区序号t起始地址t分区大小t分区状态nn); while(p) printf(%dtt%dtt%d,p-data.num,p-data.address,p-data.length); if(p-data.state=0) printf(tt空闲nn); else printf(tt已分配nn); p=p-next; printf(*nn);/首次适应算法Status First_fit(int request) /为申请作业

20、开辟新空间且初始化 Node *p=first-next; LinkList temp=(LinkList)malloc(sizeof(Node); temp-data.length=request; temp-data.state=1; p-data.num=1; while(p) if(p-data.state=0)&(p-data.length=request) /有大小恰好适宜的空闲块 p-data.state=1; return OK; break; else if(p-data.state=0) & (p-data.lengthrequest) /有空闲块能满足需求且有剩余 tem

21、p-prior=p-prior; temp-next=p; temp-data.address=p-data.address; temp-data.num=p-data.num; p-prior-next=temp; p-prior=temp; p-data.address=temp-data.address+temp-data.length; p-data.length-=request; p-data.num+=1; return OK; break; p=p-next; return ERROR;/最正确适应算法Status Best_fit(int request) int ch; /

22、记录最小剩余空间 Node *p=first; Node *q=NULL; /记录最正确插入位置 LinkList temp=(LinkList)malloc(sizeof(Node); temp-data.length=request; temp-data.state=1; p-data.num=1; while(p) /初始化最小空间和最正确位置 if(p-data.state=0) & (p-data.length=request) ) if(q=NULL) q=p; ch=p-data.length-request; else if(q-data.length p-data.lengt

23、h) q=p; ch=p-data.length-request; p=p-next; if(q=NULL) return ERROR;/没有找到空闲块 else if(q-data.length=request) q-data.state=1; return OK; else temp-prior=q-prior; temp-next=q; temp-data.address=q-data.address; temp-data.num=q-data.num; q-prior-next=temp; q-prior=temp; q-data.address+=request; q-data.le

24、ngth=ch; q-data.num+=1; return OK; return OK;/最差适应算法Status Worst_fit(int request) int ch; /记录最大剩余空间 Node *p=first-next; Node *q=NULL; /记录最正确插入位置 LinkList temp=(LinkList)malloc(sizeof(Node); temp-data.length=request; temp-data.state=1; p-data.num=1; while(p) /初始化最大空间和最正确位置 if(p-data.state=0 & (p-data

25、.length=request) ) if(q=NULL) q=p; ch=p-data.length-request; else if(q-data.length data.length) q=p; ch=p-data.length-request; p=p-next; if(q=NULL) return ERROR;/没有找到空闲块 else if(q-data.length=request) q-data.length=1; return OK; else temp-prior=q-prior; temp-next=q; temp-data.address=q-data.address;

26、 temp-data.num=q-data.num; q-prior-next=temp; q-prior=temp; q-data.address+=request; q-data.length=ch; q-data.num+=1; return OK; return OK;/分配主存Status allocation(int a) int request;/申请内存大小 printf(请输入申请分配的主存大小(单位:KB):); scanf(%d,&request); if(requestnext) if(q=p) if(q-prior-data.state=0&q-next-data.state!=0) q-prior-data.length+=q-data.length; q-prior-next=q-next; q-next-prior=q-prior; q=q-prior; q-data.state=0; q-data.num=flag-1; if(q-prior-data.state!=0&q-next-data.state=0) q-data.length+=q-next-data.length; q-next=q-next

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

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