实验五动态分区存储管理Word下载.docx
- 文档编号:8335983
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:11
- 大小:18.51KB
实验五动态分区存储管理Word下载.docx
《实验五动态分区存储管理Word下载.docx》由会员分享,可在线阅读,更多相关《实验五动态分区存储管理Word下载.docx(11页珍藏版)》请在冰点文库上搜索。
内存的回收:
在动态分区方式下回收内存空间时,先检查是否有与归还区相邻的空闲区(上邻空闲区,下邻空闲区)。
若有,则将它们合件成一个空闲区。
程序实现时,首先将要释放的作业在“内存分配表”中的记录项的标志改为“0”(空栏目),然后检查“空闲区表”中标志为‘1’(未分配)的栏目,查找是否有相邻的空闲区,若有,将之合并,并修改空闲区的起始地址和长度。
四、数据结构定义
(1)已分配表的定义:
struct
{floataddress;
//已分分区起始地址
floatlength;
//已分分区长度,单位为字节
intflag;
//已分配区表登记栏标志,"
0"
表示空栏目,实验中只支持一个字符的作业名
}used_table[n];
//已分配区表
(2)空闲分区表的定义:
//空闲区起始地址
//空闲区长度,单位为字节
//空闲区表登记栏标志,用"
表示空栏目,用"
1"
表示未分配
}free_table[m];
//空闲区表
(3)全局变量
floatminsize=5;
#definen10//假定系统允许的最大作业数量为n
#definem10//假定系统允许的空闲区表最大为m
五、源程序代码
#include<
iostream.h>
iomanip.h>
//全局变量
intcount1=0;
intcount2=0;
#defineM10//假定系统允许的空闲区表最大为m
#defineN10//假定系统允许的最大作业数量为n
//已分配表的定义
表示空栏目
}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;
//k用于定位在空闲表中选择的未分配栏
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;
//j栏是下邻空闲区,k栏是上栏空闲区
intx;
//在内存分配表中找到要回收的作业
while(y<
=N-1&
used_table[y].flag!
=process_name)
{y=y+1;
if(y<
=N-1)//找到作业后,将该栏的标志置为'
0'
{
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;
//判断是否有下邻接
i=i+1;
//合并空闲区
=-1)//回收区有上邻接
if(j!
=-1){//回收区也有下邻接,和上下邻接合并
free_table[k].length+=free_table[j].length+recycle_length;
free_table[j].flag=0;
//将第j栏的标记置为'
else//不存在下邻接,和上邻接合并
free_table[k].length+=recycle_length;
elseif(j!
{//只有下邻接,和下邻接合并
free_table[j].length+=recycle_length;
free_table[j].address=recycle_address;
else
{//上下邻接都没有
x=0;
while(free_table[x].flag!
=0)
x=x+1;
//在空闲区表中查找一个状态为'
的栏目
if(x<
=M-1)
{//找到后,在空闲分区中登记回收的内存
free_table[x].address=recycle_address;
free_table[x].length=recycle_length;
free_table[x].flag=1;
{//空闲表已满,执行回收失败
used_table[y].flag=process_name;
空闲区已满,回收失败!
voidshow()//程序执行时输出模拟的内存分配回收表
cout<
+++++++++++++++++++++++++++++++++++++++\n"
+++++++空闲区+++++++\n"
for(inti=0;
i<
=count2;
i++)
if(free_table[i].flag!
初始地址:
free_table[i].address<
"
长度:
free_table[i].length<
状态:
free_table[i].flag<
endl;
+++++++已分配区++++++\n"
for(intj=0;
j<
count1;
j++)
if(used_table[j].flag!
used_table[j].address<
used_table[j].length<
作业名:
used_table[j].flag<
voidmain()//主函数调用各功能函数对所有工作进行测试
intchoice;
//用来选择将要进行的操作
intjob_name;
floatneed_memory;
boolexitFlag=false;
动态分区分配方式的模拟\n"
************************************\n"
请选择操作类型:
initialize();
//开创空闲区和已分配区两个表
while(!
exitFlag)
********************************************\n"
**1:
分配内存2:
回收内存**\n"
**3:
查看分配0:
退出**\n"
请输入您的操作:
cin>
>
choice;
switch(choice)
case0:
exitFlag=true;
//退出操作
break;
case1:
请输入作业号和所需内存:
cin>
job_name>
need_memory;
if(job_name!
=0&
need_memory!
distribute(job_name,need_memory);
//分配内存
elseif(job_name==0)
cout<
作业号不能为零!
\n请重新选择操作:
elseif(need_memory==0)
内存分配数不能为零!
case2:
intID;
请输入您要释放的作业号:
ID;
if(ID!
recycle(ID);
//回收内存
else
作业名不能为零!
case3:
show();
break;
六、实验结果分析
1.运行源程序,模拟内存的分配与回收操作,并记录实验结果。
2.简要分析distribute函数和recycle函数的执行流程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 动态 分区 存储 管理