内存的动态分区分配
實現分區存儲管理的內存分配功能,選擇適應算法(首次適應算法,最佳適應算法,最后適應算法,最壞適應算法)。 基本原理分析: 1) Best fit :將空閑分區按大小從小到大排序,從頭找到大小合適的分區。 2) Worst fit:將空閑分區按大小從大到小排序,從頭找到大小合適的分區。 3) First fit :將空閑分區按起始地址大小從小到大排序,…… 4) Last fit :將空閑分區按起始地址大小從大到小排序,……
程序源代碼: #include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#define? UM_OUTPUT???????? 1
#define? UM_FIRSTFIT?????? 2??
#define? UM_NEXTFIT??????? 3
#define? UM_BESTFIT??????? 4
#define? UM_WORSTFIT?????? 5
#define? dim(x) (sizeof(x)/sizeof(x[0])) class M_manage
{
private:
?int *space;
?int last;
?int MaxSize;
?int cursor;
?int G;
??????? Status free(int); //內存回收
public:
?M_manage(int size=1);
?~M_manage();
?void push_back(int x);
?void out_put();????????????????? //打印出內存中的空閑分區
?void sort_ascending();?????????? //對內存中的分區按從小到大進行排序
?void sort_descending();????????? // 對內存中的分區按從大到小進行排序
?void first_fit(int x_size);?????
?void next_fit(int x_size);
?void best_fit(int x_size);
?void worst_fit(int x_size);
??? //void quick_fit(int x_size);
}; void M_manage::worst_fit(int x_size)
{
?sort_descending();
??? if(space[0]>=x_size)
?{
??space[0]-=x_size;
??cout<< "內存分配成功" <<endl;
?}
?else
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;?
?}
} void M_manage::best_fit(int x_size)
{
?sort_ascending();
?int i = 0;
?while(i!=MaxSize && space[i]<x_size)
?{
??++i;
?}
?if(i==MaxSize)
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;
?}
?else
?{
??space[i]-=x_size;
??if(space[i]<=G)
??{
???space[i] = 0;
??}
??cout<<"內存分配成功"<<endl;
?}?
} void M_manage::next_fit(int x_size)
{
?int i = cursor+1;
?bool flag = true;
?while( flag && space[i]<x_size)
?{
??++i;
??if(i==MaxSize)
??{
???i = 0;
??}
??if(i == cursor+1)
??{
???flag = false;
??}
?}
?if(flag)
?{
??cursor = i;
??space[cursor] -= x_size;
??cout<<"內存分配成功"<<endl;
?}
?else
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;
?}
} void M_manage::first_fit(int x_size)
{
?int i = 0;
?while(i!=MaxSize && space[i]<x_size)
?{
??++i;
?}
?if(i==MaxSize)
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;
?}
?else
?{
??space[i]-=x_size;
??cout<<"內存分配成功"<<endl;
?}
}
void M_manage::sort_ascending()
{
?int i, j;
?int tem;
??? for(i=1; i!=MaxSize; ++i)
?{??
??if(space[i]<space[i-1])
??{
???tem = space[i];
??????????? j = i-1;
???do
???{
??????? space[j+1]?= space[j];
??????? --j;
???} while (j!=-1 && space[j]>tem);
???space[j+1] = tem;
??}?
?}
} void M_manage::sort_descending()
{
?int i, j;
?int tem;
??? for(i=1; i!=MaxSize; ++i)
?{??
??if(space[i]>space[i-1])
??{
???tem = space[i];
??????????? j = i-1;
???do
???{
????space[j+1]?= space[j];
????--j;
???} while (j!=-1 && space[j]<tem);
???space[j+1] = tem;
??}??
?}
} void M_manage::out_put()
{
?int count = 0;
?for(int i=0; i!=MaxSize; ++i)
?{
??if(space[i]!=0)
??{
???cout<<space[i]<<" ";
???++count;
??}
?}
?if(count == 0)
?{
??cout<< "內存使用率為100%,沒有空閑分區供分配";
?}
?cout<<endl;
} void M_manage::push_back(int x)
{
?space[++last] = x;
} M_manage::M_manage(int size)
{
?space = new int[size];
?MaxSize = size;
?last = -1;
?cursor = -1;
} M_manage::~M_manage()
{
?delete []space;
?last = -1;
?MaxSize = 0;
?cursor = -1;
?G = 0;
}
//-----------------------?? 主 存 回 收?? --------------------
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;
??????????????? p->next->next->prior=p;
??????????????? p->next=p->next->next;????????????
??????????? }
??????????????? break;
??????? }
??????? p=p->next;
??? }
??? return OK;
} / void print_M(M_manage* M)
{
?(*M).out_put();
} void Mfirst_fit(M_manage* M)
{
?int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
???cin>>n_size;
?}
?(*M).first_fit(n_size);
} void Mnext_fit(M_manage* M)
{
?int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
???cin>>n_size;
?}
?(*M).next_fit(n_size);
} void Mbest_fit(M_manage* M)
{
??? int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
??cin>>n_size;
?}
?(*M).best_fit(n_size);
} void Mworst_fit(M_manage* M)
{
?int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
???cin>>n_size;
?}
??? (*M).worst_fit(n_size);
}
/
struct MSGMAP_ENTRY
{
?int nMessage;
?void(*pfn)(M_manage* M);
}; MSGMAP_ENTRY _messageEntres[]=
{
???? UM_OUTPUT,????? print_M,
???? UM_FIRSTFIT,??? Mfirst_fit,
? UM_NEXTFIT,???? Mnext_fit,
? UM_BESTFIT,???? Mbest_fit,
? UM_WORSTFIT,??? Mworst_fit
};
void main()
{
?M_manage *my_M;
?int select=1;
?int n=0;
?cout<<"輸入內存空閑分區個數:";
?cin>>n;
?while(n<=0)
?{
??cout<< "內存空閑分區個數應為正數,請重新輸入:";
??cin>>n;
?}
?my_M = new M_manage(n);
?for(int i=0; i!=n; ++i)
?{
??int s=0;
??cout<<"輸入第"<<i+1<<"分區大小:";
??cin>>s;
??while(s<=0)
??{
???cout<< "分區大小應為正,請重新輸入" <<endl;
??????????? cout<<"輸入第"<<i+1<<"分區大小:";
????? cin>>s;
??}
??(*my_M).push_back(s);
?}
??? while(select!=0)
?{? cout<<"??????????????????????????????????????? "<<endl;
??? cout<<"?????????? 1.顯示空閑分區?????????????? "<<endl;
?????????? cout<<"?????????? 2.首次適應算法?????????????? "<<endl;
??? cout<<"?????????? 3.循環首次適應算法?????????? "<<endl;
??? cout<<"?????????? 4.最佳適應算法?????????????? "<<endl;
??? cout<<"?????????? 5.最壞適應算法?????????????? "<<endl;
??? cout<<"?????????? 0.退出?????????????????????? "<<endl; cout<<"請選擇分區分配算法:";
??? cin>>select;
??? for(int i=0; i<dim(_messageEntres); ++i)
??? {
???? if((_messageEntres[i]).nMessage == select)
???? {
????? (*_messageEntres[i].pfn)(my_M);
???? }???
??? }?
?}
}
程序源代碼: #include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#define? UM_OUTPUT???????? 1
#define? UM_FIRSTFIT?????? 2??
#define? UM_NEXTFIT??????? 3
#define? UM_BESTFIT??????? 4
#define? UM_WORSTFIT?????? 5
#define? dim(x) (sizeof(x)/sizeof(x[0])) class M_manage
{
private:
?int *space;
?int last;
?int MaxSize;
?int cursor;
?int G;
??????? Status free(int); //內存回收
public:
?M_manage(int size=1);
?~M_manage();
?void push_back(int x);
?void out_put();????????????????? //打印出內存中的空閑分區
?void sort_ascending();?????????? //對內存中的分區按從小到大進行排序
?void sort_descending();????????? // 對內存中的分區按從大到小進行排序
?void first_fit(int x_size);?????
?void next_fit(int x_size);
?void best_fit(int x_size);
?void worst_fit(int x_size);
??? //void quick_fit(int x_size);
}; void M_manage::worst_fit(int x_size)
{
?sort_descending();
??? if(space[0]>=x_size)
?{
??space[0]-=x_size;
??cout<< "內存分配成功" <<endl;
?}
?else
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;?
?}
} void M_manage::best_fit(int x_size)
{
?sort_ascending();
?int i = 0;
?while(i!=MaxSize && space[i]<x_size)
?{
??++i;
?}
?if(i==MaxSize)
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;
?}
?else
?{
??space[i]-=x_size;
??if(space[i]<=G)
??{
???space[i] = 0;
??}
??cout<<"內存分配成功"<<endl;
?}?
} void M_manage::next_fit(int x_size)
{
?int i = cursor+1;
?bool flag = true;
?while( flag && space[i]<x_size)
?{
??++i;
??if(i==MaxSize)
??{
???i = 0;
??}
??if(i == cursor+1)
??{
???flag = false;
??}
?}
?if(flag)
?{
??cursor = i;
??space[cursor] -= x_size;
??cout<<"內存分配成功"<<endl;
?}
?else
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;
?}
} void M_manage::first_fit(int x_size)
{
?int i = 0;
?while(i!=MaxSize && space[i]<x_size)
?{
??++i;
?}
?if(i==MaxSize)
?{
??cout<< "內存中沒有足夠空間可供分配" <<endl;
?}
?else
?{
??space[i]-=x_size;
??cout<<"內存分配成功"<<endl;
?}
}
void M_manage::sort_ascending()
{
?int i, j;
?int tem;
??? for(i=1; i!=MaxSize; ++i)
?{??
??if(space[i]<space[i-1])
??{
???tem = space[i];
??????????? j = i-1;
???do
???{
??????? space[j+1]?= space[j];
??????? --j;
???} while (j!=-1 && space[j]>tem);
???space[j+1] = tem;
??}?
?}
} void M_manage::sort_descending()
{
?int i, j;
?int tem;
??? for(i=1; i!=MaxSize; ++i)
?{??
??if(space[i]>space[i-1])
??{
???tem = space[i];
??????????? j = i-1;
???do
???{
????space[j+1]?= space[j];
????--j;
???} while (j!=-1 && space[j]<tem);
???space[j+1] = tem;
??}??
?}
} void M_manage::out_put()
{
?int count = 0;
?for(int i=0; i!=MaxSize; ++i)
?{
??if(space[i]!=0)
??{
???cout<<space[i]<<" ";
???++count;
??}
?}
?if(count == 0)
?{
??cout<< "內存使用率為100%,沒有空閑分區供分配";
?}
?cout<<endl;
} void M_manage::push_back(int x)
{
?space[++last] = x;
} M_manage::M_manage(int size)
{
?space = new int[size];
?MaxSize = size;
?last = -1;
?cursor = -1;
} M_manage::~M_manage()
{
?delete []space;
?last = -1;
?MaxSize = 0;
?cursor = -1;
?G = 0;
}
//-----------------------?? 主 存 回 收?? --------------------
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;
??????????????? p->next->next->prior=p;
??????????????? p->next=p->next->next;????????????
??????????? }
??????????????? break;
??????? }
??????? p=p->next;
??? }
??? return OK;
} / void print_M(M_manage* M)
{
?(*M).out_put();
} void Mfirst_fit(M_manage* M)
{
?int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
???cin>>n_size;
?}
?(*M).first_fit(n_size);
} void Mnext_fit(M_manage* M)
{
?int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
???cin>>n_size;
?}
?(*M).next_fit(n_size);
} void Mbest_fit(M_manage* M)
{
??? int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
??cin>>n_size;
?}
?(*M).best_fit(n_size);
} void Mworst_fit(M_manage* M)
{
?int n_size;
?cout<< "請輸入作業大小:";
?cin>>n_size;
?while(n_size<=0)
?{
??cout<<"作業大小應為正,請重新分配:";
???cin>>n_size;
?}
??? (*M).worst_fit(n_size);
}
/
struct MSGMAP_ENTRY
{
?int nMessage;
?void(*pfn)(M_manage* M);
}; MSGMAP_ENTRY _messageEntres[]=
{
???? UM_OUTPUT,????? print_M,
???? UM_FIRSTFIT,??? Mfirst_fit,
? UM_NEXTFIT,???? Mnext_fit,
? UM_BESTFIT,???? Mbest_fit,
? UM_WORSTFIT,??? Mworst_fit
};
void main()
{
?M_manage *my_M;
?int select=1;
?int n=0;
?cout<<"輸入內存空閑分區個數:";
?cin>>n;
?while(n<=0)
?{
??cout<< "內存空閑分區個數應為正數,請重新輸入:";
??cin>>n;
?}
?my_M = new M_manage(n);
?for(int i=0; i!=n; ++i)
?{
??int s=0;
??cout<<"輸入第"<<i+1<<"分區大小:";
??cin>>s;
??while(s<=0)
??{
???cout<< "分區大小應為正,請重新輸入" <<endl;
??????????? cout<<"輸入第"<<i+1<<"分區大小:";
????? cin>>s;
??}
??(*my_M).push_back(s);
?}
??? while(select!=0)
?{? cout<<"??????????????????????????????????????? "<<endl;
??? cout<<"?????????? 1.顯示空閑分區?????????????? "<<endl;
?????????? cout<<"?????????? 2.首次適應算法?????????????? "<<endl;
??? cout<<"?????????? 3.循環首次適應算法?????????? "<<endl;
??? cout<<"?????????? 4.最佳適應算法?????????????? "<<endl;
??? cout<<"?????????? 5.最壞適應算法?????????????? "<<endl;
??? cout<<"?????????? 0.退出?????????????????????? "<<endl; cout<<"請選擇分區分配算法:";
??? cin>>select;
??? for(int i=0; i<dim(_messageEntres); ++i)
??? {
???? if((_messageEntres[i]).nMessage == select)
???? {
????? (*_messageEntres[i].pfn)(my_M);
???? }???
??? }?
?}
}
轉載于:https://blog.51cto.com/2123484/432428
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 何为SOAP
- 下一篇: 日子过得真快,转眼就工作了4个月了