动态分区存储管理方式的主存分配回收文档格式.docx
《动态分区存储管理方式的主存分配回收文档格式.docx》由会员分享,可在线阅读,更多相关《动态分区存储管理方式的主存分配回收文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。
在试验中,采用顺序表形式,用数组模拟。
由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。
他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。
已分配区表中除了分区起始地址、长度外,也至少还有一项“标志”,如果是空闲栏目,内容为“空”,如果为某
#definem10
#definen10
struct
{floataddress;
floatlength;
intflag;
}used_table[n];
}free_table[m];
voidinitialize(void);
intdistribute(int,float);
intrecycle(int);
voidshow();
voidinitialize(void)
{
inta;
for(a=0;
a<
=n-1;
a++)
used_table[a].flag=0;
free_table[0].address=1000;
free_table[0].length=1024;
free_table[0].flag=1;
}
intdistribute(intprocess_name,floatneed_length)
inti,k=-1;
floatads,len;
intcount=0;
i=0;
while(i<
=m-1)
{
if(free_table[i].flag==1&
&
need_length<
=free_table[i].length)
{
count++;
if(count==1||free_table[i].length<
free_table[k].length)
k=i;
}
i=i+1;
}
if(k!
=-1)
{
if((free_table[k].length-need_length)<
=minsize)
{
free_table[k].flag=0;
ads=free_table[k].address;
len=free_table[k].length;
else
len=need_length;
free_table[k].address+=need_length;
free_table[k].length-=need_length;
i=0;
while(used_table[i].flag!
=0)
{i=i+1;
}
if(i<
=n-1)
used_table[i].address=ads;
used_table[i].length=len;
used_table[i].flag=process_name;
count1++;
else
if(free_table[k].flag==0)
{
free_table[k].flag=1;
free_table[k].address=ads;
free_table[k].length=len;
}
else
free_table[k].length+=len;
cout<
<
"
内存分配区已满,分配失败!
\n"
;
return0;
else
cout<
无法为该作业找到合适分区!
return0;
returnprocess_name;
intrecycle(intprocess_name)
inty=0;
floatrecycle_address,recycle_length;
inti,j,k;
intx;
while(y<
=n-1&
used_table[y].flag!
=process_name)
{y=y+1;
if(y<
{
recycle_address=used_table[y].address;
recycle_length=used_table[y].length;
used_table[y].flag=0;
count2++;
else
cout<
该作业不存在!
j=k=-1;
while(!
(i>
=m||(k!
=-1&
j!
=-1)))
if(free_table[i].flag==1)
{if((free_table[i].address+free_table[i].length)==recycle_address)
if((recycle_address+recycle_length)==free_table[i].address)
j=i;
=-1)
if(j!
=-1){
free_table[k].length+=free_table[j].length+recycle_length;
free_table[j].flag=0;
free_table[k].length+=recycle_length;
elseif(j!
free_table[j].length+=recycle_length;
free_table[j].address=recycle_address;
x=0;
while(free_table[x].flag!
=0)
x=x+1;
if(x<
=m-1)
free_table[x].length=recycle_length;
free_table[x].flag=1;
used_table[y].flag=process_name;
空闲区已满,回收失败!
voidshow()
cout<
空闲区\n"
for(inti=0;
i<
=count2;
i++)
地址:
free_table[i].address<
"
作业长度:
free_table[i].length<
状态:
free_table[i].flag<
endl;
已分配区\n"
for(intj=0;
j<
count1;
j++)
used_table[j].address<
used_table[j].length<
作业名:
used_table[j].flag<
voidmain()
intchoice;
intjob_name;
floatneed_memory;
boolexitFlag=false;
动态分区分配方式的模拟\n"
initialize();
while(!
exitFlag)
1:
分配内存2:
回收内存\n"
3:
查看分配0:
退出\n"
cin>
>
choice;
switch(choice)
case0:
exitFlag=true;
break;
case1:
请输入作业名和所需内存:
cin>
job_name>
need_memory;
distribute(job_name,need_memory);
case2:
intID;
请输入您要释放的分区号:
ID;
recycle(ID);
case3:
show();
break;
内存分配回收实现截图
(1)、假定系统内存分配表允许的最大作业项为10,当分配超过10时,提示“内存分配区已满,分配失败”。
(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在”。
(3)、当要释放某个作业时,将已分配表中此作业的标志置为‘0’,并在空闲区做相应登记。
五、总结
核心算法:
//最优分配算法实现的动态分区
//k用于定位在空闲表中选择的未分配栏
floatads,len;
//核心的查找条件,找到最优空闲区
=m-1)//循环找到最佳的空闲分区
=minsize)//整个分配
{//切割空闲区
//循环寻找内存分配表中标志为空栏目的项
=n-1)//找到,在已分配区表中登记一个表项
else//已分配区表长度不足
if(free_table[k].flag==0)//将已做的整个分配撤销
else//将已做的切割分配撤销
每一次的实践,都会有很大的收获。
决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。
在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。
再一个问题是回收时候的合并,对地址的修改不是很有把握。
着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。