实验目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
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。
请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。
//首次适应算法
Status First_fit(int request)
{
//为申请作业开辟新空间且初始化
DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
temp->data.size=request;
temp->data.state=Busy;
DuLNode *p=block_first->next;
while(p)
{
if(p->data.state==Free && p->data.size==request)
{//有大小恰好合适的空闲块
//待补全
p->data.state = Busy;
p->data.number = number;//显示作业号
return OK;
}
if(p->data.state==Free && p->data.size>request)
{//有空闲块能满足需求且有剩余
//待补全
p->data.size = p->data.size-temp->data.size;
temp->prior=p->prior;
p->prior=temp;
temp->next = p;
temp->prior->next = temp;
temp->data.address = p->data.address;
p->data.address = temp->data.address+temp->data.size;
temp->data.number = number;//显示作业号
return OK;
}
p=p->next;
}
return ERROR;
}
//最佳适应算法
Status Best_fit(int request)
{
int ch; //记录最小剩余空间
DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
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) )
{
if(q==NULL)
{
//待补全
q = p;
}
else if(q->data.size > p->data.size)
{
//待补全
q = p;
}
}
p=p->next;
}
if(q==NULL) return ERROR;//没有找到空闲块
else if(q->data.size==request)
{
//待补全
q->data.state = Busy;
q->data.number = number;//显示作业号
}
else
{
//待补全
q->data.size = q->data.size - temp->data.size;
temp->prior=q->prior;
q->prior=temp;
temp->next = q;
temp->prior->next = temp;
temp->data.address = q->data.address;
q->data.address = temp->data.address+temp->data.size;
temp->data.number = number;//显示作业号
}
return OK;
}
//最差适应算法
Status Worst_fit(int request)
{
int ch; //记录最大剩余空间
DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
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) )
{
if(q==NULL)
{
//待补全
q = p;
}
else if(q->data.size < p->data.size)
{
//待补全
q = p;
}
}
p=p->next;
}
if(q==NULL) return ERROR;//没有找到空闲块
else if(q->data.size==request)
{
//待补全
q->data.state = Busy;
q->data.number = number;//显示作业号
}
else
{
//待补全
q->data.size = q->data.size - temp->data.size;
temp->prior=q->prior;
q->prior=temp;
temp->next = q;
temp->prior->next = temp;
temp->data.address = q->data.address;
q->data.address = temp->data.address+temp->data.size;
temp->data.number = number;//显示作业号
}
return OK;
}
//显示主存分配情况
void show()
{
int flag = 0;
cout<<"\n主存分配情况:\n";
cout<<"++++++++++++++++++++++++++++++++++++++++++++++\n\n";
DuLNode *p=block_first->next;
cout<<"分区号\t起始地址\t分区大小\t状态\n\n";
while(p)
{
cout<<" "<<flag++<<"\t";
cout<<" "<<p->data.address<<"\t\t";
cout<<" "<<p->data.size<<"KB\t\t";
if(p->data.state==Free) cout<<"空闲\n\n";
else cout<<p->data.number<<"已分配\n\n";
p=p->next;
}
cout<<"++++++++++++++++++++++++++++++++++++++++++++++\n\n";
首次适应算法
最佳适应算法