动态内存分配

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档