1、实验目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
2、实验内容
(1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
•作业1申请130KB。
•作业2申请60KB。
•作业3申请100KB。
•作业2释放60KB。
•作业4申请200KB。
•作业3释放100KB。
•作业1释放130KB。
•作业5申请140KB。
•作业6申请60KB。
•作业7申请50KB。
•作业6释放60KB。
请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。
3.代码实现
双链表(结构体对象中含有前后指针)实现。经过摸索发现结构体对象内部各属性需要赋初值,否则会出现内存错误(我用的DEV,个人觉得比较小巧好用,就是调试刚开始需要设置一下,具体设置参考https://zhidao.baidu.com/question/2269562446026108668.html?entry=qb_uhome_tag)
这是我参考的百度文库的一篇代码,进行了小小改动(释放了无用的已分配的内存,更美观地格式化输出),原文链接附上https://wenku.baidu.com/view/5ea068ff910ef12d2af9e721
#include<iostream>
#include<cstdlib>
#define Free 0
#define Busy 1
#define OK 1
#define ERROR 0
#define MAX_length 640
using namespace std;
typedef int Status;
struct ElemType
{
int ID=-1;
int size=-1;
int address=-1;
int state=-1;
};
typedef struct DulNode
{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}*DuLinkList;
DuLinkList block_first=NULL;
DuLinkList block_last=NULL;
Status alloc(int);
Status recycle(int);
Status First_fit(int,int);
Status Best_fit(int,int);
void show();
Status Initblock();
int main()
{
int ch;
cout<<"*******************动态分区分配的模拟***************"<<endl;
cout<<"1.首次适应算法 2.最佳适应算法"<<endl;
cout<<"****************************************************"<<endl;
cout<<"请选择分配算法:";
cin>>ch;
Initblock();
int choice;
while(1)
{
cout<<"************************************************"<<endl;
cout<<"1.分配内存 2.回收内存 0.退出 "<<endl;
cout<<"************************************************"<<endl;
cout<<"请输入操作:";
cin>>choice;
if(choice==1)
{
alloc(ch);
show();
}
else if(choice==2)
{
int ID;
cout<<"请输入释放的分区号:";
cin>>ID;
recycle(ID);
show();
}
else if(choice==0)
{
break;
}
else cout<<"输入有误,请重试!"<<endl;
}
return 0;
}
Status Initblock()
{
block_first=new DulNode;
block_last=new DulNode;
block_first->prior=NULL;
block_first->next=block_last;
block_last->prior=block_first;
block_last->next=NULL;
block_last->data.ID=0;
block_last->data.address=0;
block_last->data.size=MAX_length;
block_last->data.state=Free;
return 0;
}
Status alloc(int ch)
{
int ID,request;
cout<<"请输入作业(分区号):";
cin>>ID;
cout<<"请输入需要分配的主存大小(单位 kb):";
cin>>request;
if(request<=0)
{
cout<<"分配失败,请重试!"<<endl;
return ERROR;
}
if(ch==2)
{
if(Best_fit(ID,request)==OK) cout<<"内存分配成功!"<<endl;
else cout<<"内存不足,分配失败!"<<endl;
return OK;
}
else
{
if(First_fit(ID,request)==OK) cout<<"内存分配成功!"<<endl;
else cout<<"内存不足,分配失败!"<<endl;
return OK;
}
}
Status First_fit(int ID,int request)
{
DulNode *temp=NULL;
temp= new DulNode;
temp->data.ID=ID;
temp->data.size=request;
temp->data.state=Busy;
DulNode *p=block_first->next;
while(p)
{
if(p->data.state==Free && p->data.size>=request)
{
temp->prior=p->prior;
temp->next=p;
temp->data.address=p->data.address;
p->prior->next=temp;
p->prior=temp;
p->data.address=temp->data.address+temp->data.size;
p->data.size-=request;
return OK;
}
p=p->next;
}
return ERROR;
}
Status Best_fit(int ID,int request)
{
int ch;
DulNode *temp=NULL;
temp= new DulNode;
temp->data.ID=ID;
temp->data.size=request;
temp->data.state=Busy;
DulNode *p=block_first->next;
DulNode *q=NULL;
while(p)
{
if(p->data.state==Free && p->data.size>=request)
{
q=p;
ch=p->data.size-request;
break;
}
p=p->next;
}
while(p)
{
if((p->data.state==Free) && (p->data.size>=request))
{
if(p->data.size-request<ch)
{
ch=p->data.size-request;
q=p;
break;
}
}
p=p->next;
}
if(q==NULL)
{
return ERROR;
}
else
{
temp->prior=q->prior;
temp->next=q;
temp->data.address=q->data.address;
q->prior->next=temp;
q->prior=temp;
q->data.address+=request;
q->data.size=ch;
return OK;
}
}
Status recycle(int ID)
{
DulNode *p = block_first->next;
DulNode *q = NULL;
while(p)
{
if(p->data.ID==ID)
{
q=p;
p->data.state=Free;
p->data.ID=Free;
if((p->prior->data.state==Free)&&(p->next->data.state==Free))
{
p->prior->data.size+=(p->data.size+p->next->data.size);
p->next->next->prior=p->prior;
p->prior->next=p->next->next;
delete p;
delete p->next;
}
else
{
if(p->prior->data.state==Free)
{
p->prior->data.size+=p->data.size;
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
}
else if(p->next->data.state==Free)
{
q=p->next;
p->data.size+=p->next->data.size;
p->next->next->prior=p;
p->next=p->next->next;
delete q;
}
}
break;
}
p=p->next;
}
return OK;
}
void show()
{
cout<<"***********主存分配情况***********"<<endl;
DulNode *p=block_first->next;
cout<<"分区号\t起始地址\t分区大小(kb)\t状态"<<endl;
while(p)
{
if(p->data.ID==Free) cout<<"Free\t";
else cout<<p->data.ID<<'\t';
cout<<p->data.address<<'\t'<<'\t';
cout<<p->data.size<<'\t'<<'\t';
if(p->data.state==Free) cout<<"空闲"<<endl;
else cout<<"已分配"<<endl;
p=p->next;
}
}
4.原文