存储器管理实验报告(共10页).docx

上传人:飞****2 文档编号:16787825 上传时间:2022-05-18 格式:DOCX 页数:10 大小:119.11KB
返回 下载 相关 举报
存储器管理实验报告(共10页).docx_第1页
第1页 / 共10页
存储器管理实验报告(共10页).docx_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《存储器管理实验报告(共10页).docx》由会员分享,可在线阅读,更多相关《存储器管理实验报告(共10页).docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上操作系统实验报告存储器管理学 院 电 信 学 院 专 业 计算机科学与技术 班 级 14级计科一班 实验题目 动态分区分配 实验组别 第三组 指导老师 曹 华 学 号姓 名张丹陈云云张伟军李瑞玲实验项目二题目动态分区分配一、实验目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。二、实验内容用语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过分区链来管理,在进行内存分配时,系统优先使用空闲区低端的空间。请分别用首次适应算法和最佳适应算法进行内存块的分

2、配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。三、实验主要仪器设备软件环境:编程环境四、实验原理及设计方案 1.实验原理:可变分区调度算法有:最先适应分配算法,循环首次适应算法,最佳适应算法,最坏适应算法。首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要求的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改区分大小和分区始址。用户提出内存空间的申请:系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出

3、能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空,并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。每当一个进程被创建时,内存分配程序首先要查找空闲内存分区链,从中寻找一

4、个合适的空闲块进行划分,并修改空闲内存分区链,系统根据回收区的首址,从空闲区链中找到相应的插入点,此时出现如下四种情况:() 回收区与插入点的前一个空闲区相邻接,此时可将回收区直接与合并,并修改的大小;() 回收区与插入点的后一个空闲分区相邻接,此时可将回收区直接与合并,并用回收区的首址作为新空闲区的首址,大小为二者之和;() 回收区同时与插入点的前后两个空闲分区邻接,此时需将三者合并;() 回收区不与任何一个空闲区邻接,此时应建一新的表项2.主要数据结构的说明定义一个空闲区说明表结构struct freearea int ID; /分区号long size; /分区大小long addres

5、s; /分区地址int state; /状态ElemType;线性表的双向链表存储结构Struct DuLNode/double linked listElemType data;struct DuLNode *prior; /前趋指针struct DuLNode *next; /后继指针DuLNode,*DuLinkList;算法;首次适应算法:是在分配内存时,从链首开始顺序查找,直到找到一个大小能够满足要求的分区,即进行分配。最佳适应算法:是在分配内存时,从链首开始顺序查表,查找到链尾,并记录一个大小不小于要求的分区的最小分区,在查找完毕后进行分配。3.程序流程图首次适应算法空闲区首地址无

6、法分配取下一块调整链表该区大小=n?该区大小=n?返回分配起始地址截取长度并修改链表已到末端?NNNYY最佳适应算法开始p=av,p=avp.lennextp.len-XS将p指向的分区分割,前面p.len-X大小的作为自由分区,修改长度信息,将之摘除。将后面X大小的分区进行分配直接分配p所指全部空间,并摘除自由链表中p所指分区将p所指分区按长度升序重新插入自由链表结束 FTTF4.实验程序首次适应算法专心-专注-专业#include#include#include#include#define N 10000 int n1;/空闲分区的个数 int n2;/作业区的个数 struct kon

7、gxian int start; /起址 int end; /结束 int length; /长度 kongxianN; struct zuoye int start; /起址 int end; /结束 int length; /长度 zuoyeN; int cmp1(const void *a,const void *b) return (*(struct kongxian *)a).start-(*(struct kongxian *)b).start; int cmp2(const void *a,const void *b) return (*(struct zuoye *)a).st

8、art-(*(struct zuoye *)b).start; void init() n1=1; /初始时只有一个空闲区 n2=0; /初始没有作业 kongxian0.start=0; kongxian0.end=1023; kongxian0.length=1024; void print1() /打印空闲分区 int i; for(i=0;in1;i+) printf(空闲分区ID:%d 起止:%d 结束:%d 长度:%dn,i,kongxiani.start,kongxiani.end,kongxiani.length); void print2() /打印作业分区 int i; f

9、or(i=0;in2;i+) printf(作业分区ID:%d 起止:%d 结束:%d 长度:%dn,i,zuoyei.start,zuoyei.end,zuoyei.length); int main() int i,j,t,len,flag,id; int front,middle, behind; int t1,t2; init(); print1(); printf(输入1装入新作业,输入0回收作业,输入-1结束n); while(scanf(%d,&t)!=EOF) if(t=1) /装入新作业 printf(请输入作业的占用空间的长度 ); scanf(%d,&len); flag

10、=0; for(i=0;i=len) /首次适应算法 flag=1; break; if(!flag) printf(内存分配失败n); else zuoyen2.start=kongxiani.start; zuoyen2.end=zuoyen2.start+len; zuoyen2.length=len; n2+; /作业数加1 if(kongxiani.length=len) /该分区全部用于分配,删除该空闲分区 for(j=i;jn1-1;j+) kongxianj.start=kongxianj+1.start; kongxianj.end=kongxianj+1.end; kong

11、xianj.length=kongxianj+1.length; n1-; else /该空闲分区部分用于分配,剩余的留在空闲分区中 kongxiani.start+=len; kongxiani.length-=len; else if(t=0) printf(输入要回收的作业ID ); scanf(%d,&id); front=middle=behind=0; for(i=0;izuoyeid.end) break; if(kongxiani.end=zuoyeid.start) /待回收的作业上面有空闲分区 front=1; t1=i; if(kongxiani.startzuoyeid

12、.end) behind=1; t2=i; if(!front&!behind) kongxiann1.start=zuoyeid.start;kongxiann1.end=zuoyeid.end;kongxiann1.length=zuoyeid.length;n1+;qsort(kongxian,n1,sizeof(struct kongxian),cmp1);for(j=id;jn2-1;j+) zuoyej.start=kongxianj+1.start; zuoyej.end=zuoyej+1.end; zuoyej.length=zuoyej+1.length;n2-; if(fr

13、ont&behind) middle=1; if(front&!behind) kongxiant1.end+=zuoyeid.length;kongxiant1.length+=zuoyeid.length;for(j=id;jn2-1;j+)zuoyej.start=zuoyej+1.start;zuoyej.end=zuoyej+1.end; zuoyej.length=zuoyej+1.length;n2-; if(middle) kongxiant1.end=kongxiant2.end;kongxiant1.length+=(zuoyeid.length+kongxiant2.le

14、ngth); for(j=t2;jn1-1;j+) kongxianj.start=kongxianj+1.start; kongxianj.end=kongxianj+1.end; kongxianj.length=kongxianj+1.length; n1-; for(j=id;jn2-1;j+)zuoyej.start=kongxianj+1.start;zuoyej.end=zuoyej+1.end; zuoyej.length=zuoyej+1.length;n2-; if(front&!behind) kongxiant1.end-=zuoyeid.length;kongxian

15、t1.length+=zuoyeid.length;for(j=id;jn2-1;j+)zuoyej.start=zuoyej+1.start; zuoyej.end=zuoyej+1.end; zuoyej.length=zuoyej+1.length;n2-; elseprintf(操作结束n);break;print1();print2();return 0;最佳适应算法#include#include#include#includestruct kongkuai int startaddr;int size;int flag;kongxq6=10,30,1,100,60,1,200,8

16、0,1,300,60,1,400,180,1,700,200,1;int allocate(int jobsize)int i;int t=0;for(i=0;ijobsize)kongxqi.startaddr+=jobsize;kongxqi.size-=jobsize;t=1;return kongxqi.startaddr-jobsize;elseif(kongxqi.flag=1&kongxqi.size=jobsize)kongxqi.flag=0;t=1;return kongxqi.startaddr;if(t=0)return 0;return 1;void circle()

17、int i,j;struct kongkuai temp;for(i=0;i6;i+)for(j=0;jkongxqj+1.size)temp.startaddr=kongxqj.startaddr;temp.size=kongxqj.size;temp.flag=kongxqj.flag;kongxqj.startaddr=kongxqj+1.startaddr;kongxqj.size=kongxqj+1.size;kongxqj.flag=kongxqj+1.flag;kongxqj+1.startaddr=temp.startaddr;kongxqj+1.size=temp.size;

18、kongxqj+1.flag=temp.flag;for(i=0;i6;i+) for(j=0;j6;j+)if(kongxqj.flag=0&kongxqj+1.flag=1)temp.startaddr=kongxqj.startaddr;temp.size=kongxqj.size;temp.flag=kongxqj.flag;kongxqj.startaddr=kongxqj+1.startaddr;kongxqj.size=kongxqj+1.size;kongxqj.flag=kongxqj+1.flag;kongxqj+1.startaddr=temp.startaddr;kon

19、gxqj+1.size=temp.size;kongxqj+1.flag=temp.flag;void callback()int s,len,t1=0,t2=0,t3=0,i,j;printf(请输入回收区的起始地址:n);scanf(%d,&s);printf(请输入回收区的大小:n);scanf(%d,&len);for(i=0;i6;i+)if(kongxqi.startaddr=s+len)&(kongxqi.flag=1)len+=kongxqi.size;t1=1;for(j=0;j6;j+)if(kongxqj.startaddr+kongxqj.size=s)&(kongxq

20、j.flag=1)kongxqi.flag=0;kongxqj.size=kongxqj+1.size+len;t2=1;break;if(t2=0)kongxqi.startaddr=s;kongxqi.size=len;break;if(t1=0)for(i=0;i6;i+)if(kongxqi.startaddr+kongxqi.size=s)&(kongxqi.flag=1)kongxqi.size+=len;t3=1;break;if(t3=0)for(j=0;j6;j+)if(kongxqj.flag=0) kongxqj.startaddr=s; kongxqj.size=len

21、; kongxqj.flag=1;break;void print()int i;printf(n 起始地址 | 大小 |是否空闲 nn);for(i=0;i6;i+)printf( %3d | %3d | %3d n,kongxqi.startaddr,kongxqi.size,kongxqi.flag);printf(n);main()int jobsize,start;char end;printf(n是否有作业请求空闲区?Y or N:);while(end=getchar()=y)printf(初始空闲区状态:n);circle();print();printf(请输入请求空闲区的作

22、业大小:);scanf(%d,&jobsize);start=allocate(jobsize);circle();printf(分配后空闲区状态:n);print();if(!start)printf(没有适合的空闲区大小!n);else printf(作业起始地址: %dn,start);printf(作业大小: %dn,jobsize);callback();print();printf(是否有其他作业的请求? Y or N:);end=getchar();return 0;五、算法及运行结果及分析1.运行结果:首次适应算法最佳适应算法2实验总结:通过运行内存分配和回收模拟的程序对内存管理理解加深了,在动态分区管理方式中,能灵活地根据作业需要,动态地为之分配内存空间,其中关键是分区分配算法,一旦内存块使用完毕,可以回收给系统以分配给其他的作业使用。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁