存储器管理实验报告

上传人:汽*** 文档编号:507733601 上传时间:2023-11-24 格式:DOCX 页数:10 大小:119.11KB
返回 下载 相关 举报
存储器管理实验报告_第1页
第1页 / 共10页
存储器管理实验报告_第2页
第2页 / 共10页
存储器管理实验报告_第3页
第3页 / 共10页
存储器管理实验报告_第4页
第4页 / 共10页
存储器管理实验报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《存储器管理实验报告》由会员分享,可在线阅读,更多相关《存储器管理实验报告(10页珍藏版)》请在金锄头文库上搜索。

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.end) behind=1; t2=i; if(!front&!behind)

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

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号