操作系统实验报告-可变分区存储管理方式的内存分配回收

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三可变分区存储管理方式的内存分配回收

一.实验目的

(1)深入了解可变分区存储管理方式的内存分配回收的实现。

二.实验内容

编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,

并采用最优适应算法完成内存的分配与回收。

三.实验原理

在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是

一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被

占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结

构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲

区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进

程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始

地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时

已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有

相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当一个作业撤离时,

可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均

为空闲区。尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于

存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。四.实验部分源程序

#include

usingnamespacestd;

typedefstructSNode{//SpaceNode

intstart,end;//起始,结束

intlength;//长度大小

structSNode*next;//指向下一结点的指针

}*SP;

SPHead=(SP)malloc(sizeof(SNode));//全局变量,内存空间头结voidDispSpace(){//显示内存空间分配情况

SPp=Head->next;

cout<<"\n空闲区说明表\n"

<<"---地址--长度---\n";

while(p)

{

cout<<""<start

<<""<length<

p=p->next;

}

cout<<"----------------\n";

}

voidInitial(){//初始化说明表

SPp,q;

p=(SP)malloc(sizeof(SNode));

q=(SP)malloc(sizeof(SNode));

p->start=14;p->length=12;p->end=26;

q->start=32;q->length=96;q->end=128;//指导书上的作业分配Head->next=p;//与头结点连接

p->next=q;

q->next=NULL;

DispSpace();

}

voidAllocation(intlen){//分配内存给新作业SPp=Head->next,q;

while(p)

{

if(p->length

p=p->next;

elseif(p->length>len)

{

p->start=p->start+len;

p->length=p->length-len;

cout<<"分配成功!\n";

DispSpace();return;

}

else

{//当两者长度相等

q=p->next;

p->next=q->next;

cout<<"分配成功!\n";

DispSpace();return;

}

}

cout<<"分配失败!\n";

DispSpace();return;

}

voidCallBack(intsta,intlen){//回收内存

SPp=Head,q=p->next,r;//开始地址和长度

p->end=0;

inten=sta+len;

while(q){

if(sta==0){//初始地址为0

if(en==q->start){//正好回收

q->start=0;

q->length=q->end;

return;

}

else{

r=(SP)malloc(sizeof(SNode));

r->start=sta;r->length=len;r->end=en;

p->next=r;

r->next=q;

return;

}

}

elseif((p->endstart>en)){//上邻区r=(SP)malloc(sizeof(SNode));

r->start=sta;r->length=len;r->end=en;

p->next=r;

r->next=q;

return;

}

elseif((p->endstart==en)){//邻区相接q->start=sta;

q->length=q->end-sta;

return;

}

elseif((p->end==sta)&&(q->startend=en;

p->length=en-p->start;

return;

}

elseif(p->end==sta&&q->start==en){//邻区相接

p->end=q->end;

p->length=p->end-p->start;

p->next=q->next;

return;

}

else{

p=p->next;

q=q->next;

}

相关文档
最新文档