
#include<iostream> |
#include<stdlib.h> |
|
using namespace std; |
|
#define Free 0 //空闲状态 |
#define Busy 1 //已用状态 |
#define OK 1 //完成 |
#define ERROR 0 //出错 |
#define MAX_length 640 //最大内存空间为640KB |
typedef int Status; |
int flag; |
|
typedef struct freearea//定义一个空闲区说明表结构 |
{ |
long size; //分区大小 |
long address; //分区地址 |
int state; //状态 |
}ElemType; |
|
// 线性表的双向链表存储结构 |
typedef struct DuLNode |
{ |
ElemType data; |
struct DuLNode *prior; //前趋指针 |
struct DuLNode *next; //后继指针 |
} |
|
DuLNode,*DuLinkList; |
DuLinkList block_first; //头结点 |
DuLinkList block_last; //尾结点 |
Status alloc(int);//内存分配 |
Status free(int); //内存回收 |
Status First_fit(int);//首次适应算法 |
Status Best_fit(int); //最佳适应算法 |
Status Worst_fit(int); //最差适应算法 |
void show();//查看分配 |
Status Initblock();//开创空间表 |
|
Status Initblock()//开创带头结点的内存空间链表 |
{ |
block_first=(DuLinkList)malloc(sizeof(DuLNode)); |
block_last=(DuLinkList)malloc(sizeof(DuLNode)); |
block_first->prior=NULL; |
block_first->next=block_last; |
block_last->prior=block_first; |
block_last->next=NULL; |
block_last->data.address=0; |
block_last->data.size=MAX_length; |
block_last->data.state=Free; |
return OK; |
} |
|
//分配主存 |
Status alloc(int ch) |
{ |
int request = 0; |
cout<<"请输入需要分配的主存大小(单位:KB):"; |
cin>>request; |
if(request<0 ||request==0) |
{ |
cout<<"分配大小不合适,请重试!"<<endl; |
return ERROR; |
} |
|
if(ch==2) //选择最佳适应算法 |
{ |
if(Best_fit(request)==OK) cout<<"分配成功!"<<endl; |
else cout<<"内存不足,分配失败!"<<endl; |
return OK; |
} |
if(ch==3) //选择最差适应算法 |
{ |
if(Worst_fit(request)==OK) cout<<"分配成功!"<<endl; |
else cout<<"内存不足,分配失败!"<<endl; |
return OK; |
} |
else //默认首次适应算法 |
{ |
if(First_fit(request)==OK) cout<<"分配成功!"<<endl; |
else cout<<"内存不足,分配失败!"<<endl; |
return OK; |
} |
} |
|
//首次适应算法 |
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; |
return OK; |
break; |
} |
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; |
break; |
} |
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; |
ch=p->data.size-request; |
} |
else if(q->data.size > p->data.size) |
{ |
q=p; |
ch=p->data.size-request; |
} |
} |
p=p->next; |
} |
|
if(q==NULL) return ERROR;//没有找到空闲块 |
else if(q->data.size==request) |
{ |
q->data.state=Busy; |
return OK; |
} |
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; |
} |
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; |
ch=p->data.size-request; |
} |
else if(q->data.size < p->data.size) |
{ |
q=p; |
ch=p->data.size-request; |
} |
} |
p=p->next; |
} |
|
if(q==NULL) return ERROR;//没有找到空闲块 |
else if(q->data.size==request) |
{ |
q->data.state=Busy; |
return OK; |
} |
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; |
} |
return OK; |
} |
|
//主存回收 |
Status free(int flag) |
{ |
DuLNode *p=block_first; |
for(int i= 0; i <= flag; i++) |
if(p!=NULL) |
p=p->next; |
else |
return ERROR; |
|
p->data.state=Free; |
if(p->prior!=block_first && p->prior->data.state==Free)//与前面的空闲块相连 |
{ |
p->prior->data.size+=p->data.size; |
p->prior->next=p->next; |
p->next->prior=p->prior; |
p=p->prior; |
} |
if(p->next!=block_last && p->next->data.state==Free)//与后面的空闲块相连 |
{ |
p->data.size+=p->next->data.size; |
p->next->next->prior=p; |
p->next=p->next->next; |
} |
if(p->next==block_last && p->next->data.state==Free)//与最后的空闲块相连 |
{ |
p->data.size+=p->next->data.size; |
p->next=NULL; |
} |
|
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<<"已分配\n\n"; |
p=p->next; |
} |
cout<<"++++++++++++++++++++++++++++++++++++++++++++++\n\n"; |
} |
|
//主函数 |
int main() |
{ |
int ch;//算法选择标记 |
cout<<"请输入所使用的内存分配算法:\n"; |
cout<<"(1)首次适应算法\n(2)最佳适应算法\n(3)最差适应算法\n"; |
|
cin>>ch; |
while(ch<1||ch>3) |
{ |
cout<<"输入错误,请重新输入所使用的内存分配算法:\n"; |
cin>>ch; |
} |
|
Initblock(); //开创空间表 |
int choice; //操作选择标记 |
|
while(1) |
{ |
show(); |
cout<<"请输入您的操作:"; |
cout<<"\n1: 分配内存\n2: 回收内存\n0: 退出\n"; |
|
cin>>choice; |
if(choice==1) alloc(ch); // 分配内存 |
else if(choice==2) // 内存回收 |
{ |
int flag; |
cout<<"请输入您要释放的分区号:"; |
cin>>flag; |
free(flag); |
} |
else if(choice==0) break; //退出 |
else //输入操作有误 |
{ |
cout<<"输入有误,请重试!"<<endl; |
continue; |
} |
} |
} |



