版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./《操作系统》课程实验报告实验名称:动态分区存储管理姓名:王子瑜学号:5地点:四教楼指导老师:放美专业班级:软件工程〔测试技术14-02实验成绩:实验要求:熟悉并掌握动态分区分配的各种算法。熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。二、实验容:用高级语言模拟实现动态分区存储管理,要求:分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少一种。熟悉并掌握各种算法的空闲区组织方式。分区的初始化——可以由用户输入初始分区的大小。〔初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。〔注意:不存在的作业号要给出错误提示!分区的显示:任何时刻,可以查看当前存的情况〔起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来要求考虑:〔1存空间不足的情况,要有相应的显示;〔2作业不能同名,但是删除后可以再用这个名字;〔3作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。三、实验代码#include<stdio.h>#include<stdlib.h>#defineSIZE640//存初始大小#defineMINSIZE5//碎片最小值enumSTATE{Free,Busy};structsubAreaNode{intaddr;//起始地址intsize;//分区大小inttaskId;//作业号STATEstate;//分区状态subAreaNode*pre;//分区前向指针subAreaNode*nxt;//分区后向指针}subHead;//初始化空闲分区链voidintSubArea<>{//分配初始分区存subAreaNode*fir=<subAreaNode*>malloc<sizeof<subAreaNode>>;//给首个分区赋值fir->addr=0;fir->size=SIZE;fir->state=Free;fir->taskId=-1;fir->pre=&subHead;fir->nxt=NULL;//初始化分区头部信息subHead.pre=NULL;subHead.nxt=fir;}//首次适应算法intfirstFit<inttaskId,intsize>{subAreaNode*p=subHead.nxt;while<p!=NULL>{if<p->state==Free&&p->size>=size>{//找到要分配的空闲分区if<p->size-size<=MINSIZE>{//整块分配p->state=Busy;p->taskId=taskId;}else{//分配大小为size的区间subAreaNode*node=<subAreaNode*>malloc<sizeof<subAreaNode>>;node->addr=p->addr+size;node->size=p->size-size;node->state=Free;node->taskId=-1;//修改分区链节点指针node->pre=p;node->nxt=p->nxt;if<p->nxt!=NULL>{p->nxt->pre=node;}p->nxt=node;//分配空闲区间p->size=size;p->state=Busy;p->taskId=taskId;}printf<"存分配成功!\n">;return1;}p=p->nxt;}printf<"找不到合适的存分区,分配失败...\n">;return0;}//最佳适应算法intbestFit<inttaskId,intsize>{subAreaNode*tar=NULL;inttarSize=SIZE+1;subAreaNode*p=subHead.nxt;while<p!=NULL>{//寻找最佳空闲区间if<p->state==Free&&p->size>=size&&p->size<tarSize>{tar=p;tarSize=p->size;}p=p->nxt;}if<tar!=NULL>{//找到要分配的空闲分区if<tar->size-size<=MINSIZE>{//整块分配tar->state=Busy;tar->taskId=taskId;}else{//分配大小为size的区间subAreaNode*node=<subAreaNode*>malloc<sizeof<subAreaNode>>;node->addr=tar->addr+size;node->size=tar->size-size;node->state=Free;node->taskId=-1;//修改分区链节点指针node->pre=tar;node->nxt=tar->nxt;if<tar->nxt!=NULL>{tar->nxt->pre=node;}tar->nxt=node;//分配空闲区间tar->size=size;tar->state=Busy;tar->taskId=taskId;}printf<"存分配成功!\n">;return1;}else{//找不到合适的空闲分区printf<"找不到合适的存分区,分配失败...\n">;return0;}}//回收存intfreeSubArea<inttaskId>{intflag=0;subAreaNode*p=subHead.nxt,*pp;while<p!=NULL>{if<p->state==Busy&&p->taskId==taskId>{flag=1;if<<p->pre!=&subHead&&p->pre->state==Free>&&<p->nxt!=NULL&&p->nxt->state==Free>>{//情况1:合并上下两个分区//先合并上区间pp=p;p=p->pre;p->size+=pp->size;p->nxt=pp->nxt;pp->nxt->pre=p;free<pp>;//后合并下区间pp=p->nxt;p->size+=pp->size;p->nxt=pp->nxt;if<pp->nxt!=NULL>{pp->nxt->pre=p;}free<pp>;}elseif<<p->pre==&subHead||p->pre->state==Busy>&&<p->nxt!=NULL&&p->nxt->state==Free>>{//情况2:只合并下面的分区pp=p->nxt;p->size+=pp->size;p->state=Free;p->taskId=-1;p->nxt=pp->nxt;if<pp->nxt!=NULL>{pp->nxt->pre=p;}free<pp>;}elseif<<p->pre!=&subHead&&p->pre->state==Free>&&<p->nxt==NULL||p->nxt->state==Busy>>{//情况3:只合并上面的分区pp=p;p=p->pre;p->size+=pp->size;p->nxt=pp->nxt;if<pp->nxt!=NULL>{pp->nxt->pre=p;}free<pp>;}else{//情况4:上下分区均不用合并p->state=Free;p->taskId=-1;}}p=p->nxt;}if<flag==1>{//回收成功printf<"存分区回收成功...\n">;return1;}else{//找不到目标作业,回收失败printf<"找不到目标作业,存分区回收失败...\n">;return0;}}//显示空闲分区链情况voidshowSubArea<>{printf<"*********************************************\n">;printf<"**当前的存分配情况如下:**\n">;printf<"*********************************************\n">;printf<"**起始地址|空间大小|工作状态|作业号**\n">;subAreaNode*p=subHead.nxt;while<p!=NULL>{printf<"****\n">;printf<"**">;printf<"%dk|",p->addr>;printf<"%dk|",p->size>;printf<"%s|",p->state==Free?"Free":"Busy">;if<p->taskId>0>{printf<"%d",p->taskId>;}else{printf<"">;}printf<"**\n">;p=p->nxt;}printf<"*********************************************\n">;}intmain<>{intoption,ope,taskId,size;//初始化空闲分区链intSubArea<>;//选择分配算法while<1>{printf<"请选择要模拟的分配算法:0表示首次适应算法,1表示最佳适应算法\n">;scanf<"%d",&option>;if<option==0>{printf<"你选择了首次适应算法,下面进行算法的模拟\n">;break;}elseif<option==1>{printf<"你选择了最佳适应算法,下面进行算法的模拟\n">;break;}else{printf<"错误:请输入0/1\n\n">;}}//模拟动态分区分配算法while<1>{printf<"\n">;printf<"*********************************************\n">;printf<"**1:分配存2:回收存0:退出**\n">;printf<"*********************************************\n">;scanf<"%d",&ope>;if<ope==0>break;if<ope==1>{//模拟分配存printf<"请输入作业号:">;scanf<"%d",&taskId>;printf<"请输入需要分配的存大小<KB>:">;scanf<"%d",&size>;if<size<=0>{printf<"错误:分配存大小必须为正值\n">;continue;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 33358-2016政府热线服务规范》(2026年)深度解析
- 卵圆孔未闭规范化诊疗中国专家共识2026解读
- 医疗数据安全标准:区块链技术的行业应用前景
- 医疗数据安全成熟度评估:区块链驱动的安全审计创新
- 医疗数据安全意识培养:区块链实践
- 医疗数据安全区块链技术的生态合作与价值共创
- 医疗数据安全分级与区块链法规适配性研究
- 医疗数据安全共享技术体系
- 2026届上海市实验学校高二生物第一学期期末监测试题含解析
- 北京市丰台区2026届高二上数学期末考试试题含解析
- 2025年榆林市住房公积金管理中心招聘(19人)备考笔试试题及答案解析
- 2025年金属非金属矿山(地下矿山)安全管理人员证考试题库含答案
- 万科物业安全管理方案
- 2025秋苏教版(新教材)小学科学三年级上册知识点及期末测试卷及答案
- 2025年及未来5年中国非晶合金变压器市场深度分析及投资战略咨询报告
- 中文核心期刊论文模板(含基本格式和内容要求)
- 钢结构工程质量检测报告
- 2024-2025学年云南省普通高中高二下学期期末学业水平合格性考试数学试卷
- GB/T 18213-2025低频电缆和电线无镀层和有镀层铜导体直流电阻计算导则
- 泰康人寿会计笔试题及答案
- 园林绿化养护项目投标书范本
评论
0/150
提交评论