• 大小: 982KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: 其他
  • 标签: 动态分区  

资源简介

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


评论

共有 条评论