实验四 动态分区分配方式的模拟 答案
更新时间:2023-05-19 15:44:01 阅读量: 实用文档 文档下载
- 实验四小推荐度:
- 相关推荐
实验四 动态分区分配方式的模拟 答案
动态分区分配方式的模拟
第一部分 设计思想的说明
1 设计目标
用C语言或C++语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端空间。
预期结果:假设初始状态如下,可用的内存空间为640KB,并有下列请求序列:
作业1 申请 130KB
作业2 申请 60KB
作业3 申请 100KB
作业2 释放 60KB
作业4 申请 200KB
作业3 释放 100KB
作业1 释放 130KB
作业5 申请 140KB
作业6 申请 60KB
作业7 申请 50KB
作业6 释放 60KB
分别用首次适应算法和最佳适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。
2、设计理论
首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。
最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。
内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。
实验四 动态分区分配方式的模拟 答案
第二部分 程序清单
//*************************************************************** //******** 动态分区分配方式的模拟 ********* //***************************************************************
#include<iostream.h>
#include<stdlib.h>
#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define OK 1 //完成
#define ERROR 0 //出错
#define MAX_length 640 //最大内存空间为640KB
typedef int Status;
typedef struct freearea//定义一个空闲区说明表结构
{
int ID; //分区号
long size; //分区大小
long address; //分区地址
int state; //状态
}ElemType;
//---------- 线性表的双向链表存储结构 ------------
typedef struct DuLNode //double linked list
{
ElemType data;
struct DuLNode *prior; //前趋指针
struct DuLNode *next; //后继指针
}DuLNode,*DuLinkList;
DuLinkList block_first; //头结点
DuLinkList block_last; //尾结点
Status alloc(int);//内存分配
Status free(int); //内存回收
Status First_fit(int,int);//首次适应算法
Status Best_fit(int,int); //最佳适应算法
void show();//查看分配
Status Initblock();//开创空间表
实验四 动态分区分配方式的模拟 答案
Status Initblock()//开创带头结点的内存空间链表
{
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->prior=NULL;
block_first->next=block_last;
block_last->prior=block_first;
block_last->next=NULL;
block_last->data.address=0;
block_last->data.size=MAX_length;
block_last->data.ID=0;
block_last->data.state=Free;
return OK;
}
//----------------------- 分 配 主 存 ------------------------- Status alloc(int ch)
{
int ID,request;
cout<<"请输入作业(分区号):";
cin>>ID;
cout<<"请输入需要分配的主存大小(单位:KB):";
cin>>request;
if(request<0 ||request==0)
{
}
if(ch==2) //选择最佳适应算法
{
}
else //默认首次适应算法
{
}
}
//------------------ 首次适应算法 ----------------------- Status First_fit(int ID,int request)//传入作业名及申请量 if(First_fit(ID,request)==OK) cout<<"分配成功!"<<endl; else cout<<"内存不足,分配失败!"<<endl; return OK; if(Best_fit(ID,request)==OK) cout<<"分配成功!"<<endl; else cout<<"内存不足,分配失败!"<<endl; return OK; cout<<"分配大小不合适,请重试!"<<endl; return ERROR;
实验四 动态分区分配方式的模拟 答案
//为申请作业开辟新空间且初始化
DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID;
temp->data.size=request;
temp->data.state=Busy;
DuLNode *p=block_first->next;
while(p)
{
}
return ERROR;
}
//-------------------- 最佳适应算法 ------------------------ Status Best_fit(int ID,int request)
{
int ch; //记录最小剩余空间
DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID;
temp->data.size=request;
temp->data.state=Busy;
DuLNode *p=block_first->next;
DuLNode *q=NULL; //记录最佳插入位置
while(p) //初始化最小空间和最佳位置 if(p->data.state==Free && p->data.size==request) {//有大小恰好合适的空闲块 } if(p->data.state==Free && p->data.size>request) {//有空闲块能满足需求且有剩余" } p=p->next; temp->prior=p->prior; temp->next=p; temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; return OK; break; p->data.state=Busy; p->data.ID=ID; return OK; break;
实验四 动态分区分配方式的模拟 答案
}
while(p)
{
}
if(q==NULL) return ERROR;//没有找到空闲块
else
{//找到了最佳位置并实现分配
}
}
//----------------------- 主 存 回 收 -------------------- temp->prior=q->prior; temp->next=q; temp->data.address=q->data.address; q->prior->next=temp; q->prior=temp; q->data.address+=request; q->data.size=ch; return OK; if(p->data.state==Free && p->data.size==request) {//空闲块大小恰好合适 } if(p->data.state==Free && p->data.size>request) {//空闲块大于分配需求 } p=p->next; if(p->data.size-request<ch)//剩余空间比初值还小 { } ch=p->data.size-request;//更新剩余最小值 q=p;//更新最佳位置指向 p->data.ID=ID; p->data.state=Busy; return OK; break; if(p->data.state==Free && { } p=p->next; q=p; ch=p->data.size-request; break; (p->data.size>request || p->data.size==request) )
实验四 动态分区分配方式的模拟 答案
Status free(int ID)
{
DuLNode *p=block_first;
while(p)
{
}
return OK;
}
//--------------- 显示主存分配情况 ------------------ void show()
{
cout<<"+++++++++++++++++++++++++++++++++++++++\n";
cout<<"+++ 主 存 分 配 情 况 +++\n";
cout<<"+++++++++++++++++++++++++++++++++++++++\n";
DuLNode *p=block_first->next;
while(p)
{
cout<<"分 区 号:"; if(p->data.ID==Free) cout<<"Free"<<endl; else cout<<p->data.ID<<endl; cout<<"起始地址:"<<p->data.address<<endl; cout<<"分区大小:"<<p->data.size<<" KB"<<endl; cout<<"状 态:"; if(p->data.state==Free) cout<<"空 闲"<<endl; if(p->data.ID==ID) { } p=p->next; p->data.state=Free; p->data.ID=Free; if(p->prior->data.state==Free)//与前面的空闲块相连 { } if(p->next->data.state==Free)//与后面的空闲块相连 { } break; p->data.size+=p->next->data.size; p->next->next->prior=p; p->next=p->next->next; p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior;
实验四 动态分区分配方式的模拟 答案
}
}
else cout<<"已分配"<<endl; cout<<"——————————————"<<endl; p=p->next;
//----------------------- 主 函 数--------------------------- void main()
{
int ch;//算法选择标记
cout<<" 动态分区分配方式的模拟 \n";
cout<<"************************************\n";
cout<<"** 1)首次适应算法 2)最佳适应算法 **\n";
cout<<"************************************\n";
cout<<"请选择分配算法:";
cin>>ch;
Initblock(); //开创空间表
int choice; //操作选择标记
while(1)
{
cout<<"********************************************\n"; cout<<"** 1: 分配内存 2: 回收内存 **\n"; cout<<"** 3: 查看分配 0: 退 出 **\n"; cout<<"********************************************\n"; cout<<"请输入您的操作 :";
cin>>choice;
}
} if(choice==1) alloc(ch); // 分配内存 else if(choice==2) // 内存回收 { } else if(choice==3) show();//显示主存 else if(choice==0) break; //退出 else //输入操作有误 { } cout<<"输入有误,请重试!"<<endl; continue; int ID; cout<<"请输入您要释放的分区号:"; cin>>ID; free(ID);
正在阅读:
实验四 动态分区分配方式的模拟 答案05-19
第 八 章 足迹检验技术03-17
中小企业会计核算问题及其对策(1)08-06
关于国有土地上房屋征收与补偿中有关事项的通知(京建法〔2012〕19号)10-11
2023年区委书记在全区孝廉建设动员部署会上的讲话范文03-22
数学建模知识竞赛大二组题目03-13
2017年中考地理全国各地试卷 娄底卷05-02
某修理厂安全文明生产管理制度汇编04-20
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 分区
- 分配
- 答案
- 模拟
- 实验
- 方式
- 动态
- 全品高考数学考前专题限时训练含答案(基础+提升)作业手册
- 毛霉固态发酵豆渣条件的研究
- 全国2010年1月高等教育自学考试教育科学研究方法试题
- 物流中心运营体系设计知识库
- 冬季安全生产宣传教育材料2012
- NBA赛季初盘点主题
- 高中生物必修一第三章测试题1
- 模拟病房呼叫系统设计
- 应用文体 翻译练习第三周
- 律师办理拆迁法律业务操作指引
- 3、2005年工程防汛应急预案及响应控制方案
- 第三类医疗器械经营企业质量管理自查报告
- 综合物化探技术在大兴安岭地区区域化探异常查证工作中的应用(1)
- 2021焊工安全工作程序
- 机械加工工艺过程卡片拨叉
- 车辆全液压制动系统执行机构建模及仿真
- 高考英语常见熟词生义整理
- 期末考试主题班会
- 经典粤语歌曲集合
- 【新教材】2019部编版九年级世界历史下册教材Word版