免费预览已结束,剩余6页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实习二 主存空间的分配和回收一、实习内容模拟主存空闲空间的表示方法,以及模拟实现主存空间的分配和回收。二、实习目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。3、 实习题目在可变分区管理方式下采用首次适应算法(首次适应算法(First Fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区)实现主存分配和回收。假定内存大小为128K。空闲区说明表格式为:起始地址指出空闲区的起始地址;长度一个连续空闲区的长度;状态有两种状态,一种是“未分配”状态,另一种是“空表目”状态。本实习我用FBT实现,并且采用首次适应算法FF分配内存。四、程序中所使用的符号说明和数据结构struct FBT自由块表结构体int startdress;自由块表中一个表项的始地址int size;自由块表中的一个表项的大小int processid;这个表项所对应的进程号int state;这个表项的状态struct FBT *next;指向下一个自由块表结构体;struct FBT *create() 建立自由块表子函数struct FBT *distribute(struct FBT *head)分配内存空间子函数struct FBT *callback(struct FBT *head)回收内存空间子函数回收内存有下列4种情况,在程序中用条件语句实现:进程i回收区进程j空闲区回收区进程j进程i回收区空闲区空闲区回收区空闲区void print(struct FBT *head)显示自由块表内容子函数void main()主函数五、流程图链表初始化流程图显示FBT流程图分配内存子函数流程图回收内存子函数流程图六、程序清单#include #includestruct FBTint startdress;/分区首地址int size;/分区所占内存大小int processid;/所申请内存分区的进程号,本来FBT中没有这一项,但是便于内存的回收我加了这一项int state;/此分区的状态struct FBT *next;/指针,指向下一个结点(分区);struct FBT *create()/建立自由块表struct FBT *head,*p,*q;head=NULL;p=(struct FBT *)malloc (sizeof(struct FBT);/申请一个新的结点,用来存放新的分区q=(struct FBT *)malloc (sizeof(struct FBT);/申请一个新的结点,用来存放新的分区head=p;p-size =5;/系统分区,大小为5p-processid =-1;/1表示操作系统的固定分区p-startdress =0;/开始地址为0p-state =1;/状态为已分配,值为1p-next =q;/指向下一个结点q-size=123;/余下的分区大小为123q-processid=0;/所对应的进程号为0,表示都未分配q-startdress=5;/开始地址为5q-state=0;/状态为未分配,值为0q-next=NULL;/指向下一个分区,因为只有两个分区,所以为空return head;struct FBT *distribute(struct FBT *head)/分配内存子函数int id,neededsize;struct FBT *pretail,*tail,*p;printf(please input the process id:);/输入要申请内存的进程号scanf(%d,&id);printf(please input the needed size:);/输入要申请的内存大小scanf(%d,&neededsize);pretail=tail=head;while (tail!=NULL)if(tail-state =0&tail-size =neededsize)/如果此分区没有分配,而且大小大于等于申请的内存大小if(tail-size neededsize)/如果此分区大小大于要申请的大小,分配,并把余下的再分割成一个分区p=(struct FBT *)malloc (sizeof(struct FBT);p-size =neededsize;p-processid =id;p-startdress =tail-startdress ;p-state =1;if(head!=tail)pretail-next =p;p-next =tail;pretail=p;else p-next =tail;head=p;tail-next =NULL;tail-startdress =p-startdress+p-size ;tail-size =tail-size -neededsize;break;if(tail-size =neededsize)/如果此分区等于要申请的大小,直接分配即可tail-processid =id;tail-state =1;break; else/否则,指向下一个结点继续判断pretail=tail;tail=tail-next ;if(tail=NULL)/如果遍历完链表都没有找到合适的分区分配,则显示以下信息printf(nSorry,there is not enough memory!n);return head;/返回头指针struct FBT *callback(struct FBT *head)/回收内存子函数int id;struct FBT *pretail,*tail;printf(please input the processs id:);scanf(%d,&id);pretail=tail=head;while(tail!=NULL)/遍历链表if(tail-processid =id)/如果改分区所对应的进程号为要收回分区的进程号,则做以下动作if(tail-next !=NULL)/如果改分区不是最后一个分区,则做以下动作if(pretail-state =1&tail-next-state =1 )/前一个分区是已分配的且后一个分区也是已分配的tail-state =0;break;if(pretail-state =0&tail-next-state =1 )/前一个分区是未分配的且后一个分区是已分配的pretail-next =tail-next;pretail-size =tail-size +pretail-size ;free(tail);break;if(pretail-state =1&tail-next-state =0 )/前一个分区是已分配的且后一个分区是未分配的if(pretail!=tail)pretail-next =tail-next ;tail-next -size =tail-next -size +tail-size;tail-next -startdress =tail-startdress ;free(tail);break;else head=tail-next ;tail-next-startdress =0;tail-next-size +=tail-size;break;if(pretail-state =0&tail-next-state =0 )/前一个分区和后一个分区都是未分配的pretail-next =tail-next-next ;pretail-size =pretail-size +tail-size +tail-next -size ;free(tail-next);free(tail);break;else/如果改分区是最后一个分区则做以下动作if(pretail-state =1)/如果前一个分区是已分配的tail-state =0;break;else/如果前一个分区是未分配的pretail-next =NULL;pretail-size=pretail-size +tail-size ;free(tail);break;pretail=tail;tail=tail-next ;/遍历下一个分区结点return head;/返回头指针void print(struct FBT *head)/显示FBT的内容给用户struct FBT *tail=head;printf(startdresstsizetstatettprocessidtn);tail=head;while(tail!=NULL)if(tail-state=1)printf(%5dtt%5dt%5dtt%5dn,tail-startdress ,tail-size ,tail-state ,tail-processid );elseprintf(%5dtt%5dt%5dn,tail-startdress ,tail-size ,tail-state );tail=tail-next ;void main()/主函数int choice=1;struct FBT *head;head=create();while(choice!=0)/显示选择菜单,供用户选择printf(t1.distribute the memoryn);printf(t2.callback the memoryn);printf(t0.exitn);printf(tplease c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 液体活检专家共识
- 交叉设计在生物等效性试验中的生物分析方法学验证
- 初中九年级体育教案全集教案
- 二尖瓣反流介入修复技术演进
- 分布式能源系统规划设计论文
- 临床麻醉虚拟仿真技能考核标准研究
- 兰州城市学院开题报告(模板)
- 工商管理硕士毕业论文
- 我是一个懒的不能再懒的人,看那本MLA头疼,MLA论文格式
- 临床路径模拟教学对内科医师病历书写质量的影响
- 2023年中国中煤能源集团有限公司校园招聘笔试题库及答案解析
- 三字经讲义课件
- 部编版小学道德与法治五年级上册好山好水好风光讲课(教学课件)
- 电梯扶梯易损件清单
- 民事权利体系图示
- 数据中心机房应急全新预案
- 登高车安全安全操作规程
- 盐酸的理化性质及危险特性表9
- 4M变更管理程序含表格
- 城市设计(共32页)
- T∕CCIAT 0040-2021 建设工程人工材料设备机械数据分类标准及编码规则
评论
0/150
提交评论