实验三
可变分区存储管理方式的内存分配回收
一.实验目的
(
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<
"<start
<
"<length<
p=p->next;
}
cout<
}
void Initial() { //
初始化说明表