使用动态分区分配方式的模拟
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。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次 分配和回收后显示出空闲分区链的情况。
#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;
int size;
int address;
int state;
};
typedef struct DulNode{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}*DuLinkList;
DuLinkList block_first=NULL;
DuLinkList block_last=NULL;
Status alloc(int);//内存分配函数
Status free(int);// 内存回收函数
Status First_fit(int,int);//首次适应——地址从小到大
Status Best_fit(int,int);// 最佳适应——空闲区从小到大排列
void show();//查看分配
Status Initblock();//开创带头节点的内存空间链表
int main(){
int ch;
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;
free(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 free(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;
}
}