




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
_实验三 存储器管理一、实验目的 1 了解内存管理的基本功能2 掌握内存管理中的几种内存分配与回收算法3 掌握可变分区算法中空闲分区的合并方法 二、实验内容与要求 设计一个存储器管理模拟系统并调试运行。要求采用一种常用的存储器分配算法(如:最佳适应算法、最坏适应算法),设计一个存储器管理模拟系统。允许进行多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。三、实验参考下面是采用的是首次适应分配算法的一个示例。根据指针freep查找自由链,当找到第一块可满足分配请求的空闲区时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量min时,则形成一个较小的空闲区留在自由链中。回收时,根据MAT将指定分区链入自由链。若该分区有前邻或后邻空闲分区,则将他们拼接成一块加大的空闲区。当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑”以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地址部分),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进行分配。本系统的主要程序模块包括:分配模块ffallocation,回收模块ffcolection,紧凑模块coalesce及命令处理模块menu。Menu用以模拟系统的输入,采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。用到的数据结构如下:(1) 自由链与区头。内存空闲区采用自由链结构。链首由freep指向,链中各个空闲区按地址递增次序排列。初启时整个用户内存区为一个空闲区。在每个空闲区首部设置一个区头(freearca)结构。区头信息包括: size 空闲区大小(以字节计),包括区头所占空间; next 前向链指针,指向下一个空闲区; back 反向链指针,指向上一个空闲区; address 本空闲区首地址。(2) 内存分配表MAT。系统设置一个MAT,每个运行作业都在MAT中占有一个表目,回收分区时清除相应表目。表目信息包括:name 用户作业名;length 作业区大小;addr 作业区首地址;begin初始化现实命令菜单读参数读命令读参数showyouffallocationffcollection显示回收结果分配成功总空区容量够分配?显示不能分配coalesceffallocation显示分配结果读键盘end示例代码#include#include#define TOTAL 5000#define SETADDRESS 2000#define MIN 100#define MAX 10typedef struct freeareaint address;int size;struct freearea *next;struct freearea *back;*freeptr;typedef struct matcharname;intaddress;intlength;struct mat *next;struct mat *back;*jobptr;char string10;long totalfree;char jobnumber;freeptr freep;jobptr jobp;/*初始化*/init()freep=(freeptr)malloc(sizeof(struct freearea);freep-size=TOTAL;freep-address=SETADDRESS;freep-next=NULL;freep-back=NULL;totalfree=TOTAL;jobp=NULL;jobnumber=0;return(0);/*分配模块*/fengpei(int jl,char jn)freeptr fp;jobptr jp,jp1,jp2;jp2=(jobptr)malloc(sizeof(struct mat);if(totalfreesizenext;elsejobnumber=jobnumber+1;totalfree=totalfree-jl;jp2-name=jn;jp2-length=jl;jp2-address=freep-address;if(jobp=NULL)jp2-next=NULL;jp2-back=NULL;jobp=jp2;elsejp=jobp;while(jp!=NULL&(jp2-addressaddress)jp1=jp;jp=jp-next;jp2-next=jp;if(jp=NULL)jp2-back=jp1;jp1-next=jp2;elsejp2-back=jp-back;if(jp-back!=NULL) jp1-next=jp2;else jobp=jp2;jp-back=jp2;if(fp-size-jl)next!=NULL)fp-next-back=fp-back;if(fp-back!=NULL)fp-back-next=fp-next;elsefreep=fp-next;/*return();*/elsefp-size=fp-size-jl;fp-address=fp-address+jl;return(2);if(totalfree=jl) return(0);/*显示模块*/xianshi()jobptr jp;/*清屏*/if(jobnumbername,jp-length,jp-address);jp=jp-next;printf(nthe total left is %d bytes:,totalfree);/*回收模块*/huishou(char jn)freeptr fp,fp1,fp2;jobptr jp;int f=0;jp=jobp;while(jp!=NULL)&(jp-name!=jn)jp=jp-next;if(jp!=NULL)jobnumber=jobnumber-1;totalfree=totalfree+jp-length;if(freep=NULL)freep=(freeptr)malloc(sizeof(struct freearea);freep-address=jp-address;freep-size=jp-address;freep-next=NULL;freep-back=NULL;elsefp=freep;while(fp!=NULL)&(fp-addressaddress)fp1=fp;fp=fp-next;if(fp!=NULL)if(fp-next!=NULL)&(fp-next-address=jp-address+jp-length)f=f+1;if(fp-back!=NULL)&(jp-address=fp1-address+fp1-size)f=f+2;else if(jp-address)=(fp1-address+fp1-size)f=f+2; switch(f) case 0: fp2=(freeptr)malloc(sizeof(struct freearea);fp2-address=jp-address;fp2-size=jp-length;fp2-next=fp;if(fp!=NULL)fp2-back=fp-back;if(fp-back!=NULL)fp1-next=fp2;else freep=fp2;fp-back=fp2;elsefp2-back=fp1;fp1-next=fp2; case 1:fp-size=fp-size+jp-length;fp-address=jp-address;case 2:fp1-size=fp1-size+jp-length;case 3:fp1-size=fp1-size+jp-length+fp-size;fp1-next=fp-next;if(fp-next!=NULL)fp-next-back=fp2;free(fp); if(jp=jobp) jobp=jp-next;if(jp-next!=NULL)jp-next-back=jp-back;if(jp-back!=NULL)jp-back-next=jp-next;free(jp);/*搬家*/banjia()freeptr fp,fp1;jobptr jp;long bottom;if(jobnumber0)jp=jobp;bottom=TOTAL+SETADDRESS;while(jp!=NULL)jp-address=bottom-jp-length;bottom=bottom-jp-length;jp=jp-next;fp=freep;while(fp!=NULL)fp1=fp;fp=fp-next;free(fp1);freep=(freeptr)malloc(sizeof(freeptr);freep-size=totalfree;freep-address=SETADDRESS;freep-next=NULL;freep-back=NULL;mingling()char name,anykey,jobname;int length,select;int address;a1:clrscr();printf(you can select one of the following:n);printf( (1)require to be allocaten);printf( (2)require to collexte the sizen);printf( (3)check the memoryn);printf( (4)quit systemn);printf(you select is:);scanf(%d,&select);switch(select) case 1:if(jobnumber=MAX) printf(the job is too many);elseprintf(enter you job namen);scanf(%s,&name);printf(enter your job lengthn);scanf(%10d,&length);address=fengpei(length,name);switch(address)case 1:printf(the memory is full);break;case 0:banjia();fengpei(length,name);xianshi();break;case 2: xianshi();break;/*else xianshi();*/break;case 2:printf(enter the name of the jobn);printf(you select is:);jobname=getchar();jobname=getchar();huishou(jobname);xianshi();brea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 一般建筑钢筋施工方案
- 建筑钢筋施工详细方案与技术要点
- 护理三基题库案例分析及答案解析
- 人工换铺长钢轨施工方案
- 镇江老旧厂房施工方案
- 江苏一小区施工方案
- 公立医院去编制化
- 2025年安全员b证题库工信部及答案解析
- 辐射安全管理知识题库及答案解析
- 施工工地安全考试题库及答案解析
- 2021年康平县工会系统招聘笔试试题及答案解析
- 一生一特长·一师一专长实施方案
- 游标卡尺的使用flash动画演示教学课件
- 汽车发动机电控系统实训工作页
- 矿山救援队伍训练大纲及考核要求
- 石油钻井用钻具培训讲义课件
- 管理层财务基础知识培训
- 整理词根词缀法初中英语学习
- 立式储罐重量表
- (高清版)建筑楼盖结构振动舒适度技术标准JGJ_T 441-2019
- 电气系统调试方案
评论
0/150
提交评论