操作系统实验报告-可变分区存储管理方式的内存分配回收
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<<""<
<<""< 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->end r->start=sta;r->length=len;r->end=en; p->next=r; r->next=q; return; } elseif((p->end q->length=q->end-sta; return; } elseif((p->end==sta)&&(q->start 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; }