动态分区存储管理方式的主存分配回收文档格式.docx
- 文档编号:17409066
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:13
- 大小:84.48KB
动态分区存储管理方式的主存分配回收文档格式.docx
《动态分区存储管理方式的主存分配回收文档格式.docx》由会员分享,可在线阅读,更多相关《动态分区存储管理方式的主存分配回收文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。
他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。
已分配区表中除了分区起始地址、长度外,也至少还有一项“标志”,如果是空闲栏目,内容为“空”,如果为某个作业占用分区的登记项,内容为该作业的作业名;
空闲区表中除了分区起始地址、长度外,也要有一项“标志”,如果是
空闲栏目,内容为“空”,如果为某个空闲区的登记项,内容为“未分配”。
在实际系统中,
闲区表”
可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。
当作业要
求装入内存时,根据作业需要内存空间的大小查询内存中的各个空闲区,当从内存空间中
找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出
一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。
如果该
空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
四、实验结果
程序代码:
#inelude<
iostream.h>
iomanip.h>
floatminsize=5;
intcount1=0;
intcount2=0;
#definem10
#definen10
struct
{floataddress;
floatlength;
intflag;
}used_table[n];
}free_table[m];
voidinitialize(void);
intdistribute©
nt,float);
intrecycle©
nt);
voidshow();
voidinitialize(void)
{
inta;
for(a=0;
a<
=n-1;
a++)
used_table[a].flag=0;
free_table[0].address=1000;
free_table[O].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=O;
ads=free_table[k].address;
len=free_table[k].length;
else
len=need_length;
free_table[k].address+=need_length;
free_table[k]」ength-=need_length;
while(used_table[i].flag!
=O)
{i=i+1;
if(i<
=n-1)
used_table[i].address=ads;
used_table[i].length=len;
used_table[i].flag=process_name;
count1++;
if(free_table[k].flag==0)
free_table[k].flag=1;
free_table[k].address=ads;
free_table[k].length=len;
free_table[k].length+=len;
\n"
;
coutvv"
内存分配区已满,分配失败!
return0;
else{
cout<
<
"
无法为该作业找到合适分区!
\n"
returnprocess,name;
ntprocess,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_length=used_table[y].length;
used_table[y].flag=O;
count2++;
该作业不存在!
}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;
if(j!
=-1){
free_table[k].length+=free_table[j].length+recycle_length;
free_table[j].flag=O;
free_table[k].length+=recycle_length;
elseif(j!
free_table[j].length+=recycle_length;
free_table[j].address=recycle_address;
x=0;
x=x+1;
if(x<
free_table[x].length=recycle_length;
free_table[x].flag=1;
used_table[y].flag=process_name;
空闲区已满,回收失败!
}returnprocess_name;
voidshow()
空闲区\n"
for(inti=0;
i<
=count2;
i++)
vvfree_table[i].length<
"
状态:
vfree_table[i].flagv<
endl;
cout«
已分配区\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();
exitFlag)
cout<
1:
分配内存2:
回收内存\n"
3:
查看分配0:
退出\n"
cin>
>
choice;
switch(choice)
case0:
exitFlag=true;
break;
case1:
请输入作业名和所需内存:
job_name>
need_memory;
distribute(job_name,need_memory);
break;
case2:
intID;
请输入您要释放的分区号:
ID;
recycle(ID);
case3:
show();
内存分配回收实现截图
(1)假定系统内存分配表允许的最大作业项为10,当分配超过10时,提示
内存分配区已满,分配失败”。
+-■-+++++
++++++++++++++++++++++++++*++++++++++++空闲区*+*+++*
+++++++++++++++++++++++++++++++++++++++也址:
11M5作业长度:
83?
状态*丄
++++++++++++++++++++#+++++#++++++++++++
+++++++已分酉己区++++++
++4-+++++*+++++++++++++++++++++++#++++++
1=分配内存2:
回收内存
3=查看分配0:
&
出
i入您的操作’i
1125
工』乍业名和所需内存二
內存分已满,WOi
(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作
业不存在”
I*C:
\DocuMentsandSettiiLgs\Ad&
ini3trator1
++++++++-fr+++++++++++-fr++++++++-K++++-fr+H|-+
+++*+++闲区+++++++
0'
并在空闲
1二
■■4=+
态二
*
骨
9+
83++区
±
r分
W十己
+
+0+1234567891+
十各各各各各各各各各各
++业业业业业业业业业业++■
+B72MR05487
+1211221122+
♦虧虞虧«
:
處處険處M:
JS:
++/K咲±
长长±
长±
/K
++业业业业业业业业业业
HIJ....-1.1.■.-I.-1.t.■.-IJIt.■J..
也址’11S5
rill:
比±
lt:
Jh:
ilh:
此±
i]h:
如+世世也世也世也世世也+出i出-TVit-t出
(3)、当要释放某个作业时,将已分配表中此作业的标志置为‘
区做相应登记
**1:
-分配内存
2:
**3:
查看分配
险退出
请输入您要释放的分区号’2
1:
分配内存2:
头查看分杞吐退出
痔输入您的操作:
3
++++++>
闲区+4-+++++
+++++++++++++++++++4-+++++++++4-+++++++++态:
1态:
1
++++++++^++++++++++-4--1-+++++++++++-|-++++++
己分配区
五、总结
核心算法:
//最优分配算法实现的动态分区intdistribute©
ntprocess,name,floatneed_length)
//k用于定位在空闲表中选择的未分配栏
//核心的查找条件,找到最优空闲区
=m-1)//循环找到最佳的空闲分区
=free_table[i].length)count++;
if(count==1||free_table[i].length<
free_table[k].length)k=i;
}if(k!
if((free_table[k].length-need_length)v=minsize)//整个分配
{//切割空闲区
free_table[k].address+=need_length;
free_table[k]」ength-=need_length;
//循环寻找内存分配表中标志为空栏目的项
=n-1)//找到,在已分配区表中登记一个表项
used_table[i].length=len;
else//已分配区表长度不足
if(free_table[k].flag==0)//将已做的整个分配撤销
free_table[k].length=len;
else//将已做的切割分配撤销
free_table[k].length+=len;
内存分配区已满,分配失败!
returnprocess_name;
每一次的实践,都会有很大的收获。
决定做这个题目的时候,就针对此题要
解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。
在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。
再一个问题是回收时候的合并,对地址的修改不是很有把握。
着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 存储 管理 方式 主存 分配 回收