实验报告动态分区分配算法.docx
- 文档编号:23855987
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:34
- 大小:333.92KB
实验报告动态分区分配算法.docx
《实验报告动态分区分配算法.docx》由会员分享,可在线阅读,更多相关《实验报告动态分区分配算法.docx(34页珍藏版)》请在冰豆网上搜索。
实验报告动态分区分配算法
南昌大学实验报告
学生姓名:
马江涛学号:
8000612091专业班级:
计算机软件121班
实验类型:
□验证□综合□设计□创新实验日期:
2014-05-08实验成绩:
【实验要求】
1、编程实现首次适应算法和最佳适应算法的动态分区分配的分配过程和回收过程。
其中,空闲分区通过分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。
2、假设初始状态下,可用内存空间为640K,并依次有下列请求序列:
1)作业1申请130KB。
2)作业2申请60KB。
3)作业3申请100KB。
4)作业2释放60KB。
5)作业4申请200KB。
6)作业3释放100KB。
7)作业1释放130KB。
8)作业5申请140KB。
9)作业6申请60KB。
10)作业7申请50KB。
11)作业6释放60KB。
请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况【可参考后文的实验提示】。
3、上机时认真的进行测试,输入不同的资源分配请求,写出实验结果;
4、具体要求:
(1)对你的程序关键代码处进行注释。
(2)给出实验数据,对结果进行分析,说明对相关知识点的理解。
【实验目的】
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
【实验思路】
首次适应算法(First-fit):
当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。
只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。
最佳适应算法(Best-fit):
当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。
然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。
内存回收:
将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。
并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。
【实验结果分析】
【实验提示】
你的动态分区的分配与回收,程序运行结果要可视化。
可参考如下运行结果的模式。
请分析如下这个结果来自于哪一种动态分配算法?
?
实现可变分区的分配和回收,主要考虑的问题有三个:
第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;
第二,在设计的数据表格基础上设计内存分配算法;
第三,在设计的数据表格基础上设计内存回收算法。
首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。
由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。
总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。
由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。
由于分配时空闲区有时会变成两个分区:
空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。
分配内存时查找空闲区进行分配,然后填写己分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。
由此可见,内存的分配和回收主要是对空闲区的操作。
这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。
这两张表的实现方法一般有两种:
一种是链表形式,一种是顺序表形式。
在实验中,采用顺序表形式,用数组模拟。
由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。
它们的长度必须是系统可能的最大项数。
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
1
起始地址:
0
分区大小:
130KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
130
分区大小:
60KB
状态:
空闲
——————————————
分区号:
3
起始地址:
190
分区大小:
100KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
290
分区大小:
350KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
1
请输入作业(分区号):
4
请输入需要分配的主存大小(单位:
KB):
200
分配成功!
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
1
起始地址:
0
分区大小:
130KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
130
分区大小:
60KB
状态:
空闲
——————————————
分区号:
3
起始地址:
190
分区大小:
100KB
状态:
已分配
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
2
请输入您要释放的分区号:
3
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
1
起始地址:
0
分区大小:
130KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
130
分区大小:
160KB
状态:
空闲
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
2
请输入您要释放的分区号:
1
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
Free
起始地址:
0
分区大小:
290KB
状态:
空闲
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
1
请输入作业(分区号):
5
请输入需要分配的主存大小(单位:
KB):
140
分配成功!
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
5
起始地址:
0
分区大小:
140KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
140
分区大小:
150KB
状态:
空闲
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
1
请输入作业(分区号):
6
请输入需要分配的主存大小(单位:
KB):
60
分配成功!
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
5
起始地址:
0
分区大小:
140KB
状态:
已分配
——————————————
分区号:
6
起始地址:
140
分区大小:
60KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
200
分区大小:
90KB
状态:
空闲
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
1
请输入作业(分区号):
7
请输入需要分配的主存大小(单位:
KB):
50
分配成功!
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
5
起始地址:
0
分区大小:
140KB
状态:
已分配
——————————————
分区号:
6
起始地址:
140
分区大小:
60KB
状态:
已分配
——————————————
分区号:
7
起始地址:
200
分区大小:
50KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
250
分区大小:
40KB
状态:
空闲
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
2
请输入您要释放的分区号:
6
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
3
+++++++++++++++++++++++++++++++++++++++
+++主存分配情况+++
+++++++++++++++++++++++++++++++++++++++
分区号:
5
起始地址:
0
分区大小:
140KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
140
分区大小:
60KB
状态:
空闲
——————————————
分区号:
7
起始地址:
200
分区大小:
50KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
250
分区大小:
40KB
状态:
空闲
——————————————
分区号:
4
起始地址:
290
分区大小:
200KB
状态:
已分配
——————————————
分区号:
Free
起始地址:
490
分区大小:
150KB
状态:
空闲
——————————————
********************************************
**1:
分配内存2:
回收内存**
**3:
查看分配0:
退出**
********************************************
请输入您的操作:
0
Pressanykeytocontinue
【首次适应算法】
1.作业1申请130KB。
作业2申请60KB。
作业3申请100KB。
具体分配情况如下:
2.作业2释放60KB。
3.作业4申请200KB。
4.作业3释放100KB。
5.作业1释放130KB。
6.作业5申请140KB。
作业6申请60KB。
作业7申请50KB。
7.作业6释放60KB。
【最佳适应算法】
1.作业1申请130KB。
作业2申请60KB。
作业3申请100KB。
2.作业2释放60KB。
作业4申请200KB。
3.作业3释放100KB。
4.作业1释放130KB。
5.作业5申请140KB。
作业6申请60KB。
作业7申请50KB。
6.作业6释放60KB。
【代码实现】
//***************************************************************
//********动态分区分配方式的模拟*********
//********制作者:
马江涛*********
//********学号:
8000612091*********
//********班级:
计算机软件121班*********
//***************************************************************
#include
#include
#defineFree0//空闲状态
#defineBusy1//已用状态
#defineOK1//完成
#defineERROR0//出错
#defineMAX_length640//最大内存空间为640KB
typedefintStatus;
typedefstructfreearea//定义一个空闲区说明表结构
{
intID;//分区号
longsize;//分区大小
longaddress;//分区地址
intstate;//状态
}ElemType;
//----------线性表的双向链表存储结构------------
typedefstructDuLNode//doublelinkedlist
{
ElemTypedata;
structDuLNode*prior;//前趋指针
structDuLNode*next;//后继指针
}DuLNode,*DuLinkList;
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;
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;
returnOK;
}
//-----------------------分配主存-------------------------
Statusalloc(intch)
{
intID,request;
cout<<"请输入作业(分区号):
";
cin>>ID;
cout<<"请输入需要分配的主存大小(单位:
KB):
";
cin>>request;
if(request<0||request==0)
{
cout<<"分配大小不合适,请重试!
"< returnERROR; } if(ch==2)//选择最佳适应算法 { if(Best_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } else//默认首次适应算法 { if(First_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } } //------------------首次适应算法----------------------- StatusFirst_fit(intID,intrequest)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; DuLNode*p=block_first->next; while(p) { if(p->data.state==Free&&p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; returnOK; break; } if(p->data.state==Free&&p->data.size
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 动态 分区 分配 算法