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\
cout<<\ DuLNode *p=block_first->next; cout<<\分区号\\t起始地址\\t分区大小\\t状态\\n\\n\ while(p) {
cout<<\ \
cout<<\ \ cout<<\
if(p->data.state==Free) cout<<\空闲\\n\\n\ else cout<<\已分配\\n\\n\ p=p->next; }
cout<<\}
//主函数 void main() {
int ch;//算法选择标记
cout<<\请输入所使用的内存分配算法:\\n\
cout<<\首次适应算法\\n(2)最佳适应算法\\n(3)最差适应算法\\n\
cin>>ch; while(ch<1||ch>3) {
}
cout<<\输入错误,请重新输入所使用的内存分配算法:\\n\cin>>ch;
Initblock(); //开创空间表 int choice; //操作选择标记
while(1) { show(); cout<<\请输入您的操作:\
cout<<\分配内存\\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<<\输入有误,请重试!\ continue; } } }
结果:
首次适应算法(First Fit):
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
循环首次适应算法(Next Fit):
该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
最佳适应算法(Best Fit):
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
最坏适应算法(worst fit)
最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求。