动态分区存储管理方式的主存分配回收文档格式.docx

上传人:b****5 文档编号:20875143 上传时间:2023-01-26 格式:DOCX 页数:14 大小:127.77KB
下载 相关 举报
动态分区存储管理方式的主存分配回收文档格式.docx_第1页
第1页 / 共14页
动态分区存储管理方式的主存分配回收文档格式.docx_第2页
第2页 / 共14页
动态分区存储管理方式的主存分配回收文档格式.docx_第3页
第3页 / 共14页
动态分区存储管理方式的主存分配回收文档格式.docx_第4页
第4页 / 共14页
动态分区存储管理方式的主存分配回收文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

动态分区存储管理方式的主存分配回收文档格式.docx

《动态分区存储管理方式的主存分配回收文档格式.docx》由会员分享,可在线阅读,更多相关《动态分区存储管理方式的主存分配回收文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

动态分区存储管理方式的主存分配回收文档格式.docx

这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。

在试验中,采用顺序表形式,用数组模拟。

由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。

他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。

已分配区表中除了分区起始地址、长度外,也至少还有一项“标志”,如果是空闲栏目,内容为“空”,如果为某

#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//将已做的切割分配撤销

每一次的实践,都会有很大的收获。

决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。

在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。

再一个问题是回收时候的合并,对地址的修改不是很有把握。

着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1