-
大小: 982KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-06-02
- 語言: 其他
- 標(biāo)簽: 動態(tài)分區(qū)??
資源簡介
系統(tǒng)采用最佳適應(yīng)分配算法為作業(yè)分配主存空間,而且具有緊湊技術(shù)。請編程完成以下操作:
(1). 輸出此時的已分配區(qū)表和未分配區(qū)表;
(2). 裝入 Job3(15K),輸出主存分配后的已分配區(qū)表和未分配區(qū)表;
(3). 回收 Job2所占用的主存空間,輸出主存回收后的已分配區(qū)表和未分配區(qū)表;
(4).裝入 Job4(130K),輸出主存分配后的已分配區(qū)表和未分配區(qū)表。

代碼片段和文件信息
//內(nèi)存管理----最優(yōu)適應(yīng)分配算法
#include
#include
#include
#include
#define?MemSize??240??//定義內(nèi)存大小
#define?MemBassaddr?0??//定義內(nèi)存起始地址
using?namespace?std;
struct?freepartion//空閑分區(qū)結(jié)構(gòu)定義
{
????int?baseaddr;//空閑分區(qū)的起始地址
????int?partionlen;//空閑分區(qū)的長度
};
struct?usedpartion//已分配的內(nèi)存分區(qū)結(jié)構(gòu)定義
{
????string?jobname;//作業(yè)名
????int?baseaddr;??//作業(yè)所占分區(qū)的起始地址
int?partionlen;//作業(yè)所占分區(qū)的長度
};
listfreetable;//空閑分區(qū)表
listusedtable;//已分配分區(qū)表
void?AllocateMem(string?&jobnameint?&joblen)//采用最優(yōu)適應(yīng)分配算法為作業(yè)jobname分配joblen大小的空間
{
?//要分配的作業(yè)名不能為已存在的作業(yè)名
list::iterator?used=usedtable.begin();
while(used!=usedtable.end())
{
if(used->jobname==jobname)
{
cout<<“作業(yè)已存在不能再分配一個相同名的作業(yè)!“< return;
}
else
{
used++;
}
?}
?//最優(yōu)適應(yīng)分配算法
?list::iterator?it=freetable.begin();
?if(it==freetable.end())
?{
?????cout<<“空閑分區(qū)已用完!“< ?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)
?{
?????//修改已分配分區(qū)表
usedpartion?tempuse;
tempuse.baseaddr=itfreetmp->baseaddr;
tempuse.jobname=jobname;
tempuse.partionlen=joblen;
usedtable.push_back(tempuse);
????
??//從空閑區(qū)分配空間
if(itfreetmp->partionlen==joblen)
{
freetable.erase(itfreetmp);
}
else
{
itfreetmp->baseaddr=itfreetmp->baseaddr+joblen;
itfreetmp->partionlen=itfreetmp->partionlen-joblen;
}
cout<<“為作業(yè)“< return;
?}
?else
?{
????cout<<“內(nèi)存不足,為作業(yè)分配內(nèi)存失敗!“< ????return;
?}
}
void?ReclaimMem(string?jobname)//回收作業(yè)jobname所占的內(nèi)存
{??
list::iterator?itused=usedtable.begin();
list::iterator?itfree=freetable.begin();
freepartion?free;
while(itused!=usedtable.end())
{
if(itused->jobname==jobname)//找到要回收的作業(yè)
{
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))//下鄰空閑區(qū)
{
if(free.baseaddr+free.partionlen==ittmpup->baseaddr)//下鄰空閑區(qū)上鄰空閑區(qū)
{
ittmpdown->partionlen=ittmpdown->partionlen+free.partionlen+ittmpup->partionlen;
freetable.erase(ittmpup);//刪除上鄰空閑區(qū)
cout<<“回收作業(yè)所占的內(nèi)存成功!“< return;
}
else//下鄰空閑區(qū)但不上鄰空閑區(qū)
{
ittmpdown->partionlen=ittmpdown->partionlen+free.partionlen;
cout<<“回收作業(yè)所占的內(nèi)存成功!“< 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
評論
共有 條評論