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