实验三 可变分区存储管理方式的内存分配回收
一.实验目的
(1)深入了解可变分区存储管理方式的内存分配回收的实现。
二.实验内容
编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。
三.实验原理
在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。
四.实验部分源程序
#include
using namespace std;
typedef struct SNode { // Space Node
int start,end; // 起始,结束
int length; // 长度大小
struct SNode *next; // 指向下一结点的指针
}* SP;
SP Head=(SP)malloc(sizeof(SNode)); // 全局变量,内存空间头结void DispSpace() { // 显示内存空间分配情况
SP p=Head->next;
cout<<\空闲区说明表 \\n\
<<\地址--长度---\\n\
while (p)
{
cout<<\
<<\
p=p->next;
}
cout<<\
}
void Initial() { // 初始化说明表
SP p,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();
}
void Allocation(int len) { // 分配内存给新作业
SP p=Head->next,q;
while (p)
{
if (p->length < len)
p=p->next;
else if (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;
}
void CallBack(int sta,int len) { // 回收内存
SP p=Head,q=p->next,r; // 开始地址和长度
p->end=0;
int en=sta+len;
while (q) {
if (sta == 0) { // 初始地址为0
if (en == q->start) { // 正好回收
q->start=0;
q->length=q->end;
return;