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) { }
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->data.state=Busy; p->data.ID=ID; return OK; break;
p->prior=temp;
p->data.address=temp->data.address+temp->data.size; p->data.size-=request;
5
}
}
}
return OK; break;
p=p->next;
return ERROR;
5)主存回收 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;
6
p->next=p->next->next;
}
}
}
} break;
p=p->next;
cout<<”分区号:”< 6)显示主存分配情况 void show() { cout<<\cout<<\主存分配情况 ++++++\\n\ return OK; cout<<\DuLNode *p=block_first->next; while(p) { cout<<\分区号:\if(p->data.ID==Free) cout<<\ else cout< cout<<\起始地址:\cout<<\分区大小:\cout<<\状 态:\if(p->data.state==Free) cout<<\空 闲\ 7 } } else cout<<\已分配\ p=p->next; 7)主 函 数 void main() { \ cout<<\动态分区分配方式的模拟一Initblock(); int choice; int i; for(i=0;;i++) { cout<<\ +++++++++++++++++\\n\ cout<<\首次适应算法 ++++++++++++++++++++++++\\n\ cout<<\cout<<\分配内存 2: 回收内存 ++\\n\cout<<\查看分配 0: 退 出 ++\\n\cout<<\cout<<\请输入您的操作:\cin>>choice; if(choice==1)// 分配内存 alloc(); else if(choice==2)// 内存回收 { int ID; cout<<\请输入您要释放的分区号:\ 8 } cin>>ID; } free(ID); } else if(choice==3)//显示主存 show(); else if(choice==0)//退出 break; else //输入操作有误 { } cout<<\输入有误,请重试!\continue; 6 调试分析 调试问题结果如图3所示 调试问题结果如图4所示 9