内存分配算法模拟文档格式.docx
- 文档编号:20082173
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:19
- 大小:264.39KB
内存分配算法模拟文档格式.docx
《内存分配算法模拟文档格式.docx》由会员分享,可在线阅读,更多相关《内存分配算法模拟文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
typedefstructfreeSpace//定义一个空闲区说明表结构
{
longsize;
//分区大小
longaddress;
//分区地址
intstate;
//状态
}ElemType;
//线性表的双向链表存储结构
typedefstructDuLNode
ElemTypedata;
structDuLNode*prior;
//前趋指针
structDuLNode*next;
//后继指针
}
DuLNode,*DuLinkList;
DuLinkListhead_Node;
//头结点
DuLinkListend_Node;
//尾结点
intalloc(int);
//内存分配
intfree(int);
//内存回收
intFirst_fit(int);
//首次适应算法
intBest_fit(int);
//最佳适应算法
intWorst_fit(int);
//最差适应算法
voidshow();
//查看分配
intInitblock();
//开创空间表
intInitblock()//开创带头结点的内存空间链表
head_Node=(DuLinkList)malloc(sizeof(DuLNode));
end_Node=(DuLinkList)malloc(sizeof(DuLNode));
head_Node->
prior=NULL;
//头结点的前驱指针指向空
next=end_Node;
//头结点的后继指针指向尾结点
end_Node->
prior=head_Node;
//尾结点的前驱指针指向头结点
next=NULL;
//尾结点的后继指针指向空
data.address=0;
//尾结点的地址是0
data.size=MAX_length;
//分区大小是最大分区
data.state=Free;
//状态是空
returnOK;
voidmain()
intch;
//算法选择标记
cout<
<
"
****存储管理算法模拟****\n"
;
请输入所使用的内存分配算法:
\n"
(1)首次适应算法\n
(2)最佳适应算法\n(3)最差适应算法\n"
cin>
>
ch;
while(ch<
1||ch>
3)
{
cout<
输入错误,请重新输入所使用的内存分配算法:
cin>
}
Initblock();
//开创空间表
intchoice;
//操作选择标记
while
(1)
show();
请输入您的操作:
\n1:
分配内存\n2:
回收内存\n0:
退出\n"
choice;
if(choice==1)
alloc(ch);
//分配内存
elseif(choice==2)//内存回收
intflag;
请输入您要释放的分区号:
flag;
free(flag);
elseif(choice==0)
break;
//退出
else//输入操作有误
输入有误,请重试!
endl;
continue;
//分配主存
intalloc(intch)
intneed=0;
请输入需要分配的主存大小(单位:
KB):
need;
if(need<
0||need==0)
请重新输入分配大小!
returnERROR;
if(ch==2)//选择最佳适应算法
if(Best_fit(need)==OK)
cout<
分配成功!
else
内存不足,分配失败!
if(ch==3)//选择最差适应算法
if(Worst_fit(need)==OK)
else//默认首次适应算法
if(First_fit(need)==OK)
//首次适应算法
intFirst_fit(intneed)
{
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
//为申请作业开辟新空间且初始化
temp->
data.size=need;
data.state=Busy;
DuLNode*p=head_Node->
next;
while(p)
if(p->
data.state==Free&
&
p->
data.size==need)//现有的空闲块正好等于需要的空间大小
{
break;
data.size>
need)//现有的空闲块能满足需求且有剩余
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-=need;
p=p->
//最佳适应算法
intBest_fit(intneed)
//记录最小剩余空间
DuLNode*q=NULL;
//记录最佳插入位置
while(p)//初始化最小空间和最佳位置
(p->
=need))
if(q==NULL)
{
q=p;
ch=p->
data.size-need;
}
elseif(q->
data.size>
data.size)
if(q==NULL)returnERROR;
//没有找到空闲块
elseif(q->
data.size==need)
q->
else
prior=q->
next=q;
data.address=q->
data.address+=need;
data.size=ch;
//最差适应算法
intWorst_fit(intneed)
//记录最大剩余空间
while(p)//初始化最大空间和最佳位置
=need))
data.size<
//主存回收
intfree(intflag)
DuLNode*p=head_Node;
for(inti=0;
i<
=flag;
i++)
if(p!
=NULL)
p=p->
else
returnERROR;
prior!
=head_Node&
data.state==Free)//与前面的空闲块相连
data.size+=p->
next=p->
next->
p=p->
next!
=end_Node&
data.state==Free)//与后面的空闲块相连
prior=p;
next==end_Node&
data.state==Free)//与最后的空闲块相连
p->
//显示主存分配情况
voidshow()
intflag=0;
\n主存分配情况:
++++++++++++++++++++++++++++++++++++++++++++++\n\n"
分区号\t起始地址\t分区大小\t状态\n\n"
"
flag++<
\t"
p->
data.address<
\t\t"
data.size<
KB\t\t"
data.state==Free)
空闲\n\n"
已分配\n\n"
实验结果分析:
1.首先适应算法的内存分配情况:
内存分配顺序是:
150KB,85KB,62KB,120KB,15KB,30KB(只有最后结果截图下来的!
)
下面是回收内存的情况:
回收的内存分区号的顺序是:
分区1分区3分区5;
下面是回收了135分区之后的内存的情况。
(说明的是回收分区5之后原来的分区6和现在新回收的分区5和在一起成为新的一个大的空闲内存!
再一次分配内存:
因为这样才可以看出首次适应算法的分配内存的顺序。
分配内存的大小是65KB75KB95KB
再一次分配65KB之后:
分配75KB之后:
分配95KB之后:
(找不到95KB的空闲内存,所以分配失败!
明显看的出来首次适应算法的主要思想是:
当接到内存申请时,查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。
2.最佳适应算法
分配65KB之后:
分配95KB之后
我们能看出最佳适应算法的主要思想是:
当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,将其分割并分配!
3.最差适应算法
分配65KB之后
分配75KB之后
最差适应算法的主要思想是:
当接到内存申请时,查找分区说明表,找到能满足申请要求的最大的空闲区。
我的心得:
我通过本次实验深入了解了这三个算法!
只实现内存分配情况的话,比较简单!
本次试验中我还实现了回收内存的情况!
回收内存要考虑下面几个情况:
(1)回收分区的上邻分区是空闲的,需要将这两个相邻的空闲区合并成一个更大的空闲区,修改空闲区表。
(2)回收分区的下邻分区是空闲的,需要将这两个相邻的空闲区合并成一个更大的空闲区,修改空闲区表。
(3)回收分区的上邻分区和下邻分区是空闲的,需要将这三个相邻的空闲区合并成一个更大的空闲区,修改空闲区表。
(4)回收分区的上邻和下邻分区都不是空闲的,则直接将空闲区记录在空闲区表中!
还加深理解了双向链表的一些操作!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 分配 算法 模拟