• 大小: 374KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-25
  • 语言: 其他
  • 标签:

资源简介

模拟实现动态可变分区存储管理系统,内存资源的分配情况用一个单链表来表示,每一个节点表示一个可变分区,记录有内存首地址、大小、使用情况等,模拟内存分配动态输入构造空闲区表,键盘接收内存申请尺寸大小,根据申请,实施内存分配,并返回分配所得内存首址。分配完后,调整空闲区表,并显示调整后的空闲区表和已占用的区表。如果分配失败,返回分配失败信息。模拟内存回收。根据空闲区表,从键盘接收回收区域的内存作业代号。回收区域,调整空闲区表,并显示调整后的空闲区表。对于内存区间的分配,移出,合并就是相应的对链表节点信息进行修改,删除和创建相应的节点。 在模拟实现动态可变分区存储管理系统中用到的是“最佳适应算法”与“最坏适应算法”。所谓“最佳”是指每次为作业分配内存时,总是把满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。因此保证每次找到的总是空闲分区中最小适应的,但这样会在储存器中留下许多难以利用的小的空闲区。最坏适应分配算法是要扫描整个空闲分区表或链表,总是挑选最大的一个空闲分区割给作业使用。进入系统时我们需要内存首地址和大小这些初始化数据。成功后我们可以自由的使用首次适应算法与最佳适应算法对内存进行分配。内存经过一系列分配与回收后,系统的内存分配情况不再连续。首次适应算法与最佳适应算法的差异也就很容易的体现在分配时。动态可变分区存储管理模拟系统采用最佳适应算法、最坏适应算法内存调度策略,对于采用不同调度算法,作业被分配到不同的内存区间。

资源截图

代码片段和文件信息

#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


评论

共有 条评论

相关资源