資源簡介
系統采用最佳適應分配算法為作業分配主存空間,而且具有緊湊技術。請編程完成以下操作:
(1). 輸出此時的已分配區表和未分配區表;
(2). 裝入 Job3(15K),輸出主存分配后的已分配區表和未分配區表;
(3). 回收 Job2所占用的主存空間,輸出主存回收后的已分配區表和未分配區表;
(4).裝入 Job4(130K),輸出主存分配后的已分配區表和未分配區表。

代碼片段和文件信息
//內存管理----最優適應分配算法
#include
#include
#include
#include
#define?MemSize??240??//定義內存大小
#define?MemBassaddr?0??//定義內存起始地址
using?namespace?std;
struct?freepartion//空閑分區結構定義
{
????int?baseaddr;//空閑分區的起始地址
????int?partionlen;//空閑分區的長度
};
struct?usedpartion//已分配的內存分區結構定義
{
????string?jobname;//作業名
????int?baseaddr;??//作業所占分區的起始地址
int?partionlen;//作業所占分區的長度
};
listfreetable;//空閑分區表
listusedtable;//已分配分區表
void?AllocateMem(string?&jobnameint?&joblen)//采用最優適應分配算法為作業jobname分配joblen大小的空間
{
?//要分配的作業名不能為已存在的作業名
list::iterator?used=usedtable.begin();
while(used!=usedtable.end())
{
if(used->jobname==jobname)
{
cout<<“作業已存在不能再分配一個相同名的作業!“< return;
}
else
{
used++;
}
?}
?//最優適應分配算法
?list::iterator?it=freetable.begin();
?if(it==freetable.end())
?{
?????cout<<“空閑分區已用完!“< ?return;
?}
?list::iterator?itfreetmp=it;
?while(it!=freetable.end())
?{??
???????
?if(it->partionlen>=joblen)
{??
if(itfreetmp->partionlen>it->partionlen)
{
itfreetmp=it;
it++;
continue;
}
else?if(itfreetmp->partionlen {
????????????itfreetmp=it;
it++;
continue;
}
else
{
it++;
continue;
}
????}
else
{
it++;
}
?}//while
?if(itfreetmp->partionlen>=joblen)
?{
?????//修改已分配分區表
usedpartion?tempuse;
tempuse.baseaddr=itfreetmp->baseaddr;
tempuse.jobname=jobname;
tempuse.partionlen=joblen;
usedtable.push_back(tempuse);
????
??//從空閑區分配空間
if(itfreetmp->partionlen==joblen)
{
freetable.erase(itfreetmp);
}
else
{
itfreetmp->baseaddr=itfreetmp->baseaddr+joblen;
itfreetmp->partionlen=itfreetmp->partionlen-joblen;
}
cout<<“為作業“< return;
?}
?else
?{
????cout<<“內存不足,為作業分配內存失敗!“< ????return;
?}
}
void?ReclaimMem(string?jobname)//回收作業jobname所占的內存
{??
list::iterator?itused=usedtable.begin();
list::iterator?itfree=freetable.begin();
freepartion?free;
while(itused!=usedtable.end())
{
if(itused->jobname==jobname)//找到要回收的作業
{
free.baseaddr=itused->baseaddr;
free.partionlen=itused->partionlen;
usedtable.erase(itused);
if(itfree!=freetable.end())
{
list::iterator?ittmpdown=itfree;
list::iterator?ittmpup=++itfree;
while(ittmpup!=freetable.end())
{
if(free.baseaddr==(ittmpdown->baseaddr+ittmpdown->partionlen))//下鄰空閑區
{
if(free.baseaddr+free.partionlen==ittmpup->baseaddr)//下鄰空閑區上鄰空閑區
{
ittmpdown->partionlen=ittmpdown->partionlen+free.partionlen+ittmpup->partionlen;
freetable.erase(ittmpup);//刪除上鄰空閑區
cout<<“回收作業所占的內存成功!“< return;
}
else//下鄰空閑區但不上鄰空閑區
{
ittmpdown->partionlen=ittmpdown->partionlen+free.partionlen;
cout<<“回收作業所占的內存成功!“< return;
???????
}
???
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????573497??2017-11-16?15:27??Manage\Debug\Manage.exe
?????文件?????828488??2017-11-16?15:27??Manage\Debug\Manage.ilk
?????文件?????326908??2017-11-16?15:27??Manage\Debug\Manage.obj
?????文件????2423976??2017-11-16?14:38??Manage\Debug\Manage.pch
?????文件????1164288??2017-11-16?15:27??Manage\Debug\Manage.pdb
?????文件??????91136??2017-11-16?15:27??Manage\Debug\vc60.idb
?????文件?????135168??2017-11-16?15:27??Manage\Debug\vc60.pdb
?????文件???????8017??2017-11-16?15:38??Manage\Manage.cpp
?????文件???????4284??2017-11-09?16:20??Manage\Manage.dsp
?????文件????????520??2017-11-09?16:06??Manage\Manage.dsw
?????文件??????41984??2017-11-16?15:38??Manage\Manage.ncb
?????文件??????53760??2017-11-16?15:38??Manage\Manage.opt
?????文件???????1282??2017-11-16?15:28??Manage\Manage.plg
?????目錄??????????0??2017-11-16?15:27??Manage\Debug
?????目錄??????????0??2017-11-16?15:38??Manage
-----------?---------??----------?-----??----
??????????????5653308????????????????????15
評論
共有 條評論