动态分区分配方式的模拟实验报告模板文档格式.docx
- 文档编号:7384353
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:43
- 大小:21.13KB
动态分区分配方式的模拟实验报告模板文档格式.docx
《动态分区分配方式的模拟实验报告模板文档格式.docx》由会员分享,可在线阅读,更多相关《动态分区分配方式的模拟实验报告模板文档格式.docx(43页珍藏版)》请在冰点文库上搜索。
四﹑设计思路和方法:
首次适应算法(First-fit):
当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。
只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;
如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;
如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。
最佳适应算法(Best-fit):
当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。
然后把它分配出去,若大小恰好合适,则直按分配;
若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。
内存回收:
将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。
并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。
五﹑主要数据结构和算法:
主要数据结构:
定义一个空闲区说明表结构
structfreearea{
intID;
//分区号
longsize;
//分区大小
longaddress;
//分区地址
intstate;
//状态
}ElemType;
线性表的双向链表存储结构
structDuLNode//doublelinkedlist
{
ElemTypedata;
structDuLNode*prior;
//前趋指针
structDuLNode*next;
//后继指针
}DuLNode,*DuLinkList;
算法:
首次适应算法:
是在分配内存时,从链首开始顺序查找,直到找到一个大小能够满足要求的分区,即进行分配。
最佳适应算法:
是在分配内存时,从链首开始顺序查找,查找到链尾,并记录一个大小不小于要求的分区的最小分区,在查找完毕后进行分配。
六﹑程序代码和输出
1程序代码如下
//***************************************************************
//********动态分区分配方式的模拟*********
#include<
iostream.h>
stdlib.h>
#defineFree0//空闲状态
#defineBusy1//已用状态
#defineOK1//完成
#defineERROR0//出错
#defineMAX_length640//最大内存空间为640KB
typedefintStatus;
typedefstructfreearea//定义一个空闲区说明表结构
//----------线性表的双向链表存储结构------------
typedefstructDuLNode//doublelinkedlist
DuLinkListblock_first;
//头结点
DuLinkListblock_last;
//尾结点
Statusalloc(int);
//内存分配
Statusfree(int);
//内存回收
StatusFirst_fit(int,int);
//首次适应算法
StatusBest_fit(int,int);
//最佳适应算法
voidshow();
//查看分配
StatusInitblock();
//开创空间表
StatusInitblock()//开创带头结点的内存空间链表
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->
prior=NULL;
next=block_last;
block_last->
prior=block_first;
next=NULL;
data.address=0;
data.size=MAX_length;
data.ID=0;
data.state=Free;
returnOK;
}
//-----------------------分配主存-------------------------
Statusalloc(intch)
intID,request;
cout<
<
"
请输入作业(分区号):
;
cin>
>
ID;
请输入需要分配的主存大小(单位:
KB):
request;
if(request<
0||request==0)
{
cout<
分配大小不合适,请重试!
endl;
returnERROR;
}
if(ch==2)//选择最佳适应算法
if(Best_fit(ID,request)==OK)cout<
分配成功!
elsecout<
内存不足,分配失败!
returnOK;
else//默认首次适应算法
if(First_fit(ID,request)==OK)cout<
//------------------首次适应算法-----------------------
StatusFirst_fit(intID,intrequest)//传入作业名及申请量
//为申请作业开辟新空间且初始化
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
temp->
data.ID=ID;
data.size=request;
data.state=Busy;
DuLNode*p=block_first->
next;
while(p)
if(p->
data.state==Free&
&
p->
data.size==request)
{//有大小恰好合适的空闲块
p->
returnOK;
break;
}
data.size>
request)
{//有空闲块能满足需求且有剩余"
temp->
prior=p->
prior;
next=p;
data.address=p->
data.address;
prior->
next=temp;
prior=temp;
data.address=temp->
data.address+temp->
data.size;
data.size-=request;
p=p->
returnERROR;
//--------------------最佳适应算法------------------------
StatusBest_fit(intID,intrequest)
intch;
//记录最小剩余空间
DuLNode*q=NULL;
//记录最佳插入位置
while(p)//初始化最小空间和最佳位置
(p->
request||p->
data.size==request))
{
q=p;
ch=p->
data.size-request;
{//空闲块大小恰好合适
{//空闲块大于分配需求
if(p->
data.size-request<
ch)//剩余空间比初值还小
{
ch=p->
//更新剩余最小值
q=p;
//更新最佳位置指向
}
if(q==NULL)returnERROR;
//没有找到空闲块
else
{//找到了最佳位置并实现分配
temp->
prior=q->
next=q;
data.address=q->
q->
data.address+=request;
data.size=ch;
//-----------------------主存回收--------------------
Statusfree(intID)
DuLNode*p=block_first;
data.ID==ID)
data.ID=Free;
data.state==Free)//与前面的空闲块相连
p->
data.size+=p->
next=p->
next->
data.state==Free)//与后面的空闲块相连
prior=p;
break;
//---------------显示主存分配情况------------------
voidshow()
+++++++++++++++++++++++++++++++++++++++\n"
+++主存分配情况+++\n"
分区号:
data.ID==Free)cout<
Free"
p->
data.ID<
起始地址:
data.address<
分区大小:
data.size<
KB"
状态:
data.state==Free)cout<
空闲"
已分配"
——————————————"
//-----------------------主函数---------------------------
voidmain()
//算法选择标记
动态分区分配方式的模拟\n"
************************************\n"
**1)首次适应算法2)最佳适应算法**\n"
请选择分配算法:
ch;
Initblock();
//开创空间表
intchoice;
//操作选择标记
while
(1)
********************************************\n"
**1:
分配内存2:
回收内存**\n"
**3:
查看分配0:
退出**\n"
请输入您的操作:
cin>
choice;
if(choice==1)alloc(ch);
//分配内存
elseif(choice==2)//内存回收
intID;
cout<
请输入您要释放的分区号:
cin>
free(ID);
elseif(choice==3)show();
//显示主存
elseif(choice==0)break;
//退出
else//输入操作有误
输入有误,请重试!
continue;
2输入和输出结果
(1)首次适应算法
动态分区分配方式的模拟
************************************
**1)首次适应算法2)最佳适应算法**
1
********************************************
回收内存**
退出**
130
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
130KB
已分配
——————————————
Free
510KB
空闲
2
60
60KB
190
450KB
100
100KB
290
350KB
4
200
******************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 分配 方式 模拟 实验 报告 模板