内存分配-首次适应算法

内存分配-首次适应算法
内存分配-首次适应算法

一、实验名称:内存分配与回收

二、实验内容:用首次适应算法实现存储空间的分配,回收作业所占用的存储空间。

三、实验目的:

一个好的计算机系统不仅要有足够的存储容量,较高的存取速度和稳定可靠的存储器,而且能够合理的分配和使用这些主存空间。当用户提出申请主存空间的要求时,存储管理能够按照一定的策略分析主存的使用情况,找出足够的空间分配给申请者;当作业运行完毕,存储管理要回收作业占用的主存空间。本实验实现在可变分区存储管理方式下,采用最先适应算法对主存空间进行分配和回收,以加深了解操作系统的存储管理功能。

四、实验过程:

a)基本思想

空闲分区链以地址递增的次序连接。在分配内存时,从链首开始顺序查找,直至找到一个大小能够满足要求的空闲分区为止;然后再按照作

业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区

仍然留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分

区,则此次内存分配失败。

b)主要数据结构

typedef struct FreeLink{ //空闲链

struct FreeLink *prior;

char name;

int start;

int size;

bool flag;

struct FreeLink *next;

}* ptr,*head;

head top;

ptr p;

c)内存分配算法

当有进程要求分配主存时,依据首次适应算法从链头开始,延链查找一个足以容纳该进程的空闲区。若这个分区比较大,则一分为二,一部分分配给进程,另一部分作为空闲区仍留在链中的当前位置,修改它的上一个空闲区的前向指针值为再加上分配给进程的分区大小,下一个空闲区的后向指针值为再加上分配给进程的分区大小,使链保持完整。若这个分区的大小正好等于进程的大小,该分

区全部分配给进程,并将该空闲区从链中摘除(即修改下一个空闲区的后向指针=该空闲区后向指针,上一个空闲区的前向指针=该空闲区的前向指针)。再在已分配区表中找一个空表目,登记刚刚分配的内存始址、长度和进程号。

d)内存的回收

当进程运行完成,释放内存时,通过输入进程号,来回收进程占用的分区。在回收时,释放区与空闲区相邻接的情况要考虑4种情况:

⊙释放区下邻空闲区

⊙释放区上邻空闲区

⊙释放区与上下空闲区均相邻

⊙释放区与上下空闲区均不相邻

e)程序流程图

※空闲链的首次适应算法分配流程图

※空闲链的首次适应算法回收流程图

f)截屏

五、源代码

#include

#include

#include

using namespace std;

typedef struct FreeLink{//定义空闲链

struct FreeLink *prior;

char name;

int start;

int size;

bool flag;

struct FreeLink *next;

}* ptr,*head;

head top;

ptr p;

void print(){//将内存分配情况打印到屏幕上

p=top;

cout<<"************************内存分配情况表************************"<

cout<<"区号\t\t"<<"起始位置\t"<<"区间长度\t"<<"区间状态\t"<

do{

cout<name<<"\t\t"<start<<"\t\t"<size<<"\t\t";

if(p->flag==false)//flag为false,表明该分区空闲

{

cout<<"空闲"<

}

else

{

cout<<"已占用"<

}

p=p->next;

}

while(p!=NULL);

}

void clear(){//结束操作时清空“内存”以备其他操作

do{

p=top;

top=top->next;

free(p);

}

while(top!=NULL);

cout<<"内存已清空!";

}

void hebing(ptr &p){//若被操作的内存有相邻空闲区则将空闲区拼接合并

int x;

if(p->prior->flag==false&&p->next->flag==false)x=1; //释放区与上下空闲区均相邻if((p->prior->flag==false&&p->next->flag==true)||(p->prior->flag==false&&p->next==N ULL))x=2;//释放区下邻空闲区

if((p->prior->flag==true&&p->next->flag==false)||(p->prior==NULL&&p->next->flag==fa lse))x=3;//释放区上邻空闲区

if((p->prior->flag==true&&p->next->flag==true)||(p->prior==NULL&&p->next->flag==tru e)||(p->prior->flag==true&&p->next==NULL))x=4;//释放区与上下空闲区均不相邻

switch(x){

case 1:p->next->prior=p->prior;

p->prior->next=p->next;

p->prior->size=p->prior->size+p->size+p->next->size;

p->prior->next=p->next->next;

if(p->next->next!=NULL)

p->next->next->prior=p->next->prior;

free(p->next);//释放

free(p);

break;

case 2:if(p->next==NULL)//p为最后一个分区

{

p->prior->next=p->next;

}

else{

p->next->prior=p->prior;

p->prior->next=p->next;

}

p->prior->size=p->prior->size+p->size;

free(p);

break;

case 3:if(p->prior==NULL)//p为第一个分区

{

top=p->next;

p->next->prior=NULL;

p->next->start=p->start;

p->next->size=p->next->size+p->size;

}

else{

p->next->prior=p->prior;

p->prior->next=p->next;

p->next->start=p->start;

p->next->size=p->next->size+p->size;

}

free(p);

break;

case 4:p->name='*';//将释放区移至链首并标记为未被占用 p->flag=false;

break;

}

}

void allocate(ptr &p){//最先适应法的内存分配函数FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink));

cout<<"请输入要分配内存的进程号:";

cin>>fl->name;

cout<<"请输入要分配内存的大小:";

cin>>fl->size;

fl->flag=true;

do{

if(p->flag==false&&p->size>fl->size){

fl->start=p->start;

相关主题
相关文档
最新文档