主存储器空间的分配和回收实验报告Word文档下载推荐.docx
- 文档编号:6559009
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:20
- 大小:661.63KB
主存储器空间的分配和回收实验报告Word文档下载推荐.docx
《主存储器空间的分配和回收实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《主存储器空间的分配和回收实验报告Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
26k
32k
512k
操作系统
作业1
作业3
空闲区
作业2
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:
起址
长度
状态
第一栏
14K
12K
未分配
第二栏
32K
96K
其中,起址-—指出一个空闲区的主存起始地址。
长度—-指出从起始地址开始的一个连续空闲的长度.
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区.
(2)当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:
一部分分给作业占用;
另一部分又成为一个较小的空闲区.为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
(3)采用最先适应算法(顺序分配算法)分配主存空间.
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。
当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中.
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况"
来代替。
(4)当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
(5)请按最先适应算法设计主存分配和回收的程序。
假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:
作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,
作业4申请30K,作业5申请40K,作业6申请60K,作业4释放30K。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。
四、算法流程图
五、源程序及注释
#include<
iostream〉
usingnamespacestd;
#include〈list〉//双向链表结构头文件
#defineResidue512//除系统占用内存外的剩余内存
#definefst_free0//第一块空闲区的起至地址
#definefst_size512//第一块空闲区的大小
#include〈stdio。
h>
#include〈stdlib.h〉//清屏函数头文件
classFree//定义空闲区类
{
public:
Free(){};
Free(ints,intl)
{
start=s;
length=l;
}
intget_free(intlength);
//成员函数获取空闲分区
voidfree_task(intstart,intlength);
friendvoidprint_free();
protected:
intstart;
intlength;
};
list〈Free*>
free_list;
//声明空闲分区表
intFree:
:
get_free(intsize)
{
intstart=-1;
list〈Free*〉:
:
iteratorit=free_list.begin();
//查找适当的空闲分区iterator:
迭代器(游标)提供一种方法访问一个容器
boolfind=false;
while(it!
=free_list。
end())
{
if((*it)—>
length〉=size)
{
find=true;
start=(*it)—〉start;
if((*it)—〉length>
size)//大于就分割把低地址分配出去
(*it)->
start+=size;
(*it)—〉length—=size;
}
else
free_list.erase(it);
//等于就从空闲分区中删掉
break;
//找到就跳出循环
it++;
}
returnstart;
}
voidFree:
free_task(intstart,intlength)
list<
Free*>
iteratorinit_it,last_it;
//查找要插入的位置
last_it=init_it;
list〈Free*〉:
iteratorit=free_list。
begin();
=free_list.end())
if((*it)-〉start>
start)break;
last_it=it;
boollink_prev=false;
boollink_next=false;
if(last_it!
=init_it)//有前一个时
if((*last_it)-〉start+(*last_it)—〉length==start)
link_prev=true;
if(it!
end())//有后一个时
if(start+length==(*it)-〉start)
link_next=true;
if(link_prev&&
link_next)//与前后都相连
(*last_it)-〉length+=length+(*it)->
length;
free_list。
erase(it);
elseif(link_prev)//只与前相连
(*last_it)->
length+=length;
elseif(link_next)//只与后相连
(*it)—〉start=start;
(*it)—>
length+=length;
else//前后都不相连
Free*fr=newFree(start,length);
free_list.insert(it,fr);
}
voidprint_free()
cout<
<
endl<
"
空闲区状态:
〈endl<
起始地址大小"
〈<
endl;
for(list<
begin();
it!
=free_list.end();
it++)
cout〈〈”"
(*it)-〉start〈<
”"
〈(*it)->
length〈<
cout〈<
______________________________________"
endl〈〈endl<
endl;
classTask:
publicFree//定义分配分区类
public:
Task()
{};
Task(intn,ints,intl):
Free(s,l)
name=n;
voiddo_request(intname,intlength);
voiddo_revoke(intname);
friendvoidprint_task();
protected:
intname;
};
list<
Task*>
task_list;
//分配可用起始地址
voidTask:
do_request(intname,intsize)
if(name==0)
cout〈<
"
申请不合法!
非法作业名!
<
endl〈<
endl;
return;
if(size〉Residue)
〈"
超出最大可用内存!
”〈<
return;
//查找是否已存在同名作业
Task*>
iteratorit=task_list.begin();
=task_list。
if((*it)—>
name==name)
break;
if(find)
”此作业已存在!
endl<
〈endl;
intstart=get_free(size);
//从空闲分区选择合适的空间
if(start==-1)//未找到合适空间
”系统内存不足!
作业等待!
”<
Task*ta=newTask(name,start,size);
task_list.push_back(ta);
cout〈〈"
作业申请内存成功!
”〈〈endl<
〈endl;
do_revoke(intname)
错误!
不能回收系统内存!
endl;
//查找要回收的作业是否存在
list〈Task*〉:
iteratorit=task_list.begin();
while(it!
=task_list.end())
find=true;
it++;
if(!
find)
”错误!
作业名不存在!
”〈〈endl;
;
free_task((*it)-〉start,(*it)->
length);
task_list。
erase(it);
回收作业占用内存成功!
〈endl;
voidprint_task()
〈”_____________________________________"
〈〈endl;
作业名称起始地址大小"
〈endl;
for(list〈Task*>
iteratorit=task_list。
it!
=task_list.end();
cout〈〈"
”〈<
name〈<
””<
〈(*it)—>
start<
〈””〈<
(*it)—〉length<
”_____________________________________"
intmain()
*******************************************"
主存储器空间的分配和回收"
〈〈endl;
”*******************************************”〈〈endl〈〈endl<
Free*fr1=newFree(fst_free,fst_size);
//把系统占用后剩余的内存空间计入空闲分区表
push_back(fr1);
print_free();
boolquit=false;
while(!
quit)
TaskT;
FreeF;
cout<
a。
申请内存b。
回收内存"
”c。
查看作业0.退出程序"
〈〈endl<
请选择:
;
charop;
cin>
〉op;
if(op=='
a’||op==’A’)
{
intname;
intsize;
请输入作业名及占用空间大小:
”;
cin〉>
name;
cin〉〉size;
T.do_request(name,size);
elseif(op=='
b'
||op=='
B'
)
{intname;
请输入要回收的作业名:
cin〉〉name;
T.do_revoke(name);
print_free();
elseif(op==’c’||op=='
C’)
print_task();
0'
非法操作!
〈〈endl;
charcon;
”继续(Y/N):
cin>
〉con;
if(con=='
n'
||con=='
N'
quit=true;
system(”cls”);
六、打印的程序运行时初值和运行结果
七、实验小结
模拟在可变分区管理方式下采用最先适应算法实现了主存分配和回收,整个程序由两个类构成其主体,空闲区类和申请空间类。
使的整个程序更结构化。
程序在编写过程中也遇到了很多问题,还好在查询各方面资料后都得以解决。
每一个的程序的编写成功都是一件不易的工程不仅是对能力的检测,也是对心态的检测。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 主存储器 空间 分配 回收 实验 报告