实验代码
//********动态分区分配方式的模拟一首次适应算法 ********* #include
#define Free 0 //空闲状态 #define Busy 1 //已用状态 #define OK 1 //完成 #define ERROR 0 //出错
#define MAX_length 640 //最大内存空间为640KB typedef int Status;
typedef struct freearea//定义一个空闲区说明表结构 { int ID; long size; long address; int state; }ElemType;
typedef struct DuLNode //double linked list { ElemType data;
struct DuLNode *prior; //前趋指针 struct DuLNode *next; //后继指针 }DuLNode,*DuLinkList;
DuLinkList block_first; //头结点 DuLinkList block_last; //尾结点 Status alloc();//内存分配 Status free(int); //内存回收
Status First_fit(int,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;
15
block_last->data.ID=0;
block_last->data.state=Free; return OK; }
//----------------------- 分 配 主 存 ------------------------- Status alloc() { int ID,request; cout<<\请输入作业(分区号):\ cin>>ID;
cout<<\请输入需要分配的主存大小(单位:KB):\ cin>>request;
if(request<0 ||request==0) { cout<<\分配大小不合适,请重试!\ return ERROR; } if(First_fit(ID,request)==OK) cout<<\分配成功!\ else cout<<\内存不足,分配失败!\}
//------------------ 首次适应算法 ----------------------- Status First_fit(int ID,int request)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkList temp=(DuLinkList)malloc(sizeof(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) { //有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; return OK; break; } if(p->data.state==Free && p->data.size>request) {
16
//有空闲块能满足需求且有剩余 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 free(int ID) { DuLNode *p=block_first; while(p) { if(p->data.ID==ID) { p->data.state=Free; p->data.ID=Free; if(p->prior->data.state==Free)//与前面的空闲块相连 { p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior; } if(p->next->data.state==Free)//与后面的空闲块相连 { p->data.size+=p->next->data.size;if(p->next->next==NULL)p->next=NULL;else{ p->next->next->prior=p; p->next=p->next->next;} } break; } p=p->next; } cout<<\分区:\回收成功\ return OK;
17
// }
//--------------- 显示主存分配情况 ------------------ void show() { cout<<\ cout<<\ 主 存 分 配 情 况 ++++++\\n\ cout<<\ DuLNode *p=block_first->next; while(p) { cout<<\分 区 号:\ if(p->data.ID==Free) cout<<\ else cout<
//----------------------- 主 函 数--------------------------- void main() { Initblock(); int choice; int i; for(i=0;;i++) { cout<<\ cout<<\动态分区分配方式的模拟一+++++++++++++++++\\n\ cout<<\首次适应算法++++++++++++++++++++++++\\n\ cout<<\ ++++++++++++++++++++++++++++++++++++++++++++\\n\ cout<<\ ++ 1: 分配内存 2: 回收内存 ++\\n\ cout<<\ ++ 3: 查看分配 0: 退 出 ++\\n\ cout<<\ ++++++++++++++++++++++++++++++++++++++++++++\\n\ cout<<\请输入您的操作 :\ cin>>choice; if(choice==1)// 分配内存
18
}
alloc(); else if(choice==2)// 内存回收 { int ID;
cout<<\请输入您要释放的分区号:\ cin>>ID; free(ID); } else if(choice==3)//显示主存 show(); else if(choice==0)//退出 break; else //输入操作有误 { cout<<\输入有误,请重试!\ continue; } }
19