实验三 可变分区存储管理方式的内存分配回收
一.实验目的
(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
while (p)
{
cout
\"start
\"length
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
p=p->next;
else if (p->length > len)
{
p->start=p->start+len;
p->length=p->length-len;
cout
DispSpace(); return;
}
else
{//当两者长度相等
q=p->next;
p->next=q->next;
cout
DispSpace(); return;
}
}
cout
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;
}
else {
r=(SP)malloc(sizeof(SNode));
r->start=sta; r->length=len; r->end=en;
p->next=r;
r->next=q;
return;
}
}
else if ((p->end start > en)) { // 上邻区
r=(SP)malloc(sizeof(SNode));
r->start=sta; r->length=len; r->end=en;
p->next=r;
r->next=q;
return;
}
else if ((p->end start == en)) { // 邻区相接
q->start=sta;
q->length=q->end-sta;
return;
}
else if ((p->end == sta) && (q->start
p->end=en;
p->length=en-p->start;
return;
}
else if (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;
}
} } void main() {
Initial();
cout
Allocation(6); // 分配时参数只有长度
//--------指导书测试数据演示----------
cout
CallBack(10,4);
DispSpace();
cout
CallBack(26,6);
DispSpace();
//---------------演示结束-------------
system(\"pause\"); }
五.实验结果与体会
我的体会:
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告
操作系统实验报告(读者写着问题,时间片轮转算法,内存的分配,进程的调度)