动态分配内存管理源代码及讲解Word格式.docx
- 文档编号:16033555
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:8
- 大小:17.64KB
动态分配内存管理源代码及讲解Word格式.docx
《动态分配内存管理源代码及讲解Word格式.docx》由会员分享,可在线阅读,更多相关《动态分配内存管理源代码及讲解Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
内存的回收:
在动态分区方式下回收内存空间时,先检查是否有与归还区相邻的空闲区(上邻空闲区,下邻空闲区)。
若有,则将它们合件成一个空闲区。
程序实现时,首先将要释放的作业在“内存分配表”中的记录项的标志改为“0”(空栏目),然后检查“空闲区表”中标志为‘1’(未分配)的栏目,查找是否有相邻的空闲区,若有,将之合并,并修改空闲区的起始地址和长度。
四、数据结构定义
(1)已分配表的定义:
struct
{floataddress;
//已分分区起始地址
floatlength;
//已分分区长度,单位为字节
intflag;
//已分配区表登记栏标志,"
0"
表示空栏目,实验中只支持一个字符的作业名
}used_table[n];
//已分配区表
(2)空闲分区表的定义:
//空闲区起始地址
//空闲区长度,单位为字节
//空闲区表登记栏标志,用"
表示空栏目,用"
1"
表示未分配}free_table[m];
//空闲区表
(3)全局变量
floatminsize=5;
#definen10//假定系统允许的最大作业数量为n
#definem10//假定系统允许的空闲区表最大为m
五、源程序代码
#include<
iostream.h>
iomanip.h>
//全局变量
intcount1=0;
intcount2=0;
#defineM10//假定系统允许的空闲区表最大为m
#defineN10//假定系统允许的最大作业数量为n
//已分配表的定义
//已分分区起始地址floatlength;
表示空栏目
}used_table[N];
//已分配区表对象名
//空闲区表的定义:
表示未分配}free_table[M];
//空闲区表对象名
//函数声明
voidinitialize(void);
intdistribute(int,float);
intrecycle(int);
voidshow();
//初始化两个表
voidinitialize(void){inta;
for(a=0;
a<
=N-1;
a++)
used_table[a].flag=0;
//已分配表的表项全部置为空表项
free_table[0].address=1000;
free_table[0].length=1024;
free_table[0].flag=1;
//空闲区表的表项全部为未分配}//最优分配算法实现的动态分区
intdistribute(intprocess_name,floatneed_length){inti,k=-1;
//k用于定位在空闲表中选择的未分配栏
floatads,len;
intcount=0;
i=0;
while(i<
=M-1)//循环找到最佳的空闲分区{if(free_table[i].flag==1&
&
need_length<
=free_table[i].length){
count++;
if(count==1||free_table[i].length<
free_table[k].length)
k=i;
}i=i+1;
}if(k!
=-1){if((free_table[k].length-need_length)<
=minsize)//整个分配{free_table[k].flag=0;
ads=free_table[k].address;
len=free_table[k].length;
}else
{//切割空闲区
len=need_length;
free_table[k].address+=need_length;
free_table[k].length-=need_length;
}i=0;
//循环寻找内存分配表中标志为空栏目的项
while(used_table[i].flag!
=0)
{i=i+1;
}
if(i<
=N-1)//找到,在已分配区表中登记一个表项{used_table[i].address=ads;
used_table[i].length=len;
used_table[i].flag=process_name;
count1++;
}else//已分配区表长度不足{if(free_table[k].flag==0)//将已做的整个分配撤销{free_table[k].flag=1;
free_table[k].address=ads;
free_table[k].length=len;
}else//将已做的切割分配撤销{free_table[k].address=ads;
free_table[k].length+=len;
}cout<
<
"
内存分配区已满,分配失败!
\n"
;
return0;
}}
else{cout<
无法为该作业找到合适分区!
}returnprocess_name;
}intrecycle(intprocess_name){inty=0;
floatrecycle_address,recycle_length;
inti,j,k;
//j栏是下邻空闲区,k栏是上栏空闲区
intx;
//在内存分配表中找到要回收的作业
while(y<
=N-1&
used_table[y].flag!
=process_name)
{y=y+1;
if(y<
=N-1)//找到作业后,将该栏的标志置为'
0'
{recycle_address=used_table[y].address;
recycle_length=used_table[y].length;
used_table[y].flag=0;
count2++;
}else//未能找到作业,回收失败{cout<
该作业不存在!
}j=k=-1;
while(!
(i>
=M||(k!
=-1&
j!
=-1)))//修改空闲分区表{if(free_table[i].flag==1){if((free_table[i].address+free_table[i].length)==recycle_address)
//判断是否有上邻接
if((recycle_address+recycle_length)==free_table[i].address)}j=i;
//判断是否有下邻接}i=i+1;
//合并空闲区
if(k!
=-1)//回收区有上邻接{if(j!
=-1){//回收区也有下邻接,和上下邻接合并
free_table[k].length+=free_table[j].length+recycle_length;
free_table[j].flag=0;
//将第j栏的标记置为'
}else//不存在下邻接,和上邻接合并
free_table[k].length+=recycle_length;
}elseif(j!
=-1)
{//只有下邻接,和下邻接合并
free_table[j].length+=recycle_length;
free_table[j].address=recycle_address;
{//上下邻接都没有
x=0;
while(free_table[x].flag!
x=x+1;
//在空闲区表中查找一个状态为'
的栏目
if(x<
=M-1)
{//找到后,在空闲分区中登记回收的内存
free_table[x].address=recycle_address;
free_table[x].length=recycle_length;
free_table[x].flag=1;
{//空闲表已满,执行回收失败
used_table[y].flag=process_name;
cout<
空闲区已满,回收失败!
returnprocess_name;
}voidshow()//程序执行时输出模拟的内存分配回收表{cout<
+++++++++++++++++++++++++++++++++++++++\n"
+++++++空闲区+++++++\n"
for(inti=0;
i<
=count2;
i++)
if(free_table[i].flag!
初始地址:
free_table[i].address<
长度:
free_table[i].length<
状态:
free_table[i].flag<
endl;
+++++++已分配区++++++\n"
++++
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态分配 内存 管理 源代码 讲解