动态内存分配
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态内存分配
一、实验目的
动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了四种分配算法,分别是1.首次适应算法,2.循环首次适应算法,3.最坏适应算法4.最佳适应算法。
二、实验要求及功能介绍
1.实验要求
1.在实现关于内存管理的内存首选适应算法和最佳适用算法。
2.实现关于内存管理的内存动态分区分配布局初始化。
3.实现关于内存管理的内存动态分区分配申请分配。
4.实现关于内存管理的内存回收等基本功能操作函数。
2.功能介绍
(1)首次适应算法
在首次适应算法中,是从已建立好的数组中顺序查找,直至找到第一个大小能满足要求的空闲分区为止,然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空间令开辟一块新的地址,大小为原来的大小减去作业大小,若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。
(2)循环首次适应算法
该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N==0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。
(3)最坏适应算法
最坏适应分配算法是每次为作业分配内存时,扫描整个数组,总是把能满足条件的,又是最大的空闲分区分配给作业。
(4)最佳适应算法
最坏适应分配算法是每次为作业分配内存时,扫描整个数组,总是把能满足条件的,又是最小的空闲分区分配给作业。
三、实验流程图
四、实验主要代码
typedef struct freeNode //空闲区链表结点{
int address; //开始地址
int size; //分区大小
freeNode *next; //指向下一个分区}*freetable;
typedef struct workNode //作业区链表结点
{
char proname[20]; //作业名
int address; //开始地址
int size; //作业大小
struct workNode *next; //指向下一个作业
}*worktable;
void workdiaodu(freetable freehead,worktable workhead,freetable p,freetable q,char proname[20],int size) //进行作业内存的分配
{
worktable newwork = new workNode;
strcpy(newwork->proname,proname); //作业名
newwork->size = size; //作业大小
newwork->address = p->address; //起始地址
newwork->next = NULL;
//情况3:当作业大小<分区大小时
if(p->size > newwork->size)
{
p->address = p->address + newwork->size; //作业大小作为此分区的起始地址
p->size = p->size - newwork->size; //分区大小为原分区大小-作业大小
}
//情况2:当作业大小=分区大小时
else if(p->size == newwork->size)
{
q->next = p->next;
delete p; //删除此分区
}
//以下把新作业加入到作业区链表中
worktable r = workhead->next;
worktable w = workhead;
while(r != NULL && r->address < newwork->address) //在作业区中进行查找新作业的内存位置
{
w = r;
r = r->next;
}
if(r == NULL) //在作业区链尾
{
w->next = newwork; //添加到链尾
}
else //添加到链中任意位置
{
newwork->next = r;
w->next = newwork;
}
cout<<"\n\n\t\t\t\t分配成功"<<"\n";
}
/*首次适应算法的原理*/
void FFRequestMemory(freetable freehead,worktable workhead,char proname[20],int size)
{
if(freehead->next == NULL)
{
cout<<"\n\n\t\t\t分配失败,当前已无空闲区"<<"\n";
return;
}
freetable p = freehead->next;
freetable q = freehead;
while(p != NULL && p->size < size) //进行从低地址分区开始搜索符合作业大小的内存分区
{
q = p;
p = p->next;
}
if(p == NULL)
{
cout<<"\n\n\t\t\t分配失败,当前已无足够内存分配"<<"\n";
return;
}
workdiaodu(freehead,workhead,p,q,proname,size);
}
void deletebackup(freetable &backuphead) //删除临时链表,释放内存{
freetable p = backuphead->next;
freetable q;