資源簡介
模擬實現動態可變分區存儲管理系統,內存資源的分配情況用一個單鏈表來表示,每一個節點表示一個可變分區,記錄有內存首地址、大小、使用情況等,模擬內存分配動態輸入構造空閑區表,鍵盤接收內存申請尺寸大小,根據申請,實施內存分配,并返回分配所得內存首址。分配完后,調整空閑區表,并顯示調整后的空閑區表和已占用的區表。如果分配失敗,返回分配失敗信息。模擬內存回收。根據空閑區表,從鍵盤接收回收區域的內存作業代號。回收區域,調整空閑區表,并顯示調整后的空閑區表。對于內存區間的分配,移出,合并就是相應的對鏈表節點信息進行修改,刪除和創建相應的節點。
在模擬實現動態可變分區存儲管理系統中用到的是“最佳適應算法”與“最壞適應算法”。所謂“最佳”是指每次為作業分配內存時,總是把滿足要求、又是最小的空閑分區分配給作業,避免“大材小用”。因此保證每次找到的總是空閑分區中最小適應的,但這樣會在儲存器中留下許多難以利用的小的空閑區。最壞適應分配算法是要掃描整個空閑分區表或鏈表,總是挑選最大的一個空閑分區割給作業使用。進入系統時我們需要內存首地址和大小這些初始化數據。成功后我們可以自由的使用首次適應算法與最佳適應算法對內存進行分配。內存經過一系列分配與回收后,系統的內存分配情況不再連續。首次適應算法與最佳適應算法的差異也就很容易的體現在分配時。動態可變分區存儲管理模擬系統采用最佳適應算法、最壞適應算法內存調度策略,對于采用不同調度算法,作業被分配到不同的內存區間。

代碼片段和文件信息
#include?
#include?
#include?
using?namespace?std;
typedef?struct?LNode//存儲資源表結構
{???
int?address; //首地址
int?size;?????????//內存分區大小
????int?state;???????//區間標記
???string?name;????????//裝入的作業號,
????LNode?*Next;
}LNode*lin_list;
void?Init(lin_list?&Lint?sizeint?add);?//初始化
void?Choice(lin_list?&L);??//選擇操作類型
void?Zuijia(lin_list?&L);?//添加作業zuijia
void?Zuihuai(lin_list?&L);?//添加作業zuihuai
void?Display(const?lin_list?L);?//顯示作業
void?Remove(const?lin_list?L);?//刪除作業
void?Combine(lin_list?&L);?//回收空閑空間
int?StoI(string?s)
{
int?i;
int?d?=?0;
for(i=0;?i {
if(s[i]<‘0‘?||?s[i]>‘9‘)
return?-1;
else
d?=?10*d?+?(s[i]?-?‘0‘);
}
return?d;
}
int?main()
{
lin_list?L=new?LNode;?
string?str;
????int?N?A;
cout<<“**************************動態可變分區存儲管理模擬系統*************************“< cout<<“輸入總內存大小:?“;
?loop1:?
cin>>str;
N?=?StoI(str);
if(N?==?-1)
{
cout<<“輸入有誤,請重新輸入內存大小:?“;
goto?loop1;
}
cout<<“請輸入內存首地址:?“;
loop2:
cin>>str;
???//?fflush(stdin);
????A?=?StoI(str);
if(A?==?-1)
{
cout<<“輸入有誤,請重新輸入內存首地址:?“;
goto?loop2;
}
????Init(LNA);//初始化大小為N首址為A的內存空間
????Display(L);
????Choice(L);????//進入功能選擇操作
return?0;
}
void?Init(lin_list?&Lint?sizeint?add)?//初始化
{
????lin_list?p?=?new?LNode;
p->address?=?add;
????p->size?=?size;
????p->state?=?0;
????p->name?=?‘0‘;
????p->Next?=?NULL;
????L->Next?=?p;
}
void?Choice(lin_list?&L)??//選擇操作類型
{
char?choice;
do{
cout<<“------------------------“< cout<<“1.用最佳適應算法添加作業“< ????????cout<<“2.用最壞適應算法添加作業“< ????????cout<<“3.將作業移出分配區間“< ????????cout<<“4.將相鄰空白區間合并“< cout<<“0.退出本程序“< cout<<“-----------------------“< ????????cout< ????????cin>>choice;
????????switch(choice)
????????{
case?‘1‘:
Zuijia(L);?break;
case?‘2‘:
Zuihuai(L);?break;????????
case?‘3‘:
Remove(L);?break;
case?‘4‘:
Combine(L);?break;
case?‘0‘:
exit(1);break;
default:
cout<<“輸入正確的選擇!“< break;
????????}
cout< ??????}while(1);
}
void?Zuijia(lin_list?&L)?//添加作業
{
????int?new_size;
????string?new_name;
????lin_list?p?=?L->Nextbest?=?NULL;
????cout<<“輸入新作業的名稱:“;
????cin>>new_name;
????cout<<“輸入新作業的大小:“;
????cin>>new_size;
while(1)
{
if(new_size<0)
{
cout<<“輸入錯誤?!!!!?“< cout< ????????cout<<“請重新輸入:“;
????cin>>new_size;
????cout< }
if(new_size>0)
break;
????}
while(p)//查找第一個滿足空間分配的節點
{
if(p->state==0?&&?p->size?>=?new_size)
{
best=p;
break;
}
p=p->Next;
}
if(!p)
{
cout<<“作業“< ????????cout< }
else{
p=L;
while(p)//查找最佳適應節點
{
if(p->state==0?&&?p->size?>=?new_size?&&?best->size?>?p->size)
{?
best=p;
}
????p=p->Next;
}
lin_list?q?=?new?LNode;
q->size?=?best->size-new_size;
q->address?=?best->address?+?n
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6073??2010-07-09?21:48??wang1\123.cpp
?????文件?????283703??2010-07-11?13:55??wang1\Debug\123.obj
?????文件?????110592??2010-07-09?21:48??wang1\Debug\vc60.pdb
?????文件?????553039??2010-07-11?13:55??wang1\Debug\wang1.exe
?????文件????1106944??2010-07-09?21:48??wang1\Debug\wang1.pdb
?????文件???????4270??2010-07-09?20:20??wang1\wang1.dsp
?????文件????????533??2010-07-09?19:35??wang1\wang1.dsw
?????文件??????41984??2010-07-11?13:58??wang1\wang1.ncb
?????文件??????48640??2010-07-11?13:58??wang1\wang1.opt
?????文件????????878??2010-07-11?13:55??wang1\wang1.plg
?????目錄??????????0??2011-07-02?21:53??wang1\Debug
?????目錄??????????0??2011-07-02?21:53??wang1
-----------?---------??----------?-----??----
??????????????2156656????????????????????12
- 上一篇:cbgh7t.docx
- 下一篇:FTD2XX.dll和oflash.exe
評論
共有 條評論