资源简介
系统采用最佳适应分配算法为作业分配主存空间,而且具有紧凑技术。请编程完成以下操作:
(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
评论
共有 条评论